ETH Price: $3,163.56 (-8.85%)

Contract

0xC8ee91A54287DB53897056e12D9819156D3822Fb

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
0x60a060401077377562023-07-04 8:48:15387 days ago1688460495IN
 Create: EventEmitter
0 ETH0.000770330.1

Parent Transaction Hash Block From To
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EventEmitter

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion
File 1 of 8 : EventEmitter.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "../role/RoleModule.sol";
import "./EventUtils.sol";

// @title EventEmitter
// @dev Contract to emit events
// This allows main events to be emitted from a single contract
// Logic contracts can be updated while re-using the same eventEmitter contract
// Peripheral services like monitoring or analytics would be able to continue
// to work without an update and without segregating historical data
contract EventEmitter is RoleModule {
    event EventLog(
        address msgSender,
        string eventName,
        string indexed eventNameHash,
        EventUtils.EventLogData eventData
    );

    event EventLog1(
        address msgSender,
        string eventName,
        string indexed eventNameHash,
        bytes32 indexed topic1,
        EventUtils.EventLogData eventData
    );

    event EventLog2(
        address msgSender,
        string eventName,
        string indexed eventNameHash,
        bytes32 indexed topic1,
        bytes32 indexed topic2,
        EventUtils.EventLogData eventData
    );

    constructor(RoleStore _roleStore) RoleModule(_roleStore) {}

    // @dev emit a general event log
    // @param eventName the name of the event
    // @param eventData the event data
    function emitEventLog(
        string memory eventName,
        EventUtils.EventLogData memory eventData
    ) external onlyController {
        emit EventLog(
            msg.sender,
            eventName,
            eventName,
            eventData
        );
    }

    // @dev emit a general event log
    // @param eventName the name of the event
    // @param topic1 topic1 for indexing
    // @param eventData the event data
    function emitEventLog1(
        string memory eventName,
        bytes32 topic1,
        EventUtils.EventLogData memory eventData
    ) external onlyController {
        emit EventLog1(
            msg.sender,
            eventName,
            eventName,
            topic1,
            eventData
        );
    }

    // @dev emit a general event log
    // @param eventName the name of the event
    // @param topic1 topic1 for indexing
    // @param topic2 topic2 for indexing
    // @param eventData the event data
    function emitEventLog2(
        string memory eventName,
        bytes32 topic1,
        bytes32 topic2,
        EventUtils.EventLogData memory eventData
    ) external onlyController {
        emit EventLog2(
            msg.sender,
            eventName,
            eventName,
            topic1,
            topic2,
            eventData
        );
    }
    // @dev event log for general use
    // @param topic1 event topic 1
    // @param data additional data
    function emitDataLog1(bytes32 topic1, bytes memory data) external onlyController {
        uint256 len = data.length;
        assembly {
            log1(add(data, 32), len, topic1)
        }
    }

    // @dev event log for general use
    // @param topic1 event topic 1
    // @param topic2 event topic 2
    // @param data additional data
    function emitDataLog2(bytes32 topic1, bytes32 topic2, bytes memory data) external onlyController {
        uint256 len = data.length;
        assembly {
            log2(add(data, 32), len, topic1, topic2)
        }
    }

    // @dev event log for general use
    // @param topic1 event topic 1
    // @param topic2 event topic 2
    // @param topic3 event topic 3
    // @param data additional data
    function emitDataLog3(bytes32 topic1, bytes32 topic2, bytes32 topic3, bytes memory data) external onlyController {
        uint256 len = data.length;
        assembly {
            log3(add(data, 32), len, topic1, topic2, topic3)
        }
    }

    // @dev event log for general use
    // @param topic1 event topic 1
    // @param topic2 event topic 2
    // @param topic3 event topic 3
    // @param topic4 event topic 4
    // @param data additional data
    function emitDataLog4(bytes32 topic1, bytes32 topic2, bytes32 topic3, bytes32 topic4, bytes memory data) external onlyController {
        uint256 len = data.length;
        assembly {
            log4(add(data, 32), len, topic1, topic2, topic3, topic4)
        }
    }
}

File 2 of 8 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 3 of 8 : Errors.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

library Errors {
    // AdlUtils errors
    error InvalidSizeDeltaForAdl(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);
    error AdlNotEnabled();

    // Bank errors
    error SelfTransferNotSupported(address receiver);
    error InvalidNativeTokenSender(address msgSender);

    // CallbackUtils errors
    error MaxCallbackGasLimitExceeded(uint256 callbackGasLimit, uint256 maxCallbackGasLimit);

    // Config errors
    error InvalidBaseKey(bytes32 baseKey);
    error InvalidFeeFactor(bytes32 baseKey, uint256 value);

    // Timelock errors
    error ActionAlreadySignalled();
    error ActionNotSignalled();
    error SignalTimeNotYetPassed(uint256 signalTime);
    error InvalidTimelockDelay(uint256 timelockDelay);
    error MaxTimelockDelayExceeded(uint256 timelockDelay);
    error InvalidFeeReceiver(address receiver);
    error InvalidOracleSigner(address receiver);

    // DepositStoreUtils errors
    error DepositNotFound(bytes32 key);

    // DepositUtils errors
    error EmptyDeposit();
    error EmptyDepositAmounts();

    // ExecuteDepositUtils errors
    error MinMarketTokens(uint256 received, uint256 expected);
    error EmptyDepositAmountsAfterSwap();
    error InvalidPoolValueForDeposit(int256 poolValue);
    error InvalidSwapOutputToken(address outputToken, address expectedOutputToken);

    // AdlHandler errors
    error AdlNotRequired(int256 pnlToPoolFactor, uint256 maxPnlFactorForAdl);
    error InvalidAdl(int256 nextPnlToPoolFactor, int256 pnlToPoolFactor);
    error PnlOvercorrected(int256 nextPnlToPoolFactor, uint256 minPnlFactorForAdl);

    // ExchangeUtils errors
    error RequestNotYetCancellable(uint256 requestAge, uint256 requestExpirationAge, string requestType);

    // OrderHandler errors
    error OrderNotUpdatable(uint256 orderType);
    error InvalidKeeperForFrozenOrder(address keeper);

    // FeatureUtils errors
    error DisabledFeature(bytes32 key);

    // FeeHandler errors
    error InvalidClaimFeesInput(uint256 marketsLength, uint256 tokensLength);

    // GasUtils errors
    error InsufficientExecutionFee(uint256 minExecutionFee, uint256 executionFee);
    error InsufficientWntAmountForExecutionFee(uint256 wntAmount, uint256 executionFee);
    error InsufficientExecutionGas(uint256 startingGas, uint256 minHandleErrorGas);

    // MarketFactory errors
    error MarketAlreadyExists(bytes32 salt, address existingMarketAddress);

    // MarketStoreUtils errors
    error MarketNotFound(address key);

    // MarketUtils errors
    error EmptyMarket();
    error DisabledMarket(address market);
    error MaxSwapPathLengthExceeded(uint256 swapPathLengh, uint256 maxSwapPathLength);
    error InsufficientPoolAmount(uint256 poolAmount, uint256 amount);
    error InsufficientReserve(uint256 reservedUsd, uint256 maxReservedUsd);
    error InsufficientReserveForOpenInterest(uint256 reservedUsd, uint256 maxReservedUsd);
    error UnableToGetOppositeToken(address inputToken, address market);
    error UnexpectedTokenForVirtualInventory(address token, address market);
    error EmptyMarketTokenSupply();
    error InvalidSwapMarket(address market);
    error UnableToGetCachedTokenPrice(address token, address market);
    error CollateralAlreadyClaimed(uint256 adjustedClaimableAmount, uint256 claimedAmount);
    error OpenInterestCannotBeUpdatedForSwapOnlyMarket(address market);
    error MaxOpenInterestExceeded(uint256 openInterest, uint256 maxOpenInterest);
    error MaxPoolAmountExceeded(uint256 poolAmount, uint256 maxPoolAmount);
    error UnexpectedBorrowingFactor(uint256 positionBorrowingFactor, uint256 cumulativeBorrowingFactor);
    error UnableToGetBorrowingFactorEmptyPoolUsd();
    error UnableToGetFundingFactorEmptyOpenInterest();
    error InvalidPositionMarket(address market);
    error InvalidCollateralTokenForMarket(address market, address token);
    error PnlFactorExceededForLongs(int256 pnlToPoolFactor, uint256 maxPnlFactor);
    error PnlFactorExceededForShorts(int256 pnlToPoolFactor, uint256 maxPnlFactor);
    error InvalidUiFeeFactor(uint256 uiFeeFactor, uint256 maxUiFeeFactor);
    error EmptyAddressInMarketTokenBalanceValidation(address market, address token);
    error InvalidMarketTokenBalance(address market, address token, uint256 balance, uint256 expectedMinBalance);
    error InvalidMarketTokenBalanceForCollateralAmount(address market, address token, uint256 balance, uint256 collateralAmount);
    error InvalidMarketTokenBalanceForClaimableFunding(address market, address token, uint256 balance, uint256 claimableFundingFeeAmount);
    error UnexpectedPoolValue(int256 poolValue);

    // Oracle errors
    error EmptySigner(uint256 signerIndex);
    error InvalidBlockNumber(uint256 minOracleBlockNumber, uint256 currentBlockNumber);
    error InvalidMinMaxBlockNumber(uint256 minOracleBlockNumber, uint256 maxOracleBlockNumber);
    error MaxPriceAgeExceeded(uint256 oracleTimestamp, uint256 currentTimestamp);
    error MinOracleSigners(uint256 oracleSigners, uint256 minOracleSigners);
    error MaxOracleSigners(uint256 oracleSigners, uint256 maxOracleSigners);
    error BlockNumbersNotSorted(uint256 minOracleBlockNumber, uint256 prevMinOracleBlockNumber);
    error MinPricesNotSorted(address token, uint256 price, uint256 prevPrice);
    error MaxPricesNotSorted(address token, uint256 price, uint256 prevPrice);
    error EmptyPriceFeedMultiplier(address token);
    error InvalidFeedPrice(address token, int256 price);
    error PriceFeedNotUpdated(address token, uint256 timestamp, uint256 heartbeatDuration);
    error MaxSignerIndex(uint256 signerIndex, uint256 maxSignerIndex);
    error InvalidOraclePrice(address token);
    error InvalidSignerMinMaxPrice(uint256 minPrice, uint256 maxPrice);
    error InvalidMedianMinMaxPrice(uint256 minPrice, uint256 maxPrice);
    error DuplicateTokenPrice(address token);
    error NonEmptyTokensWithPrices(uint256 tokensWithPricesLength);
    error EmptyPriceFeed(address token);
    error PriceAlreadySet(address token, uint256 minPrice, uint256 maxPrice);
    error MaxRefPriceDeviationExceeded(
        address token,
        uint256 price,
        uint256 refPrice,
        uint256 maxRefPriceDeviationFactor
    );

    // OracleModule errors
    error InvalidPrimaryPricesForSimulation(uint256 primaryTokensLength, uint256 primaryPricesLength);
    error EndOfOracleSimulation();

    // OracleUtils errors
    error EmptyCompactedPrice(uint256 index);
    error EmptyCompactedBlockNumber(uint256 index);
    error EmptyCompactedTimestamp(uint256 index);
    error InvalidSignature(address recoveredSigner, address expectedSigner);

    error EmptyPrimaryPrice(address token);

    error OracleBlockNumbersAreSmallerThanRequired(uint256[] oracleBlockNumbers, uint256 expectedBlockNumber);
    error OracleBlockNumberNotWithinRange(
        uint256[] minOracleBlockNumbers,
        uint256[] maxOracleBlockNumbers,
        uint256 blockNumber
    );

    // BaseOrderUtils errors
    error EmptyOrder();
    error UnsupportedOrderType();
    error InvalidOrderPrices(
        uint256 primaryPriceMin,
        uint256 primaryPriceMax,
        uint256 triggerPrice,
        uint256 orderType
    );
    error EmptySizeDeltaInTokens();
    error PriceImpactLargerThanOrderSize(int256 priceImpactUsd, uint256 sizeDeltaUsd);
    error NegativeExecutionPrice(int256 executionPrice, uint256 price, uint256 positionSizeInUsd, int256 priceImpactUsd, uint256 sizeDeltaUsd);
    error OrderNotFulfillableAtAcceptablePrice(uint256 price, uint256 acceptablePrice);

    // IncreaseOrderUtils errors
    error UnexpectedPositionState();

    // OrderUtils errors
    error OrderTypeCannotBeCreated(uint256 orderType);
    error OrderAlreadyFrozen();

    // OrderStoreUtils errors
    error OrderNotFound(bytes32 key);

    // SwapOrderUtils errors
    error UnexpectedMarket();

    // DecreasePositionCollateralUtils errors
    error InsufficientFundsToPayForCosts(uint256 remainingCostUsd, string step);
    error InvalidOutputToken(address tokenOut, address expectedTokenOut);

    // DecreasePositionUtils errors
    error InvalidDecreaseOrderSize(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);
    error UnableToWithdrawCollateral(int256 estimatedRemainingCollateralUsd);
    error InvalidDecreasePositionSwapType(uint256 decreasePositionSwapType);
    error PositionShouldNotBeLiquidated();

    // IncreasePositionUtils errors
    error InsufficientCollateralAmount(uint256 collateralAmount, int256 collateralDeltaAmount);
    error InsufficientCollateralUsd(int256 remainingCollateralUsd);

    // PositionStoreUtils errors
    error PositionNotFound(bytes32 key);

    // PositionUtils errors
    error LiquidatablePosition(string reason);
    error EmptyPosition();
    error InvalidPositionSizeValues(uint256 sizeInUsd, uint256 sizeInTokens);
    error MinPositionSize(uint256 positionSizeInUsd, uint256 minPositionSizeUsd);

    // PositionPricingUtils errors
    error UsdDeltaExceedsLongOpenInterest(int256 usdDelta, uint256 longOpenInterest);
    error UsdDeltaExceedsShortOpenInterest(int256 usdDelta, uint256 shortOpenInterest);

    // SwapPricingUtils errors
    error UsdDeltaExceedsPoolValue(int256 usdDelta, uint256 poolUsd);

    // RoleModule errors
    error Unauthorized(address msgSender, string role);

    // RoleStore errors
    error ThereMustBeAtLeastOneRoleAdmin();
    error ThereMustBeAtLeastOneTimelockMultiSig();

    // ExchangeRouter errors
    error InvalidClaimFundingFeesInput(uint256 marketsLength, uint256 tokensLength);
    error InvalidClaimCollateralInput(uint256 marketsLength, uint256 tokensLength, uint256 timeKeysLength);
    error InvalidClaimAffiliateRewardsInput(uint256 marketsLength, uint256 tokensLength);
    error InvalidClaimUiFeesInput(uint256 marketsLength, uint256 tokensLength);

    // SwapUtils errors
    error InvalidTokenIn(address tokenIn, address market);
    error InsufficientOutputAmount(uint256 outputAmount, uint256 minOutputAmount);
    error InsufficientSwapOutputAmount(uint256 outputAmount, uint256 minOutputAmount);
    error DuplicatedMarketInSwapPath(address market);
    error SwapPriceImpactExceedsAmountIn(uint256 amountAfterFees, int256 negativeImpactAmount);

    // TokenUtils errors
    error EmptyTokenTranferGasLimit(address token);
    error TokenTransferError(address token, address receiver, uint256 amount);
    error EmptyHoldingAddress();

    // AccountUtils errors
    error EmptyAccount();
    error EmptyReceiver();

    // Array errors
    error CompactedArrayOutOfBounds(
        uint256[] compactedValues,
        uint256 index,
        uint256 slotIndex,
        string label
    );

    error ArrayOutOfBoundsUint256(
        uint256[] values,
        uint256 index,
        string label
    );

    error ArrayOutOfBoundsBytes(
        bytes[] values,
        uint256 index,
        string label
    );

    // WithdrawalStoreUtils errors
    error WithdrawalNotFound(bytes32 key);

    // WithdrawalUtils errors
    error EmptyWithdrawal();
    error EmptyWithdrawalAmount();
    error MinLongTokens(uint256 received, uint256 expected);
    error MinShortTokens(uint256 received, uint256 expected);
    error InsufficientMarketTokens(uint256 balance, uint256 expected);
    error InsufficientWntAmount(uint256 wntAmount, uint256 executionFee);
    error InvalidPoolValueForWithdrawal(int256 poolValue);

    // Uint256Mask errors
    error MaskIndexOutOfBounds(uint256 index, string label);
    error DuplicatedIndex(uint256 index, string label);
}

File 4 of 8 : EventUtils.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

library EventUtils {
    struct EmitPositionDecreaseParams {
        bytes32 key;
        address account;
        address market;
        address collateralToken;
        bool isLong;
    }

    struct EventLogData {
        AddressItems addressItems;
        UintItems uintItems;
        IntItems intItems;
        BoolItems boolItems;
        Bytes32Items bytes32Items;
        BytesItems bytesItems;
        StringItems stringItems;
    }

    struct AddressItems {
        AddressKeyValue[] items;
        AddressArrayKeyValue[] arrayItems;
    }

    struct UintItems {
        UintKeyValue[] items;
        UintArrayKeyValue[] arrayItems;
    }

    struct IntItems {
        IntKeyValue[] items;
        IntArrayKeyValue[] arrayItems;
    }

    struct BoolItems {
        BoolKeyValue[] items;
        BoolArrayKeyValue[] arrayItems;
    }

    struct Bytes32Items {
        Bytes32KeyValue[] items;
        Bytes32ArrayKeyValue[] arrayItems;
    }

    struct BytesItems {
        BytesKeyValue[] items;
        BytesArrayKeyValue[] arrayItems;
    }

    struct StringItems {
        StringKeyValue[] items;
        StringArrayKeyValue[] arrayItems;
    }

    struct AddressKeyValue {
        string key;
        address value;
    }

    struct AddressArrayKeyValue {
        string key;
        address[] value;
    }

    struct UintKeyValue {
        string key;
        uint256 value;
    }

    struct UintArrayKeyValue {
        string key;
        uint256[] value;
    }

    struct IntKeyValue {
        string key;
        int256 value;
    }

    struct IntArrayKeyValue {
        string key;
        int256[] value;
    }

    struct BoolKeyValue {
        string key;
        bool value;
    }

    struct BoolArrayKeyValue {
        string key;
        bool[] value;
    }

    struct Bytes32KeyValue {
        string key;
        bytes32 value;
    }

    struct Bytes32ArrayKeyValue {
        string key;
        bytes32[] value;
    }

    struct BytesKeyValue {
        string key;
        bytes value;
    }

    struct BytesArrayKeyValue {
        string key;
        bytes[] value;
    }

    struct StringKeyValue {
        string key;
        string value;
    }

    struct StringArrayKeyValue {
        string key;
        string[] value;
    }

    function initItems(AddressItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.AddressKeyValue[](size);
    }

    function initArrayItems(AddressItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.AddressArrayKeyValue[](size);
    }

    function setItem(AddressItems memory items, uint256 index, string memory key, address value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(AddressItems memory items, uint256 index, string memory key, address[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(UintItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.UintKeyValue[](size);
    }

    function initArrayItems(UintItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.UintArrayKeyValue[](size);
    }

    function setItem(UintItems memory items, uint256 index, string memory key, uint256 value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(UintItems memory items, uint256 index, string memory key, uint256[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(IntItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.IntKeyValue[](size);
    }

    function initArrayItems(IntItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.IntArrayKeyValue[](size);
    }

    function setItem(IntItems memory items, uint256 index, string memory key, int256 value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(IntItems memory items, uint256 index, string memory key, int256[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(BoolItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.BoolKeyValue[](size);
    }

    function initArrayItems(BoolItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.BoolArrayKeyValue[](size);
    }

    function setItem(BoolItems memory items, uint256 index, string memory key, bool value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(BoolItems memory items, uint256 index, string memory key, bool[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(Bytes32Items memory items, uint256 size) internal pure {
        items.items = new EventUtils.Bytes32KeyValue[](size);
    }

    function initArrayItems(Bytes32Items memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.Bytes32ArrayKeyValue[](size);
    }

    function setItem(Bytes32Items memory items, uint256 index, string memory key, bytes32 value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(Bytes32Items memory items, uint256 index, string memory key, bytes32[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(BytesItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.BytesKeyValue[](size);
    }

    function initArrayItems(BytesItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.BytesArrayKeyValue[](size);
    }

    function setItem(BytesItems memory items, uint256 index, string memory key, bytes memory value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(BytesItems memory items, uint256 index, string memory key, bytes[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }

    function initItems(StringItems memory items, uint256 size) internal pure {
        items.items = new EventUtils.StringKeyValue[](size);
    }

    function initArrayItems(StringItems memory items, uint256 size) internal pure {
        items.arrayItems = new EventUtils.StringArrayKeyValue[](size);
    }

    function setItem(StringItems memory items, uint256 index, string memory key, string memory value) internal pure {
        items.items[index].key = key;
        items.items[index].value = value;
    }

    function setItem(StringItems memory items, uint256 index, string memory key, string[] memory value) internal pure {
        items.arrayItems[index].key = key;
        items.arrayItems[index].value = value;
    }
}

File 5 of 8 : Role.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

/**
 * @title Role
 * @dev Library for role keys
 */
library Role {
    /**
     * @dev The ROLE_ADMIN role.
     */
    bytes32 public constant ROLE_ADMIN = keccak256(abi.encode("ROLE_ADMIN"));

    /**
     * @dev The TIMELOCK_ADMIN role.
     */
    bytes32 public constant TIMELOCK_ADMIN = keccak256(abi.encode("TIMELOCK_ADMIN"));

    /**
     * @dev The TIMELOCK_MULTISIG role.
     */
    bytes32 public constant TIMELOCK_MULTISIG = keccak256(abi.encode("TIMELOCK_MULTISIG"));

    /**
     * @dev The CONFIG_KEEPER role.
     */
    bytes32 public constant CONFIG_KEEPER = keccak256(abi.encode("CONFIG_KEEPER"));

    /**
     * @dev The CONTROLLER role.
     */
    bytes32 public constant CONTROLLER = keccak256(abi.encode("CONTROLLER"));

    /**
     * @dev The ROUTER_PLUGIN role.
     */
    bytes32 public constant ROUTER_PLUGIN = keccak256(abi.encode("ROUTER_PLUGIN"));

    /**
     * @dev The MARKET_KEEPER role.
     */
    bytes32 public constant MARKET_KEEPER = keccak256(abi.encode("MARKET_KEEPER"));

    /**
     * @dev The FEE_KEEPER role.
     */
    bytes32 public constant FEE_KEEPER = keccak256(abi.encode("FEE_KEEPER"));

    /**
     * @dev The ORDER_KEEPER role.
     */
    bytes32 public constant ORDER_KEEPER = keccak256(abi.encode("ORDER_KEEPER"));

    /**
     * @dev The FROZEN_ORDER_KEEPER role.
     */
    bytes32 public constant FROZEN_ORDER_KEEPER = keccak256(abi.encode("FROZEN_ORDER_KEEPER"));

    /**
     * @dev The PRICING_KEEPER role.
     */
    bytes32 public constant PRICING_KEEPER = keccak256(abi.encode("PRICING_KEEPER"));
    /**
     * @dev The LIQUIDATION_KEEPER role.
     */
    bytes32 public constant LIQUIDATION_KEEPER = keccak256(abi.encode("LIQUIDATION_KEEPER"));
    /**
     * @dev The ADL_KEEPER role.
     */
    bytes32 public constant ADL_KEEPER = keccak256(abi.encode("ADL_KEEPER"));
}

File 6 of 8 : RoleModule.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "./RoleStore.sol";

/**
 * @title RoleModule
 * @dev Contract for role validation functions
 */
contract RoleModule {
    RoleStore public immutable roleStore;

    /**
     * @dev Constructor that initializes the role store for this contract.
     *
     * @param _roleStore The contract instance to use as the role store.
     */
    constructor(RoleStore _roleStore) {
        roleStore = _roleStore;
    }

    /**
     * @dev Only allows the contract's own address to call the function.
     */
    modifier onlySelf() {
        if (msg.sender != address(this)) {
            revert Errors.Unauthorized(msg.sender, "SELF");
        }
        _;
    }

    /**
     * @dev Only allows addresses with the TIMELOCK_MULTISIG role to call the function.
     */
    modifier onlyTimelockMultisig() {
        _validateRole(Role.TIMELOCK_MULTISIG, "TIMELOCK_MULTISIG");
        _;
    }

    /**
     * @dev Only allows addresses with the TIMELOCK_ADMIN role to call the function.
     */
    modifier onlyTimelockAdmin() {
        _validateRole(Role.TIMELOCK_ADMIN, "TIMELOCK_ADMIN");
        _;
    }

    /**
     * @dev Only allows addresses with the CONFIG_KEEPER role to call the function.
     */
    modifier onlyConfigKeeper() {
        _validateRole(Role.CONFIG_KEEPER, "CONFIG_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the CONTROLLER role to call the function.
     */
    modifier onlyController() {
        _validateRole(Role.CONTROLLER, "CONTROLLER");
        _;
    }

    /**
     * @dev Only allows addresses with the ROUTER_PLUGIN role to call the function.
     */
    modifier onlyRouterPlugin() {
        _validateRole(Role.ROUTER_PLUGIN, "ROUTER_PLUGIN");
        _;
    }

    /**
     * @dev Only allows addresses with the MARKET_KEEPER role to call the function.
     */
    modifier onlyMarketKeeper() {
        _validateRole(Role.MARKET_KEEPER, "MARKET_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the FEE_KEEPER role to call the function.
     */
    modifier onlyFeeKeeper() {
        _validateRole(Role.FEE_KEEPER, "FEE_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the ORDER_KEEPER role to call the function.
     */
    modifier onlyOrderKeeper() {
        _validateRole(Role.ORDER_KEEPER, "ORDER_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the PRICING_KEEPER role to call the function.
     */
    modifier onlyPricingKeeper() {
        _validateRole(Role.PRICING_KEEPER, "PRICING_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the LIQUIDATION_KEEPER role to call the function.
     */
    modifier onlyLiquidationKeeper() {
        _validateRole(Role.LIQUIDATION_KEEPER, "LIQUIDATION_KEEPER");
        _;
    }

    /**
     * @dev Only allows addresses with the ADL_KEEPER role to call the function.
     */
    modifier onlyAdlKeeper() {
        _validateRole(Role.ADL_KEEPER, "ADL_KEEPER");
        _;
    }

    /**
     * @dev Validates that the caller has the specified role.
     *
     * If the caller does not have the specified role, the transaction is reverted.
     *
     * @param role The key of the role to validate.
     * @param roleName The name of the role to validate.
     */
    function _validateRole(bytes32 role, string memory roleName) internal view {
        if (!roleStore.hasRole(msg.sender, role)) {
            revert Errors.Unauthorized(msg.sender, roleName);
        }
    }
}

File 7 of 8 : RoleStore.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "../utils/EnumerableValues.sol";
import "./Role.sol";
import "../error/Errors.sol";

/**
 * @title RoleStore
 * @dev Stores roles and their members.
 */
contract RoleStore {
    using EnumerableSet for EnumerableSet.AddressSet;
    using EnumerableSet for EnumerableSet.Bytes32Set;
    using EnumerableValues for EnumerableSet.AddressSet;
    using EnumerableValues for EnumerableSet.Bytes32Set;

    EnumerableSet.Bytes32Set internal roles;
    mapping(bytes32 => EnumerableSet.AddressSet) internal roleMembers;
    // checking if an account has a role is a frequently used function
    // roleCache helps to save gas by offering a more efficient lookup
    // vs calling roleMembers[key].contains(account)
    mapping(address => mapping (bytes32 => bool)) roleCache;

    modifier onlyRoleAdmin() {
        if (!hasRole(msg.sender, Role.ROLE_ADMIN)) {
            revert Errors.Unauthorized(msg.sender, "ROLE_ADMIN");
        }
        _;
    }

    constructor() {
        _grantRole(msg.sender, Role.ROLE_ADMIN);
    }

    /**
     * @dev Grants the specified role to the given account.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role to grant.
     */
    function grantRole(address account, bytes32 roleKey) external onlyRoleAdmin {
        _grantRole(account, roleKey);
    }

    /**
     * @dev Revokes the specified role from the given account.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role to revoke.
     */
    function revokeRole(address account, bytes32 roleKey) external onlyRoleAdmin {
        _revokeRole(account, roleKey);
    }

    /**
     * @dev Returns true if the given account has the specified role.
     *
     * @param account The address of the account.
     * @param roleKey The key of the role.
     * @return True if the account has the role, false otherwise.
     */
    function hasRole(address account, bytes32 roleKey) public view returns (bool) {
        return roleCache[account][roleKey];
    }

    /**
     * @dev Returns the number of roles stored in the contract.
     *
     * @return The number of roles.
     */
    function getRoleCount() external view returns (uint256) {
        return roles.length();
    }

    /**
     * @dev Returns the keys of the roles stored in the contract.
     *
     * @param start The starting index of the range of roles to return.
     * @param end The ending index of the range of roles to return.
     * @return The keys of the roles.
     */
    function getRoles(uint256 start, uint256 end) external view returns (bytes32[] memory) {
        return roles.valuesAt(start, end);
    }

    /**
     * @dev Returns the number of members of the specified role.
     *
     * @param roleKey The key of the role.
     * @return The number of members of the role.
     */
    function getRoleMemberCount(bytes32 roleKey) external view returns (uint256) {
        return roleMembers[roleKey].length();
    }

    /**
     * @dev Returns the members of the specified role.
     *
     * @param roleKey The key of the role.
     * @param start the start index, the value for this index will be included.
     * @param end the end index, the value for this index will not be included.
     * @return The members of the role.
     */
    function getRoleMembers(bytes32 roleKey, uint256 start, uint256 end) external view returns (address[] memory) {
        return roleMembers[roleKey].valuesAt(start, end);
    }

    function _grantRole(address account, bytes32 roleKey) internal {
        roles.add(roleKey);
        roleMembers[roleKey].add(account);
        roleCache[account][roleKey] = true;
    }

    function _revokeRole(address account, bytes32 roleKey) internal {
        roleMembers[roleKey].remove(account);
        roleCache[account][roleKey] = false;

        if (roleMembers[roleKey].length() == 0) {
            if (roleKey == Role.ROLE_ADMIN) {
                revert Errors.ThereMustBeAtLeastOneRoleAdmin();
            }
            if (roleKey == Role.TIMELOCK_MULTISIG) {
                revert Errors.ThereMustBeAtLeastOneTimelockMultiSig();
            }
        }
    }
}

File 8 of 8 : EnumerableValues.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";

/**
 * @title EnumerableValues
 * @dev Library to extend the EnumerableSet library with functions to get
 * valuesAt for a range
 */
library EnumerableValues {
    using EnumerableSet for EnumerableSet.Bytes32Set;
    using EnumerableSet for EnumerableSet.AddressSet;
    using EnumerableSet for EnumerableSet.UintSet;

    /**
     * Returns an array of bytes32 values from the given set, starting at the given
     * start index and ending before the given end index.
     *
     * @param set The set to get the values from.
     * @param start The starting index.
     * @param end The ending index.
     * @return An array of bytes32 values.
     */
    function valuesAt(EnumerableSet.Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) {
        uint256 max = set.length();
        if (end > max) { end = max; }

        bytes32[] memory items = new bytes32[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }


    /**
     * Returns an array of address values from the given set, starting at the given
     * start index and ending before the given end index.
     *
     * @param set The set to get the values from.
     * @param start The starting index.
     * @param end The ending index.
     * @return An array of address values.
     */
    function valuesAt(EnumerableSet.AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) {
        uint256 max = set.length();
        if (end > max) { end = max; }

        address[] memory items = new address[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }


    /**
     * Returns an array of uint256 values from the given set, starting at the given
     * start index and ending before the given end index, the item at the end index will not be returned.
     *
     * @param set The set to get the values from.
     * @param start The starting index (inclusive, item at the start index will be returned).
     * @param end The ending index (exclusive, item at the end index will not be returned).
     * @return An array of uint256 values.
     */
    function valuesAt(EnumerableSet.UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) {
        if (start >= set.length()) {
            return new uint256[](0);
        }

        uint256 max = set.length();
        if (end > max) { end = max; }

        uint256[] memory items = new uint256[](end - start);
        for (uint256 i = start; i < end; i++) {
            items[i - start] = set.at(i);
        }

        return items;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract RoleStore","name":"_roleStore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"string","name":"role","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"string","name":"eventName","type":"string"},{"indexed":true,"internalType":"string","name":"eventNameHash","type":"string"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"indexed":false,"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"EventLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"string","name":"eventName","type":"string"},{"indexed":true,"internalType":"string","name":"eventNameHash","type":"string"},{"indexed":true,"internalType":"bytes32","name":"topic1","type":"bytes32"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"indexed":false,"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"EventLog1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"string","name":"eventName","type":"string"},{"indexed":true,"internalType":"string","name":"eventNameHash","type":"string"},{"indexed":true,"internalType":"bytes32","name":"topic1","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"topic2","type":"bytes32"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"indexed":false,"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"EventLog2","type":"event"},{"inputs":[{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emitDataLog1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"internalType":"bytes32","name":"topic2","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emitDataLog2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"internalType":"bytes32","name":"topic2","type":"bytes32"},{"internalType":"bytes32","name":"topic3","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emitDataLog3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"internalType":"bytes32","name":"topic2","type":"bytes32"},{"internalType":"bytes32","name":"topic3","type":"bytes32"},{"internalType":"bytes32","name":"topic4","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"emitDataLog4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"eventName","type":"string"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"emitEventLog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"eventName","type":"string"},{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"emitEventLog1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"eventName","type":"string"},{"internalType":"bytes32","name":"topic1","type":"bytes32"},{"internalType":"bytes32","name":"topic2","type":"bytes32"},{"components":[{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address","name":"value","type":"address"}],"internalType":"struct EventUtils.AddressKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"address[]","name":"value","type":"address[]"}],"internalType":"struct EventUtils.AddressArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.AddressItems","name":"addressItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct EventUtils.UintKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"internalType":"struct EventUtils.UintArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.UintItems","name":"uintItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256","name":"value","type":"int256"}],"internalType":"struct EventUtils.IntKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"internalType":"struct EventUtils.IntArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.IntItems","name":"intItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool","name":"value","type":"bool"}],"internalType":"struct EventUtils.BoolKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bool[]","name":"value","type":"bool[]"}],"internalType":"struct EventUtils.BoolArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BoolItems","name":"boolItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"internalType":"struct EventUtils.Bytes32KeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes32[]","name":"value","type":"bytes32[]"}],"internalType":"struct EventUtils.Bytes32ArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.Bytes32Items","name":"bytes32Items","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct EventUtils.BytesKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes[]","name":"value","type":"bytes[]"}],"internalType":"struct EventUtils.BytesArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.BytesItems","name":"bytesItems","type":"tuple"},{"components":[{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct EventUtils.StringKeyValue[]","name":"items","type":"tuple[]"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string[]","name":"value","type":"string[]"}],"internalType":"struct EventUtils.StringArrayKeyValue[]","name":"arrayItems","type":"tuple[]"}],"internalType":"struct EventUtils.StringItems","name":"stringItems","type":"tuple"}],"internalType":"struct EventUtils.EventLogData","name":"eventData","type":"tuple"}],"name":"emitEventLog2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roleStore","outputs":[{"internalType":"contract RoleStore","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b50604051611fcf380380611fcf83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b608051611f3e61009160003960008181609701526103680152611f3e6000f3fe608060405234801561001057600080fd5b50600436106100785760003560e01c806324de01e41461007d5780634a4a7b041461009257806363d16363146100d5578063906c49f6146100e8578063b3ac1c38146100fb578063dda0db321461010e578063ee288ce814610121578063f9d5c0ea14610134575b600080fd5b61009061008b36600461127c565b610147565b005b6100b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100906100e33660046112e8565b6101ee565b6100906100f636600461135e565b610259565b6100906101093660046113c1565b6102c0565b61009061011c36600461140e565b6102e4565b61009061012f366004611453565b610306565b6100906101423660046114b6565b61032c565b610197604051602001610159906114f2565b604051602081830303815290604052805190602001206040518060400160405280600a81526020016921a7a72a2927a62622a960b11b81525061034c565b81836040516101a6919061153a565b60405180910390207f137a44067c8961cd7e1d876f4754a5a3a75989b4552f1843fc69c3b372def1603386856040516101e193929190611dd2565b60405180910390a3505050565b610200604051602001610159906114f2565b818385604051610210919061153a565b60405180910390207f468a25a7ba624ceea6e540ad6f49171b52495b648417ae91bca21676d8a24dc533888660405161024b93929190611dd2565b60405180910390a450505050565b61026b604051602001610159906114f2565b81604051610279919061153a565b60405180910390207f7e3bde2ba7aca4a8499608ca57f3b0c1c1c93ace63ffd3741a9fab204146fc9a3384846040516102b493929190611dd2565b60405180910390a25050565b6102d2604051602001610159906114f2565b80518284868360208601a35050505050565b6102f6604051602001610159906114f2565b805182848260208501a250505050565b610318604051602001610159906114f2565b8051828486888460208701a4505050505050565b61033e604051602001610159906114f2565b8051828160208401a1505050565b60405163ac4ab3fb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ac4ab3fb90604401602060405180830381865afa1580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190611eb8565b61040557338160405163a35b150b60e01b81526004016103fc929190611edc565b60405180910390fd5b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561044157610441610409565b60405290565b60405160e081016001600160401b038111828210171561044157610441610409565b604051601f8201601f191681016001600160401b038111828210171561049157610491610409565b604052919050565b600082601f8301126104aa57600080fd5b81356001600160401b038111156104c3576104c3610409565b6104d6601f8201601f1916602001610469565b8181528460208386010111156104eb57600080fd5b816020850160208301376000918101602001919091529392505050565b60006001600160401b0382111561052157610521610409565b5060051b60200190565b80356001600160a01b038116811461054257600080fd5b919050565b600082601f83011261055857600080fd5b8135602061056d61056883610508565b610469565b828152600592831b850182019282820191908785111561058c57600080fd5b8387015b858110156106885780356001600160401b03808211156105b05760008081fd5b908901906040828c03601f19018113156105ca5760008081fd5b6105d261041f565b88840135838111156105e45760008081fd5b6105f28e8b83880101610499565b82525081840135838111156106075760008081fd5b8085019450508c603f85011261061f57600092508283fd5b88840135925061063161056884610508565b83815292861b8401820192898101908e85111561064e5760008081fd5b948301945b84861015610673576106648661052b565b8252948a0194908a0190610653565b828b0152508752505050928401928401610590565b5090979650505050505050565b600060408083850312156106a857600080fd5b6106b061041f565b915082356001600160401b03808211156106c957600080fd5b818501915085601f8301126106dd57600080fd5b813560206106ed61056883610508565b82815260059290921b8401810191818101908984111561070c57600080fd5b8286015b84811015610786578035868111156107285760008081fd5b8701808c03601f190189131561073e5760008081fd5b61074661041f565b85820135888111156107585760008081fd5b6107668e8883860101610499565b8252506107748a830161052b565b81870152845250918301918301610710565b508752508681013594508285111561079d57600080fd5b6107a988868901610547565b81870152505050505092915050565b600082601f8301126107c957600080fd5b813560206107d961056883610508565b828152600592831b85018201928282019190878511156107f857600080fd5b8387015b858110156106885780356001600160401b038082111561081c5760008081fd5b908901906040828c03601f19018113156108365760008081fd5b61083e61041f565b88840135838111156108505760008081fd5b61085e8e8b83880101610499565b82525081840135838111156108735760008081fd5b8085019450508c603f85011261088b57600092508283fd5b88840135925061089d61056884610508565b83815292861b8401820192898101908e8511156108ba5760008081fd5b948301945b848610156108d85785358252948a0194908a01906108bf565b828b01525087525050509284019284016107fc565b6000604080838503121561090057600080fd5b61090861041f565b915082356001600160401b038082111561092157600080fd5b818501915085601f83011261093557600080fd5b8135602061094561056883610508565b82815260059290921b8401810191818101908984111561096457600080fd5b8286015b848110156109d6578035868111156109805760008081fd5b8701808c03601f19018913156109965760008081fd5b61099e61041f565b85820135888111156109b05760008081fd5b6109be8e8883860101610499565b82525090890135858201528352918301918301610968565b50875250868101359450828511156109ed57600080fd5b6107a9888689016107b8565b8015158114610a0757600080fd5b50565b600082601f830112610a1b57600080fd5b81356020610a2b61056883610508565b828152600592831b8501820192828201919087851115610a4a57600080fd5b8387015b858110156106885780356001600160401b0380821115610a6e5760008081fd5b908901906040828c03601f1901811315610a885760008081fd5b610a9061041f565b8884013583811115610aa25760008081fd5b610ab08e8b83880101610499565b8252508184013583811115610ac55760008081fd5b8085019450508c603f850112610add57600092508283fd5b888401359250610aef61056884610508565b83815292861b8401820192898101908e851115610b0c5760008081fd5b948301945b84861015610b365785359350610b26846109f9565b838252948a0194908a0190610b11565b828b0152508752505050928401928401610a4e565b60006040808385031215610b5e57600080fd5b610b6661041f565b915082356001600160401b0380821115610b7f57600080fd5b818501915085601f830112610b9357600080fd5b81356020610ba361056883610508565b82815260059290921b84018101918181019089841115610bc257600080fd5b8286015b84811015610c4157803586811115610bde5760008081fd5b8701808c03601f1901891315610bf45760008081fd5b610bfc61041f565b8582013588811115610c0e5760008081fd5b610c1c8e8883860101610499565b8252509089013590610c2d826109f9565b808601919091528352918301918301610bc6565b5087525086810135945082851115610c5857600080fd5b6107a988868901610a0a565b600082601f830112610c7557600080fd5b81356020610c8561056883610508565b82815260059290921b84018101918181019086841115610ca457600080fd5b8286015b84811015610dad576001600160401b038135811015610cc657600080fd5b813588016040818b03601f19011215610cde57600080fd5b610ce661041f565b8682013583811115610cf757600080fd5b610d058c8983860101610499565b825250604082013583811115610d1a57600080fd5b8083019250508a603f830112610d2f57600080fd5b86820135610d3f61056882610508565b81815260059190911b830160400190888101908d831115610d5f57600080fd5b604085015b83811015610d97578681351115610d7a57600080fd5b610d8a8f60408335890101610499565b8352918a01918a01610d64565b50838a0152505085525050918301918301610ca8565b509695505050505050565b60006040808385031215610dcb57600080fd5b610dd361041f565b915082356001600160401b0380821115610dec57600080fd5b818501915085601f830112610e0057600080fd5b81356020610e1061056883610508565b82815260059290921b84018101918181019089841115610e2f57600080fd5b8286015b84811015610ebf57803586811115610e4b5760008081fd5b8701808c03601f1901891315610e615760008081fd5b610e6961041f565b8582013588811115610e7b5760008081fd5b610e898e8883860101610499565b8252508982013588811115610e9e5760008081fd5b610eac8e8883860101610499565b8288015250845250918301918301610e33565b5087525086810135945082851115610ed657600080fd5b6107a988868901610c64565b600082601f830112610ef357600080fd5b81356020610f0361056883610508565b82815260059290921b84018101918181019086841115610f2257600080fd5b8286015b84811015610dad576001600160401b038135811015610f4457600080fd5b813588016040818b03601f19011215610f5c57600080fd5b610f6461041f565b8682013583811115610f7557600080fd5b610f838c8983860101610499565b825250604082013583811115610f9857600080fd5b8083019250508a603f830112610fad57600080fd5b86820135610fbd61056882610508565b81815260059190911b830160400190888101908d831115610fdd57600080fd5b604085015b83811015611015578681351115610ff857600080fd5b6110088f60408335890101610499565b8352918a01918a01610fe2565b50838a0152505085525050918301918301610f26565b6000604080838503121561103e57600080fd5b61104661041f565b915082356001600160401b038082111561105f57600080fd5b818501915085601f83011261107357600080fd5b8135602061108361056883610508565b82815260059290921b840181019181810190898411156110a257600080fd5b8286015b84811015611132578035868111156110be5760008081fd5b8701808c03601f19018913156110d45760008081fd5b6110dc61041f565b85820135888111156110ee5760008081fd5b6110fc8e8883860101610499565b82525089820135888111156111115760008081fd5b61111f8e8883860101610499565b82880152508452509183019183016110a6565b508752508681013594508285111561114957600080fd5b6107a988868901610ee2565b600060e0828403121561116757600080fd5b61116f610447565b905081356001600160401b038082111561118857600080fd5b61119485838601610695565b835260208401359150808211156111aa57600080fd5b6111b6858386016108ed565b602084015260408401359150808211156111cf57600080fd5b6111db858386016108ed565b604084015260608401359150808211156111f457600080fd5b61120085838601610b4b565b6060840152608084013591508082111561121957600080fd5b611225858386016108ed565b608084015260a084013591508082111561123e57600080fd5b61124a85838601610db8565b60a084015260c084013591508082111561126357600080fd5b506112708482850161102b565b60c08301525092915050565b60008060006060848603121561129157600080fd5b83356001600160401b03808211156112a857600080fd5b6112b487838801610499565b94506020860135935060408601359150808211156112d157600080fd5b506112de86828701611155565b9150509250925092565b600080600080608085870312156112fe57600080fd5b84356001600160401b038082111561131557600080fd5b61132188838901610499565b95506020870135945060408701359350606087013591508082111561134557600080fd5b5061135287828801611155565b91505092959194509250565b6000806040838503121561137157600080fd5b82356001600160401b038082111561138857600080fd5b61139486838701610499565b935060208501359150808211156113aa57600080fd5b506113b785828601611155565b9150509250929050565b600080600080608085870312156113d757600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561140257600080fd5b61135287828801610499565b60008060006060848603121561142357600080fd5b833592506020840135915060408401356001600160401b0381111561144757600080fd5b6112de86828701610499565b600080600080600060a0868803121561146b57600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561149d57600080fd5b6114a988828901610499565b9150509295509295909350565b600080604083850312156114c957600080fd5b8235915060208301356001600160401b038111156114e657600080fd5b6113b785828601610499565b6020808252600a908201526921a7a72a2927a62622a960b11b604082015260600190565b60005b83811015611531578181015183820152602001611519565b50506000910152565b6000825161154c818460208701611516565b9190910192915050565b6000815180845261156e816020860160208601611516565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a528251604081518188526115c382890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156116085783516001600160a01b031682529289019260019290920191908901906115df565b509b88019b96505050918501916001016115a1565b509298975050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156116a257898603605f190184528451805188885261167c89890182611556565b918401516001600160a01b03169784019790975295509381019392810192600101611658565b50808801519550888503818a0152505050506116be8183611582565b95945050505050565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261170882890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156117445783518252928901926001929092019190890190611724565b509b88019b96505050918501916001016116e6565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156117c757898603605f19018452845180518888526117aa89890182611556565b918401519784019790975295509381019392810192600101611786565b50808801519550888503818a0152505050506116be81836116c7565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261182482890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156118605783518252928901926001929092019190890190611840565b509b88019b9650505091850191600101611802565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156118e357898603605f19018452845180518888526118c689890182611556565b9184015197840197909752955093810193928101926001016118a2565b50808801519550888503818a0152505050506116be81836117e3565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261194082890182611556565b92890151888403898b01528051808552908a01938693508a0191505b8083101561197e5783511515825292890192600192909201919089019061195c565b509b88019b965050509185019160010161191e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611a0357898603605f19018452845180518888526119e489890182611556565b91840151151597840197909752955093810193928101926001016119c0565b50808801519550888503818a0152505050506116be81836118ff565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a52825160408151818852611a6082890182611556565b92890151888403898b01528051808552908a01938693508a0191505b80831015611a9c5783518252928901926001929092019190890190611a7c565b509b88019b9650505091850191600101611a3e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611b1f57898603605f1901845284518051888852611b0289890182611556565b918401519784019790975295509381019392810192600101611ade565b50808801519550888503818a0152505050506116be8183611a1f565b600081518084526020808501808196506005915083821b81018387016000805b87811015611be6578484038b52825160408151818752611b7d82880182611556565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b82811015611bcf57601f19858303018452611bbd828751611556565b958d0195938d01939150600101611ba1565b509e8b019e97505050938801935050600101611b5b565b50919998505050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611c7257898603605f1901845284518051888852611c4689890182611556565b9184015188830389860152919050611c5e8183611556565b975050509381019392810192600101611c22565b50808801519550888503818a0152505050506116be8183611b3b565b600081518084526020808501808196506005915083821b81018387016000805b87811015611be6578484038b52825160408151818752611cd082880182611556565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b82811015611d2257601f19858303018452611d10828751611556565b958d0195938d01939150600101611cf4565b509e8b019e97505050938801935050600101611cae565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611db657898603605f1901845284518051888852611d8a89890182611556565b9184015188830389860152919050611da28183611556565b975050509381019392810192600101611d66565b50808801519550888503818a0152505050506116be8183611c8e565b6001600160a01b0384168152606060208201819052600090611df690830185611556565b8281036040840152835160e08252611e1160e083018261162b565b905060208501518282036020840152611e2a8282611759565b91505060408501518282036040840152611e448282611875565b91505060608501518282036060840152611e5e8282611993565b91505060808501518282036080840152611e788282611ab1565b91505060a085015182820360a0840152611e928282611bf5565b91505060c085015182820360c0840152611eac8282611d39565b98975050505050505050565b600060208284031215611eca57600080fd5b8151611ed5816109f9565b9392505050565b6001600160a01b0383168152604060208201819052600090611f0090830184611556565b94935050505056fea2646970667358221220d3731353afc54562deabb045fa5ce95f9efdd0b37a17d2865f0f2a2f0c23130764736f6c634300081200330000000000000000000000003c3d99fd298f679dbc2cecd132b4ec4d0f5e6e72

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100785760003560e01c806324de01e41461007d5780634a4a7b041461009257806363d16363146100d5578063906c49f6146100e8578063b3ac1c38146100fb578063dda0db321461010e578063ee288ce814610121578063f9d5c0ea14610134575b600080fd5b61009061008b36600461127c565b610147565b005b6100b97f0000000000000000000000003c3d99fd298f679dbc2cecd132b4ec4d0f5e6e7281565b6040516001600160a01b03909116815260200160405180910390f35b6100906100e33660046112e8565b6101ee565b6100906100f636600461135e565b610259565b6100906101093660046113c1565b6102c0565b61009061011c36600461140e565b6102e4565b61009061012f366004611453565b610306565b6100906101423660046114b6565b61032c565b610197604051602001610159906114f2565b604051602081830303815290604052805190602001206040518060400160405280600a81526020016921a7a72a2927a62622a960b11b81525061034c565b81836040516101a6919061153a565b60405180910390207f137a44067c8961cd7e1d876f4754a5a3a75989b4552f1843fc69c3b372def1603386856040516101e193929190611dd2565b60405180910390a3505050565b610200604051602001610159906114f2565b818385604051610210919061153a565b60405180910390207f468a25a7ba624ceea6e540ad6f49171b52495b648417ae91bca21676d8a24dc533888660405161024b93929190611dd2565b60405180910390a450505050565b61026b604051602001610159906114f2565b81604051610279919061153a565b60405180910390207f7e3bde2ba7aca4a8499608ca57f3b0c1c1c93ace63ffd3741a9fab204146fc9a3384846040516102b493929190611dd2565b60405180910390a25050565b6102d2604051602001610159906114f2565b80518284868360208601a35050505050565b6102f6604051602001610159906114f2565b805182848260208501a250505050565b610318604051602001610159906114f2565b8051828486888460208701a4505050505050565b61033e604051602001610159906114f2565b8051828160208401a1505050565b60405163ac4ab3fb60e01b8152336004820152602481018390527f0000000000000000000000003c3d99fd298f679dbc2cecd132b4ec4d0f5e6e726001600160a01b03169063ac4ab3fb90604401602060405180830381865afa1580156103b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103db9190611eb8565b61040557338160405163a35b150b60e01b81526004016103fc929190611edc565b60405180910390fd5b5050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561044157610441610409565b60405290565b60405160e081016001600160401b038111828210171561044157610441610409565b604051601f8201601f191681016001600160401b038111828210171561049157610491610409565b604052919050565b600082601f8301126104aa57600080fd5b81356001600160401b038111156104c3576104c3610409565b6104d6601f8201601f1916602001610469565b8181528460208386010111156104eb57600080fd5b816020850160208301376000918101602001919091529392505050565b60006001600160401b0382111561052157610521610409565b5060051b60200190565b80356001600160a01b038116811461054257600080fd5b919050565b600082601f83011261055857600080fd5b8135602061056d61056883610508565b610469565b828152600592831b850182019282820191908785111561058c57600080fd5b8387015b858110156106885780356001600160401b03808211156105b05760008081fd5b908901906040828c03601f19018113156105ca5760008081fd5b6105d261041f565b88840135838111156105e45760008081fd5b6105f28e8b83880101610499565b82525081840135838111156106075760008081fd5b8085019450508c603f85011261061f57600092508283fd5b88840135925061063161056884610508565b83815292861b8401820192898101908e85111561064e5760008081fd5b948301945b84861015610673576106648661052b565b8252948a0194908a0190610653565b828b0152508752505050928401928401610590565b5090979650505050505050565b600060408083850312156106a857600080fd5b6106b061041f565b915082356001600160401b03808211156106c957600080fd5b818501915085601f8301126106dd57600080fd5b813560206106ed61056883610508565b82815260059290921b8401810191818101908984111561070c57600080fd5b8286015b84811015610786578035868111156107285760008081fd5b8701808c03601f190189131561073e5760008081fd5b61074661041f565b85820135888111156107585760008081fd5b6107668e8883860101610499565b8252506107748a830161052b565b81870152845250918301918301610710565b508752508681013594508285111561079d57600080fd5b6107a988868901610547565b81870152505050505092915050565b600082601f8301126107c957600080fd5b813560206107d961056883610508565b828152600592831b85018201928282019190878511156107f857600080fd5b8387015b858110156106885780356001600160401b038082111561081c5760008081fd5b908901906040828c03601f19018113156108365760008081fd5b61083e61041f565b88840135838111156108505760008081fd5b61085e8e8b83880101610499565b82525081840135838111156108735760008081fd5b8085019450508c603f85011261088b57600092508283fd5b88840135925061089d61056884610508565b83815292861b8401820192898101908e8511156108ba5760008081fd5b948301945b848610156108d85785358252948a0194908a01906108bf565b828b01525087525050509284019284016107fc565b6000604080838503121561090057600080fd5b61090861041f565b915082356001600160401b038082111561092157600080fd5b818501915085601f83011261093557600080fd5b8135602061094561056883610508565b82815260059290921b8401810191818101908984111561096457600080fd5b8286015b848110156109d6578035868111156109805760008081fd5b8701808c03601f19018913156109965760008081fd5b61099e61041f565b85820135888111156109b05760008081fd5b6109be8e8883860101610499565b82525090890135858201528352918301918301610968565b50875250868101359450828511156109ed57600080fd5b6107a9888689016107b8565b8015158114610a0757600080fd5b50565b600082601f830112610a1b57600080fd5b81356020610a2b61056883610508565b828152600592831b8501820192828201919087851115610a4a57600080fd5b8387015b858110156106885780356001600160401b0380821115610a6e5760008081fd5b908901906040828c03601f1901811315610a885760008081fd5b610a9061041f565b8884013583811115610aa25760008081fd5b610ab08e8b83880101610499565b8252508184013583811115610ac55760008081fd5b8085019450508c603f850112610add57600092508283fd5b888401359250610aef61056884610508565b83815292861b8401820192898101908e851115610b0c5760008081fd5b948301945b84861015610b365785359350610b26846109f9565b838252948a0194908a0190610b11565b828b0152508752505050928401928401610a4e565b60006040808385031215610b5e57600080fd5b610b6661041f565b915082356001600160401b0380821115610b7f57600080fd5b818501915085601f830112610b9357600080fd5b81356020610ba361056883610508565b82815260059290921b84018101918181019089841115610bc257600080fd5b8286015b84811015610c4157803586811115610bde5760008081fd5b8701808c03601f1901891315610bf45760008081fd5b610bfc61041f565b8582013588811115610c0e5760008081fd5b610c1c8e8883860101610499565b8252509089013590610c2d826109f9565b808601919091528352918301918301610bc6565b5087525086810135945082851115610c5857600080fd5b6107a988868901610a0a565b600082601f830112610c7557600080fd5b81356020610c8561056883610508565b82815260059290921b84018101918181019086841115610ca457600080fd5b8286015b84811015610dad576001600160401b038135811015610cc657600080fd5b813588016040818b03601f19011215610cde57600080fd5b610ce661041f565b8682013583811115610cf757600080fd5b610d058c8983860101610499565b825250604082013583811115610d1a57600080fd5b8083019250508a603f830112610d2f57600080fd5b86820135610d3f61056882610508565b81815260059190911b830160400190888101908d831115610d5f57600080fd5b604085015b83811015610d97578681351115610d7a57600080fd5b610d8a8f60408335890101610499565b8352918a01918a01610d64565b50838a0152505085525050918301918301610ca8565b509695505050505050565b60006040808385031215610dcb57600080fd5b610dd361041f565b915082356001600160401b0380821115610dec57600080fd5b818501915085601f830112610e0057600080fd5b81356020610e1061056883610508565b82815260059290921b84018101918181019089841115610e2f57600080fd5b8286015b84811015610ebf57803586811115610e4b5760008081fd5b8701808c03601f1901891315610e615760008081fd5b610e6961041f565b8582013588811115610e7b5760008081fd5b610e898e8883860101610499565b8252508982013588811115610e9e5760008081fd5b610eac8e8883860101610499565b8288015250845250918301918301610e33565b5087525086810135945082851115610ed657600080fd5b6107a988868901610c64565b600082601f830112610ef357600080fd5b81356020610f0361056883610508565b82815260059290921b84018101918181019086841115610f2257600080fd5b8286015b84811015610dad576001600160401b038135811015610f4457600080fd5b813588016040818b03601f19011215610f5c57600080fd5b610f6461041f565b8682013583811115610f7557600080fd5b610f838c8983860101610499565b825250604082013583811115610f9857600080fd5b8083019250508a603f830112610fad57600080fd5b86820135610fbd61056882610508565b81815260059190911b830160400190888101908d831115610fdd57600080fd5b604085015b83811015611015578681351115610ff857600080fd5b6110088f60408335890101610499565b8352918a01918a01610fe2565b50838a0152505085525050918301918301610f26565b6000604080838503121561103e57600080fd5b61104661041f565b915082356001600160401b038082111561105f57600080fd5b818501915085601f83011261107357600080fd5b8135602061108361056883610508565b82815260059290921b840181019181810190898411156110a257600080fd5b8286015b84811015611132578035868111156110be5760008081fd5b8701808c03601f19018913156110d45760008081fd5b6110dc61041f565b85820135888111156110ee5760008081fd5b6110fc8e8883860101610499565b82525089820135888111156111115760008081fd5b61111f8e8883860101610499565b82880152508452509183019183016110a6565b508752508681013594508285111561114957600080fd5b6107a988868901610ee2565b600060e0828403121561116757600080fd5b61116f610447565b905081356001600160401b038082111561118857600080fd5b61119485838601610695565b835260208401359150808211156111aa57600080fd5b6111b6858386016108ed565b602084015260408401359150808211156111cf57600080fd5b6111db858386016108ed565b604084015260608401359150808211156111f457600080fd5b61120085838601610b4b565b6060840152608084013591508082111561121957600080fd5b611225858386016108ed565b608084015260a084013591508082111561123e57600080fd5b61124a85838601610db8565b60a084015260c084013591508082111561126357600080fd5b506112708482850161102b565b60c08301525092915050565b60008060006060848603121561129157600080fd5b83356001600160401b03808211156112a857600080fd5b6112b487838801610499565b94506020860135935060408601359150808211156112d157600080fd5b506112de86828701611155565b9150509250925092565b600080600080608085870312156112fe57600080fd5b84356001600160401b038082111561131557600080fd5b61132188838901610499565b95506020870135945060408701359350606087013591508082111561134557600080fd5b5061135287828801611155565b91505092959194509250565b6000806040838503121561137157600080fd5b82356001600160401b038082111561138857600080fd5b61139486838701610499565b935060208501359150808211156113aa57600080fd5b506113b785828601611155565b9150509250929050565b600080600080608085870312156113d757600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561140257600080fd5b61135287828801610499565b60008060006060848603121561142357600080fd5b833592506020840135915060408401356001600160401b0381111561144757600080fd5b6112de86828701610499565b600080600080600060a0868803121561146b57600080fd5b8535945060208601359350604086013592506060860135915060808601356001600160401b0381111561149d57600080fd5b6114a988828901610499565b9150509295509295909350565b600080604083850312156114c957600080fd5b8235915060208301356001600160401b038111156114e657600080fd5b6113b785828601610499565b6020808252600a908201526921a7a72a2927a62622a960b11b604082015260600190565b60005b83811015611531578181015183820152602001611519565b50506000910152565b6000825161154c818460208701611516565b9190910192915050565b6000815180845261156e816020860160208601611516565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a528251604081518188526115c382890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156116085783516001600160a01b031682529289019260019290920191908901906115df565b509b88019b96505050918501916001016115a1565b509298975050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156116a257898603605f190184528451805188885261167c89890182611556565b918401516001600160a01b03169784019790975295509381019392810192600101611658565b50808801519550888503818a0152505050506116be8183611582565b95945050505050565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261170882890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156117445783518252928901926001929092019190890190611724565b509b88019b96505050918501916001016116e6565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156117c757898603605f19018452845180518888526117aa89890182611556565b918401519784019790975295509381019392810192600101611786565b50808801519550888503818a0152505050506116be81836116c7565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261182482890182611556565b92890151888403898b01528051808552908a01938693508a0191505b808310156118605783518252928901926001929092019190890190611840565b509b88019b9650505091850191600101611802565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156118e357898603605f19018452845180518888526118c689890182611556565b9184015197840197909752955093810193928101926001016118a2565b50808801519550888503818a0152505050506116be81836117e3565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a5282516040815181885261194082890182611556565b92890151888403898b01528051808552908a01938693508a0191505b8083101561197e5783511515825292890192600192909201919089019061195c565b509b88019b965050509185019160010161191e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611a0357898603605f19018452845180518888526119e489890182611556565b91840151151597840197909752955093810193928101926001016119c0565b50808801519550888503818a0152505050506116be81836118ff565b600081518084526020808501808196508360051b810191508286016000805b8681101561161d578385038a52825160408151818852611a6082890182611556565b92890151888403898b01528051808552908a01938693508a0191505b80831015611a9c5783518252928901926001929092019190890190611a7c565b509b88019b9650505091850191600101611a3e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611b1f57898603605f1901845284518051888852611b0289890182611556565b918401519784019790975295509381019392810192600101611ade565b50808801519550888503818a0152505050506116be8183611a1f565b600081518084526020808501808196506005915083821b81018387016000805b87811015611be6578484038b52825160408151818752611b7d82880182611556565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b82811015611bcf57601f19858303018452611bbd828751611556565b958d0195938d01939150600101611ba1565b509e8b019e97505050938801935050600101611b5b565b50919998505050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611c7257898603605f1901845284518051888852611c4689890182611556565b9184015188830389860152919050611c5e8183611556565b975050509381019392810192600101611c22565b50808801519550888503818a0152505050506116be8183611b3b565b600081518084526020808501808196506005915083821b81018387016000805b87811015611be6578484038b52825160408151818752611cd082880182611556565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b82811015611d2257601f19858303018452611d10828751611556565b958d0195938d01939150600101611cf4565b509e8b019e97505050938801935050600101611cae565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015611db657898603605f1901845284518051888852611d8a89890182611556565b9184015188830389860152919050611da28183611556565b975050509381019392810192600101611d66565b50808801519550888503818a0152505050506116be8183611c8e565b6001600160a01b0384168152606060208201819052600090611df690830185611556565b8281036040840152835160e08252611e1160e083018261162b565b905060208501518282036020840152611e2a8282611759565b91505060408501518282036040840152611e448282611875565b91505060608501518282036060840152611e5e8282611993565b91505060808501518282036080840152611e788282611ab1565b91505060a085015182820360a0840152611e928282611bf5565b91505060c085015182820360c0840152611eac8282611d39565b98975050505050505050565b600060208284031215611eca57600080fd5b8151611ed5816109f9565b9392505050565b6001600160a01b0383168152604060208201819052600090611f0090830184611556565b94935050505056fea2646970667358221220d3731353afc54562deabb045fa5ce95f9efdd0b37a17d2865f0f2a2f0c23130764736f6c63430008120033

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

0000000000000000000000003c3d99fd298f679dbc2cecd132b4ec4d0f5e6e72

-----Decoded View---------------
Arg [0] : _roleStore (address): 0x3c3d99FD298f679DBC2CEcd132b4eC4d0F5e6e72

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c3d99fd298f679dbc2cecd132b4ec4d0f5e6e72


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

Transaction 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.