ETH Price: $2,950.06 (-0.19%)

Contract

0xF17cFb98A641899Bd07ee0690531FCACBec013B2

Overview

ETH Balance

0.778497747801113837 ETH

ETH Value

$2,296.61 (@ $2,950.06/ETH)

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Deposit Eth364753482026-01-24 20:59:435 hrs ago1769288383IN
0xF17cFb98...CBec013B2
0.0015 ETH0.000006080.04525
Claim Eth364314332026-01-24 16:02:4710 hrs ago1769270567IN
0xF17cFb98...CBec013B2
0 ETH0.000005350.04525
Deposit Eth364313582026-01-24 16:02:2310 hrs ago1769270543IN
0xF17cFb98...CBec013B2
0.002 ETH0.00000610.04525
Deposit Eth364164642026-01-24 14:21:1412 hrs ago1769264474IN
0xF17cFb98...CBec013B2
0.001 ETH0.000007290.04525
Deposit Eth364101532026-01-24 13:38:1813 hrs ago1769261898IN
0xF17cFb98...CBec013B2
0.0004 ETH0.000006350.04525
Claim Eth363473082026-01-24 5:21:1821 hrs ago1769232078IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth363468412026-01-24 5:16:4121 hrs ago1769231801IN
0xF17cFb98...CBec013B2
0.0001 ETH0.000007290.04525
Claim Eth363199812026-01-24 1:45:5625 hrs ago1769219156IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth363198012026-01-24 1:44:3325 hrs ago1769219073IN
0xF17cFb98...CBec013B2
0.015 ETH0.000006080.04525
Claim Eth363185832026-01-24 1:35:2125 hrs ago1769218521IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth363182782026-01-24 1:33:1425 hrs ago1769218394IN
0xF17cFb98...CBec013B2
0.001 ETH0.000007290.04525
Claim Eth363078932026-01-24 0:00:1326 hrs ago1769212813IN
0xF17cFb98...CBec013B2
0 ETH0.000004760.04525
Deposit Eth363078422026-01-23 23:59:4826 hrs ago1769212788IN
0xF17cFb98...CBec013B2
0.002 ETH0.000006080.04525
Claim Eth363042202026-01-23 23:25:4627 hrs ago1769210746IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth363041272026-01-23 23:24:5127 hrs ago1769210691IN
0xF17cFb98...CBec013B2
0.0072 ETH0.000006090.04525
Claim Eth363025172026-01-23 23:08:4427 hrs ago1769209724IN
0xF17cFb98...CBec013B2
0 ETH0.000004760.04525
Deposit Eth363024042026-01-23 23:07:3227 hrs ago1769209652IN
0xF17cFb98...CBec013B2
0.0076 ETH0.000005130.04525
Claim Eth363011532026-01-23 22:55:0327 hrs ago1769208903IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth363010992026-01-23 22:54:3028 hrs ago1769208870IN
0xF17cFb98...CBec013B2
0.01 ETH0.000006090.04525
Claim Eth362997292026-01-23 22:41:2428 hrs ago1769208084IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth362996462026-01-23 22:40:3428 hrs ago1769208034IN
0xF17cFb98...CBec013B2
0.0068 ETH0.000006090.04525
Claim Eth362979412026-01-23 22:23:5528 hrs ago1769207035IN
0xF17cFb98...CBec013B2
0 ETH0.000004760.04525
Deposit Eth362978582026-01-23 22:23:1428 hrs ago1769206994IN
0xF17cFb98...CBec013B2
0.008 ETH0.000005140.04525
Claim Eth362964242026-01-23 22:11:0328 hrs ago1769206263IN
0xF17cFb98...CBec013B2
0 ETH0.000005340.04525
Deposit Eth362962872026-01-23 22:09:5828 hrs ago1769206198IN
0xF17cFb98...CBec013B2
0.0078 ETH0.000006090.04525
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
364753482026-01-24 20:59:435 hrs ago1769288383
0xF17cFb98...CBec013B2
0.0015 ETH
364314332026-01-24 16:02:4710 hrs ago1769270567
0xF17cFb98...CBec013B2
0.0019933 ETH
364313582026-01-24 16:02:2310 hrs ago1769270543
0xF17cFb98...CBec013B2
0.002 ETH
364164642026-01-24 14:21:1412 hrs ago1769264474
0xF17cFb98...CBec013B2
0.001 ETH
364101532026-01-24 13:38:1813 hrs ago1769261898
0xF17cFb98...CBec013B2
0.0004 ETH
363473082026-01-24 5:21:1821 hrs ago1769232078
0xF17cFb98...CBec013B2
0.0001187 ETH
363468412026-01-24 5:16:4121 hrs ago1769231801
0xF17cFb98...CBec013B2
0.0001 ETH
363199812026-01-24 1:45:5625 hrs ago1769219156
0xF17cFb98...CBec013B2
0.0148952 ETH
363198012026-01-24 1:44:3325 hrs ago1769219073
0xF17cFb98...CBec013B2
0.015 ETH
363185832026-01-24 1:35:2125 hrs ago1769218521
0xF17cFb98...CBec013B2
0.00179 ETH
363182782026-01-24 1:33:1425 hrs ago1769218394
0xF17cFb98...CBec013B2
0.001 ETH
363078932026-01-24 0:00:1326 hrs ago1769212813
0xF17cFb98...CBec013B2
0.002009 ETH
363078422026-01-23 23:59:4826 hrs ago1769212788
0xF17cFb98...CBec013B2
0.002 ETH
363042202026-01-23 23:25:4627 hrs ago1769210746
0xF17cFb98...CBec013B2
0.0071791 ETH
363041272026-01-23 23:24:5127 hrs ago1769210691
0xF17cFb98...CBec013B2
0.0072 ETH
363025172026-01-23 23:08:4427 hrs ago1769209724
0xF17cFb98...CBec013B2
0.0075636 ETH
363024042026-01-23 23:07:3227 hrs ago1769209652
0xF17cFb98...CBec013B2
0.0076 ETH
363011532026-01-23 22:55:0327 hrs ago1769208903
0xF17cFb98...CBec013B2
0.0100036 ETH
363010992026-01-23 22:54:3028 hrs ago1769208870
0xF17cFb98...CBec013B2
0.01 ETH
362997292026-01-23 22:41:2428 hrs ago1769208084
0xF17cFb98...CBec013B2
0.0067431 ETH
362996462026-01-23 22:40:3428 hrs ago1769208034
0xF17cFb98...CBec013B2
0.0068 ETH
362979412026-01-23 22:23:5528 hrs ago1769207035
0xF17cFb98...CBec013B2
0.0079826 ETH
362978582026-01-23 22:23:1428 hrs ago1769206994
0xF17cFb98...CBec013B2
0.008 ETH
362964242026-01-23 22:11:0328 hrs ago1769206263
0xF17cFb98...CBec013B2
0.0077632 ETH
362962872026-01-23 22:09:5828 hrs ago1769206198
0xF17cFb98...CBec013B2
0.0078 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Gridle

Compiler Version
v0.8.24+commit.e11b9ed9

ZkSolc Version
v1.5.7

Optimization Enabled:
Yes with Mode 3

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.0;

import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";

//┌─────────────────────────────────────────────────────────┐
//│                        +----+----+----+----+            │
//│                        | 4x |BID | 5x | 7x |            │
//│                        +----+----+----+----+            │
//│                      ▁▁▁WIN | 3x | 4x | 5x |            │
//│                      ▏ +----+----+----+----+            │
//│▔▔▔▏     ▏         ▁▁▏  | 2x | 3x |BID | 6x |            │
//│    ▏    ▏▔▔▏     ▏     +----+----+----+----+            │
//│     ▏  ▏   ▔▔▏  ▏      | 3x | 4x | 5x | 7x |            │
//│     ▏▔▔      ▔▔▔       +----+----+----+----+            │
//│                        | 5x | 6x | 8x |10x |            │
//└─────────────────────────────────────────────────────────┘
//0s   5s   10s   15s   20s  25s  30s  35s  40s  45s   → Time

/// @title Gridle game
/// @notice A payment grid contract that handles ETH deposits, claims, and refunds with signature verification
/// @dev Uses cryptographic signatures to authorize deposits and claims. Each order ID can only be processed once to prevent
///      double spending. Supports role-based refunds for ETH.
contract Gridle is AccessControl {
    bytes32 public constant WITHDRAW_ROLE = keccak256("WITHDRAW_ROLE");
    bytes32 public constant REFUND_ROLE = keccak256("REFUND_ROLE");

    /// @notice Address used to verify deposit signatures
    address public signerAddress;

    /// @notice Address to receive automatic withdrawals when balance exceeds limits
    address public withdrawAddress;

    /// @notice Mapping to track processed order IDs to prevent double spending
    mapping(uint => bool) public processedOrders;

    /// @notice Mapping to track last deposited amount per account for refund validation
    mapping(address => uint256) public deposits;

    /// @notice Minimum balance target as a percentage of systemBalance (in basis points)
    /// @dev Target balance after withdrawal = systemBalance * minReservesCoef / 10000
    /// @dev Example: 11000 = 110% means keep 110% of systemBalance (if systemBalance=100 ETH, keep 110 ETH)
    uint256 public minReservesCoef;

    /// @notice Maximum balance threshold as a percentage of systemBalance (in basis points)
    /// @dev When balance exceeds systemBalance * maxReservesCoef / 10000, auto-withdrawal triggers
    /// @dev Example: 15000 = 150% means trigger withdrawal when balance > 150% of systemBalance
    uint256 public maxReservesCoef;

    /// @notice Absolute minimum ETH buffer to maintain regardless of systemBalance
    /// @dev Used as a safety floor when systemBalance is very low or zero
    /// @dev If (systemBalance + minReserves) > coefficient-based target, this value is used instead
    uint256 public minReserves;

    /// @notice Last processed signId to track order sequence
    uint256 public lastSignId;


    /// @notice Error thrown when a provided signature is invalid
    error WrongSignature();

    /// @notice Error thrown when an order has already been processed
    error OrderAlreadyProcessed();

    /// @notice Error thrown when a zero address is provided where not allowed
    error ZeroAddress();

    /// @notice Error thrown when ETH transfer fails
    error EthTransferFailed();

    /// @notice Error thrown when reserved amount exceeds available balance
    error InsufficientBalance();

    /// @notice Error thrown when deadline has passed
    error DeadlineExpired();

    /// @notice Error thrown when refund amount exceeds deposit amount
    error InvalidRefundAmount();


    /// @notice Emitted when a successful ETH deposit is made
    /// @param signId The unique identifier for the order
    /// @param depositor The address that made the deposit
    /// @param amount The amount deposited in wei
    event EthDeposited(uint indexed signId, address indexed depositor, uint256 amount);

    /// @notice Emitted when a successful ETH claim is made
    /// @param signId The unique identifier for the order
    /// @param account The address that claimed the payment
    /// @param amount The amount claimed in wei
    event EthClaimed(uint indexed signId, address indexed account, uint256 amount);


    /// @notice Emitted when ETH is refunded to an account
    /// @param account The address that received the refund
    /// @param amount The amount refunded in wei
    event EthRefunded(address indexed account, uint256 amount);


    /// @notice Emitted when reserve parameters are updated
    /// @param minReservesCoef The new minimum reserves coefficient
    /// @param maxReservesCoef The new maximum reserves coefficient
    /// @param minReserves The new minimum reserves amount
    event ReserveParametersUpdated(uint256 minReservesCoef, uint256 maxReservesCoef, uint256 minReserves);

    /// @notice Emitted when automatic withdrawal occurs
    /// @param token The token address (address(0) for ETH)
    /// @param amount The amount automatically withdrawn
    /// @param recipient The address that received the withdrawal
    event AutoWithdrawal(address indexed token, uint256 amount, address indexed recipient);

    /// @notice Emitted when contract receives ETH directly
    /// @param sender The address that sent ETH to the contract
    /// @param amount The amount sent in wei
    event Topup(address indexed sender, uint256 amount);

    /// @param defaultAdmin The address that will initially own the admin role
    /// @param _signerAddress The address authorized to sign deposit approvals
    constructor(address defaultAdmin, address _signerAddress) {
        if (defaultAdmin == address(0)) {
            revert ZeroAddress();
        }
        _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);
        _grantRole(WITHDRAW_ROLE, defaultAdmin);
        _grantRole(REFUND_ROLE, defaultAdmin);
        signerAddress = _signerAddress;
        withdrawAddress = defaultAdmin;

        // Set default reserve coefficients: min 110%, max 120%
        // Must be > 100% (10000) to maintain reserves above systemBalance
        minReservesCoef = 11000;  // 110% (11000/10000)
        maxReservesCoef = 12000;  // 120% (12000/10000)
        minReserves = 1 ether;
    }


    /// @notice Allows an admin to update the authorized signer address
    /// @param newSigner The new signer address
    function setSigner(address newSigner) external onlyRole(DEFAULT_ADMIN_ROLE) {
        signerAddress = newSigner;
    }

    /// @notice Set reserve parameters including coefficients and absolute minimum reserves
    /// @param _minReservesCoef The minimum reserves coefficient in basis points (10000 = 100%)
    /// @param _maxReservesCoef The maximum reserves coefficient in basis points (10000 = 100%)
    /// @param _minReserves The absolute minimum reserves amount that must always be present
    function setReserveParameters(
        uint256 _minReservesCoef,
        uint256 _maxReservesCoef,
        uint256 _minReserves
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_minReservesCoef > 10000, "Min coefficient must be > 100% (10000)");
        require(_maxReservesCoef > 10000, "Max coefficient must be > 100% (10000)");
        require(_minReservesCoef <= _maxReservesCoef, "Min coefficient must be <= max coefficient");
        minReservesCoef = _minReservesCoef;
        maxReservesCoef = _maxReservesCoef;
        minReserves = _minReserves;
        emit ReserveParametersUpdated(_minReservesCoef, _maxReservesCoef, _minReserves);
    }

    /// @notice Set the address to receive automatic withdrawals
    /// @param _withdrawAddress The address to receive automatic withdrawals
    function setWithdrawAddress(address _withdrawAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
        if (_withdrawAddress == address(0)) {
            revert ZeroAddress();
        }
        withdrawAddress = _withdrawAddress;
    }

    /// @notice Internal function to handle automatic ETH withdrawals when balance exceeds limits
    /// @param systemBalance The required system balance (funds needed for operations)
    function _autoWithdraw(uint256 systemBalance) internal {
        // Calculate the total balance targets using coefficients
        // Example: if systemBalance = 100 ETH and minReservesCoef = 11000 (110%)
        // then minTargetFromCoef = 110 ETH (keeping 110% of what's needed)
        uint256 minTargetFromCoef = (systemBalance * minReservesCoef) / 10000;
        uint256 maxTargetFromCoef = (systemBalance * maxReservesCoef) / 10000;

        // Ensure we keep at least the coefficient-based target OR systemBalance + absolute minimum
        // This provides a safety floor: either percentage-based or fixed minimum buffer
        uint256 effectiveMinTarget = minTargetFromCoef > (systemBalance + minReserves)
            ? minTargetFromCoef
            : (systemBalance + minReserves);

        // Check if current balance exceeds the maximum allowed threshold
        uint256 currentBalance = address(this).balance;
        uint256 maxAllowed = maxTargetFromCoef;

        if (currentBalance > maxAllowed) {
            // Withdraw excess funds down to the minimum target balance
            uint256 targetBalance = effectiveMinTarget;
            if (currentBalance > targetBalance) {
                uint256 withdrawAmount = currentBalance - targetBalance;
                (bool success, ) = payable(withdrawAddress).call{
                    value: withdrawAmount
                }("");
                if (success) {
                    emit AutoWithdrawal(address(0), withdrawAmount, withdrawAddress);
                }
            }
        }
    }

    /// @notice Deposit ether with signature verification. Can also be used for time limited bids.
    /// @param signId The unique identifier for this order
    /// @param deadline The deadline timestamp after which the signature is invalid
    /// @param systemBalance The system balance parameter
    /// @param sigV The V component of the signature
    /// @param sigR The R component of the signature
    /// @param sigS The S component of the signature
    function depositEth(
        uint signId,
        uint deadline,
        uint systemBalance,
        uint8 sigV,
        bytes32 sigR,
        bytes32 sigS
    ) external payable {
        if (processedOrders[signId]) {
            revert OrderAlreadyProcessed();
        }

        if (block.timestamp > deadline) {
            revert DeadlineExpired();
        }

        bytes32 msgHash = keccak256(
            abi.encode(signId, msg.sender, msg.value, deadline, systemBalance, address(this))
        );
        if (ecrecover(msgHash, sigV, sigR, sigS) != signerAddress) {
            revert WrongSignature();
        }

        processedOrders[signId] = true;

        // Track last deposit amount for refund validation
        deposits[msg.sender] = msg.value;

        emit EthDeposited(signId, msg.sender, msg.value);

        // Auto-withdraw excess ETH balance only if this is a newer signId to be sure that systemBalance is fresh data
        if (signId > lastSignId) {
            lastSignId = signId;
            _autoWithdraw(systemBalance);
        }
    }


    /// @notice Claim payment for an order with signature verification
    /// @param signId The unique identifier for the order
    /// @param account The account to receive the payment
    /// @param value The amount to claim
    /// @param sigV The V component of the signature
    /// @param sigR The R component of the signature
    /// @param sigS The S component of the signature
    function claimEth(
        uint signId,
        address account,
        uint256 value,
        uint8 sigV,
        bytes32 sigR,
        bytes32 sigS
    ) external {
        if (processedOrders[signId]) {
            revert OrderAlreadyProcessed();
        }

        bytes32 msgHash = keccak256(
            abi.encode(signId, account, value, address(this))
        );
        if (ecrecover(msgHash, sigV, sigR, sigS) != signerAddress) {
            revert WrongSignature();
        }

        processedOrders[signId] = true;

        // Clear deposit record when claimed (claimed funds are no longer refundable)
        deposits[account] = 0;

        (bool success, ) = payable(account).call{value: value}("");
        if (!success) {
            revert EthTransferFailed();
        }

        emit EthClaimed(signId, account, value);
    }


    /// @notice Withdraws ETH held by the contract to the caller, leaving a reserved amount
    /// @param reserved The amount of ETH to leave in the contract
    function withdrawEth(uint256 reserved) external onlyRole(WITHDRAW_ROLE) {
        uint256 balance = address(this).balance;
        if (balance < reserved) {
            revert InsufficientBalance();
        }
        uint256 withdrawAmount = balance - reserved;
        (bool success, ) = payable(msg.sender).call{
            value: withdrawAmount
        }("");
        if (!success) {
            revert EthTransferFailed();
        }
    }

    /// @notice Refund ETH to a specific account (amount must be <= deposit)
    /// @param account The account to receive the refund
    /// @param value The amount to refund in wei
    function refundEth(address account, uint256 value) external onlyRole(REFUND_ROLE) {
        if (account == address(0)) {
            revert ZeroAddress();
        }

        // Validate refund amount doesn't exceed deposit amount
        if (deposits[account] < value) {
            revert InvalidRefundAmount();
        }

        // Reset the deposit record
        deposits[account] = 0;

        (bool success, ) = payable(account).call{value: value}("");
        if (!success) {
            revert EthTransferFailed();
        }
        emit EthRefunded(account, value);
    }

    /// @notice Allows contract to receive ETH transfers directly
    receive() external payable {
        emit Topup(msg.sender, msg.value);
    }

}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;

import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {IERC165, ERC165} from "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)

pragma solidity >=0.8.4;

/**
 * @dev External interface of AccessControl declared to support ERC-165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted to signal this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi",
        "metadata"
      ],
      "": [
        "ast"
      ]
    }
  },
  "detectMissingLibraries": false,
  "forceEVMLA": false,
  "enableEraVMExtensions": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"defaultAdmin","type":"address"},{"internalType":"address","name":"_signerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"EthTransferFailed","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidRefundAmount","type":"error"},{"inputs":[],"name":"OrderAlreadyProcessed","type":"error"},{"inputs":[],"name":"WrongSignature","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"AutoWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"signId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"signId","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minReservesCoef","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxReservesCoef","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minReserves","type":"uint256"}],"name":"ReserveParametersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Topup","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint8","name":"sigV","type":"uint8"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"}],"name":"claimEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"systemBalance","type":"uint256"},{"internalType":"uint8","name":"sigV","type":"uint8"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"}],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReservesCoef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minReservesCoef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processedOrders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"refundEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minReservesCoef","type":"uint256"},{"internalType":"uint256","name":"_maxReservesCoef","type":"uint256"},{"internalType":"uint256","name":"_minReserves","type":"uint256"}],"name":"setReserveParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"setWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

9c4d535b000000000000000000000000000000000000000000000000000000000000000001000255b0affb844eb48feff8d67efff7ca68321d4891dd2e10f5f14e4237600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000ef80626c6406ec0bf9720e2e81c066396c000000000000000000000000020000dc5611f4258cb9c0b0d0da971cdba8b96a9

Deployed Bytecode

0x0003000000000002000a0000000000020000006003100270000001f9033001970002000000310355000100000001035500000001002001900000001f0000c13d0000008002000039000000400020043f000000040030008c000000500000413d000000000201043b000000e0022002700000020a0020009c000000620000213d0000021a0020009c000000710000213d000002220020009c000000a00000213d000002260020009c000001ca0000613d000002270020009c000001db0000613d000002280020009c000005c90000c13d0000000001000416000000000001004b000005c90000c13d0000000201000039000003a00000013d0000000002000416000000000002004b000005c90000c13d0000001f02300039000001fa022001970000008002200039000000400020043f0000001f0430018f000001fb053001980000008002500039000000300000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000002c0000c13d000000000004004b0000003d0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c000005c90000413d000000800300043d000001fc0030009c000005c90000213d000000a00100043d000800000001001d000001fc0010009c000005c90000213d000000000003004b0000011e0000c13d000000400100043d00000246020000410000000000210435000001f90010009c000001f901008041000000400110021000000237011001c7000007e200010430000000000003004b000005c90000c13d0000000001000416000000800010043f0000000001000414000001f90010009c000001f901008041000000c00110021000000208011001c70000800d0200003900000002030000390000000005000411000002090400004107e007d60000040f0000000100200190000005c90000613d0000000001000019000007e10001042e0000020b0020009c0000007e0000213d000002130020009c000000e30000213d000002170020009c000002940000613d000002180020009c000002990000613d000002190020009c000005c90000c13d0000000001000416000000000001004b000005c90000c13d00000005010000390000037a0000013d0000021b0020009c000000ef0000213d0000021f0020009c000002c50000613d000002200020009c000002d60000613d000002210020009c000005c90000c13d0000000001000416000000000001004b000005c90000c13d00000006010000390000037a0000013d0000020c0020009c000001080000213d000002100020009c000002fa0000613d000002110020009c000003230000613d000002120020009c000005c90000c13d000000440030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000002402100370000000000202043b000800000002001d000001fc0020009c000005c90000213d0000000401100370000000000101043b000700000001001d000000000010043f000000200000043f0000004002000039000000000100001907e007c10000040f0000000101100039000000000101041a07e007420000040f0000000701000029000000080200002907e007710000040f0000000001000019000007e10001042e000002230020009c0000035b0000613d000002240020009c000003690000613d000002250020009c000005c90000c13d000000440030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000402100370000000000202043b000800000002001d0000002401100370000000000101043b000700000001001d000001fc0010009c000005c90000213d0000000801000029000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000101100039000000000101041a000600000001001d000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff001001900000044d0000c13d000000400100043d00000024021000390000000603000029000003500000013d000002140020009c000003760000613d000002150020009c0000037e0000613d000002160020009c000005c90000c13d0000000001000416000000000001004b000005c90000c13d000000800000043f0000022901000041000007e10001042e0000021c0020009c0000039c0000613d0000021d0020009c000003a50000613d0000021e0020009c000005c90000c13d000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000800000001001d000001fc0010009c000005c90000213d07e007210000040f0000000101000039000000000201041a00000205022001970000000803000029000000000232019f000000000021041b0000000001000019000007e10001042e0000020d0020009c000003ac0000613d0000020e0020009c000003b30000613d0000020f0020009c000005c90000c13d000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000001fc0010009c000005c90000213d000000000010043f0000000401000039000000200010043f0000004002000039000000000100001907e007c10000040f0000037a0000013d000000000030043f000001fd01000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c70000801002000039000700000003001d07e007db0000040f00000007030000290000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000001500000c13d000000000030043f000001fd01000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000001000414000001f90010009c000001f901008041000000c001100210000001ff011001c70000800d020000390000000403000039000000000700041100000200040000410000000005000019000000070600002907e007d60000040f00000007030000290000000100200190000005c90000613d000000000030043f0000020101000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f00000007030000290000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000001810000c13d000000000030043f0000020101000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000001000414000001f90010009c000001f901008041000000c001100210000001ff011001c70000800d020000390000000403000039000000000700041100000200040000410000020205000041000000070600002907e007d60000040f00000007030000290000000100200190000005c90000613d000000000030043f0000020301000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f00000007030000290000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000001b20000c13d000000000030043f0000020301000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000001000414000001f90010009c000001f901008041000000c001100210000001ff011001c70000800d020000390000000403000039000000000700041100000200040000410000020405000041000000070600002907e007d60000040f00000007030000290000000100200190000005c90000613d0000000101000039000000000201041a000002050220019700000008022001af000000000021041b0000000201000039000000000201041a0000020502200197000000000232019f000000000021041b00002af8010000390000000502000039000000000012041b00002ee0010000390000000602000039000000000012041b00000206010000410000000702000039000000000012041b0000002001000039000001000010044300000120000004430000020701000041000007e10001042e000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b0000024e00100198000005c90000c13d0000024f0010009c00000000020000390000000102006039000002500010009c00000001022061bf000000800020043f0000022901000041000007e10001042e000000c40030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000402100370000000000202043b000800000002001d0000002402100370000000000202043b000700000002001d000001fc0020009c000005c90000213d0000004402100370000000000202043b000600000002001d0000006401100370000000000101043b000500000001001d000000ff0010008c000005c90000213d0000000801000029000000000010043f0000000301000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000003f80000c13d000000400300043d00000080013000390000000002000410000000000021043500000060013000390000000602000029000000000021043500000040013000390000000702000029000000000021043500000080010000390000000001130436000000080200002900000000002104350000024a0030009c0000071b0000813d000000a002300039000300000002001d000000400020043f000001f90010009c000001f9010080410000004001100210000400000003001d0000000002030433000001f90020009c000001f9020080410000006002200210000000000112019f00000001020003670000008403200370000000000303043b000200000003001d000000a402200370000000000202043b000100000002001d0000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f000001ff011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000030300002900000000001304350000000402000029000001000120003900000001040000290000000000410435000000e00120003900000002040000290000000000410435000000c00120003900000005020000290000000000210435000000000000043f000001f90030009c000001f90300804100000040013002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000022d011001c70000000102000039000500000002001d07e007db0000040f0000006003100270000001f903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000002560000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002520000c13d000000000005004b000002630000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000000003001f00020000000103550000000100200190000005a70000613d0000000101000039000000000101041a000000000200043d000000000121013f000001fc00100198000006040000c13d0000000801000029000000000010043f0000000301000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000701000029000000000010043f0000000401000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000001041b00000000010004140000000702000029000000040020008c000006740000c13d0000000001000031000006860000013d0000000001000416000000000001004b000005c90000c13d00000008010000390000037a0000013d000000640030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000004402100370000000000202043b000600000002001d0000002402100370000000000202043b000700000002001d0000000401100370000000000101043b000800000001001d0000000001000411000000000010043f000001fd01000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000400200043d000000000101043b000000000101041a000000ff00100190000003eb0000c13d0000023a01000041000000000012043500000004012000390000000003000411000000000031043500000024012000390000000000010435000001f90020009c000001f90200804100000040012002100000023b011001c7000007e200010430000000440030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000002402100370000000000302043b000001fc0030009c000005c90000213d0000000002000411000000000023004b000003f40000c13d0000000401100370000000000101043b07e007710000040f0000000001000019000007e10001042e000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000800000001001d000001fc0010009c000005c90000213d0000000001000411000000000010043f000001fd01000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000003fb0000c13d000000400100043d0000023a02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000003560000013d000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000800000001001d0000020201000041000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000004020000c13d000000400100043d00000024021000390000020203000041000003500000013d000000440030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000402100370000000000202043b000800000002001d000001fc0020009c000005c90000213d0000002401100370000000000101043b000700000001001d0000020401000041000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff001001900000042c0000c13d000000400100043d0000002402100039000002040300004100000000003204350000023a020000410000000000210435000000040210003900000000030004110000000000320435000001f90010009c000001f90100804100000040011002100000023b011001c7000007e200010430000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000000000010043f000000200000043f0000004002000039000000000100001907e007c10000040f00000001011000390000037a0000013d000000240030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000000401100370000000000101043b000000000010043f0000000301000039000000200010043f00000040020000390000000001000019000003940000013d0000000001000416000000000001004b000005c90000c13d0000000701000039000000000101041a000000800010043f0000022901000041000007e10001042e000000440030008c000005c90000413d0000000002000416000000000002004b000005c90000c13d0000002402100370000000000202043b000800000002001d000001fc0020009c000005c90000213d0000000401100370000000000101043b000000000010043f000000200000043f0000004002000039000000000100001907e007c10000040f0000000802000029000000000020043f000000200010043f0000000001000019000000400200003907e007c10000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000022901000041000007e10001042e0000000001000416000000000001004b000005c90000c13d0000000101000039000000000101041a000001fc01100197000000800010043f0000022901000041000007e10001042e0000000001000416000000000001004b000005c90000c13d0000020401000041000000800010043f0000022901000041000007e10001042e0000000001000416000000000001004b000005c90000c13d0000020201000041000000800010043f0000022901000041000007e10001042e000000c40030008c000005c90000413d0000004402100370000000000202043b000600000002001d0000002402100370000000000202043b000700000002001d0000000402100370000000000202043b000800000002001d0000006401100370000000000101043b000500000001001d000000ff0010008c000005c90000213d0000000801000029000000000010043f0000000301000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000003f80000c13d0000022a0100004100000000001004430000000001000414000001f90010009c000001f901008041000000c0011002100000022b011001c70000800b0200003907e007db0000040f00000001002001900000057f0000613d000000400400043d000000000101043b0000000703000029000000000031004b000004970000a13d00000236010000410000000000140435000001f90040009c000001f904008041000000400140021000000237011001c7000007e2000104300000000805000029000027100050008c000004160000213d000000640120003900000243030000410000000000310435000000440120003900000245030000410000041e0000013d0000024701000041000000800010043f0000024801000041000007e200010430000000400100043d00000249020000410000004a0000013d0000000803000029000000000003004b000000480000613d0000000201000039000000000201041a0000020502200197000001040000013d00000230010000410000000000100443000000000100041000000004001004430000000001000414000001f90010009c000001f901008041000000c00110021000000231011001c70000800a0200003907e007db0000040f00000001002001900000057f0000613d000000000201043b0000000804000029000000000342004b000005800000813d000000400100043d0000023c020000410000004a0000013d0000000703000029000027100030008c000004420000213d00000064012000390000024303000041000000000031043500000044012000390000024403000041000000000031043500000024012000390000002603000039000000000031043500000241010000410000000000120435000000040120003900000020030000390000000000310435000001f90020009c000001f902008041000000400120021000000242011001c7000007e2000104300000000801000029000000000001004b000000480000613d000000000010043f0000000401000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000070010006c000005b30000813d000000400100043d00000239020000410000004a0000013d000000000035004b000005870000a13d00000064012000390000023f03000041000000000031043500000044012000390000024003000041000000000031043500000024012000390000002a03000039000004210000013d0000000801000029000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000702000029000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000101041a000000ff00100190000000600000c13d0000000801000029000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000702000029000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000001000414000001f90010009c000001f901008041000000c001100210000001ff011001c70000800d020000390000000403000039000002000400004100000008050000290000000706000029000000000700041107e007d60000040f0000000100200190000000600000c13d000005c90000013d000000a0014000390000000602000029000000000021043500000080014000390000000000310435000000c0010000390000000001140436000000c00240003900000000030004100000000000320435000000600240003900000000030004160000000000320435000000400240003900000000030004110000000000320435000000080200002900000000002104350000022c0040009c0000071b0000213d000000e002400039000400000002001d000000400020043f000001f90010009c000001f9010080410000004001100210000700000004001d0000000002040433000001f90020009c000001f9020080410000006002200210000000000112019f00000001020003670000008403200370000000000303043b000300000003001d000000a402200370000000000202043b000200000002001d0000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f000001ff011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000040300002900000000001304350000000702000029000001400120003900000002040000290000000000410435000001200120003900000003040000290000000000410435000001000120003900000005020000290000000000210435000000000000043f000001f90030009c000001f90300804100000040013002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000022d011001c70000000102000039000700000002001d07e007db0000040f0000006003100270000001f903300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000004f00000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000004ec0000c13d000000000005004b000004fd0000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000000003001f00020000000103550000000100200190000006070000613d0000000101000039000000000101041a000000000200043d000000000121013f000001fc00100198000006040000c13d0000000801000029000000000010043f0000000301000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000201041a000002510220019700000001022001bf000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b0000000002000416000000000021041b000000400100043d0000000000210435000001f90010009c000001f90100804100000040011002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000022e011001c70000800d0200003900000003030000390000022f040000410000000805000029000000000600041107e007d60000040f0000000100200190000005c90000613d0000000801000039000000000201041a000000080020006b000000600000a13d0000000802000029000000000021041b00000000010004150000000a0110008a0000000501100210000000060000006b0000000002000019000800000000001d000005590000613d0000000501000039000000000101041a00000006031000b900000006023000fa000000000012004b000006c60000c13d0000000001000415000000090110008a00000005011002100000000602000039000000000402041a00000006024000b900000006052000fa000000000045004b000006c60000c13d000827100030012200052710002001220000000501100270000000050100002f0000000701000039000000000101041a000000060010002a000006c60000413d000600060010002d00000230010000410000000000100443000000000100041000000004001004430000000001000414000001f90010009c000001f901008041000000c00110021000000231011001c70000800a0200003907e007db0000040f0000000604000029000000080040006b0000000003040019000000080300202900000001002001900000057f0000613d000000000101043b000000050010006c000000600000a13d0008000000310053000000600000a13d0000000201000039000000000201041a0000000001000414000001fc04200197000000040040008c000006cc0000c13d0000000001000031000006d90000013d000000000001042f00000000010004140000000005000411000000040050008c000005a00000c13d00000001020000390000000001000031000005d40000013d0000000501000039000000000051041b0000000601000039000000000031041b00000007010000390000000604000029000000000041041b00000040012000390000000000410435000000200120003900000000003104350000000000520435000001f90020009c000001f90200804100000040012002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000023d011001c70000800d0200003900000001030000390000023e040000410000005d0000013d000001f90010009c000001f901008041000000c001100210000000000042004b000005cb0000c13d0000000002050019000005cf0000013d0000001f0530018f000001fb06300198000000400200043d0000000004620019000006120000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005ae0000c13d000006120000013d0000000801000029000000000010043f0000000401000039000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000005c90000613d000000000101043b000000000001041b00000000010004140000000802000029000000040020008c000006250000c13d00000001020000390000000001000031000006360000013d0000000001000019000007e200010430000001ff011001c700008009020000390000000004050019000000000500001907e007d60000040f00020000000103550000006001100270000001f90010019d000001f901100197000000000001004b000005db0000c13d0000000100200190000000600000c13d000000400100043d0000024c020000410000004a0000013d000002320010009c0000071b0000213d0000001f0410003900000252044001970000003f044000390000025205400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000002320050009c0000071b0000213d00000001006001900000071b0000c13d000000400050043f000000000614043600000252031001980000001f0410018f00000000013600190000000205000367000005f60000613d000000000705034f000000007807043c0000000006860436000000000016004b000005f20000c13d000000000004004b000005d60000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000005d60000013d000000400100043d0000024b020000410000004a0000013d0000001f0530018f000001fb06300198000000400200043d0000000004620019000006120000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000060e0000c13d000000000005004b0000061f0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001f90020009c000001f9020080410000004002200210000000000112019f000007e200010430000001f90010009c000001f901008041000000c001100210000000070000006b0000062c0000c13d0000000802000029000006310000013d000001ff011001c7000080090200003900000007030000290000000804000029000000000500001907e007d60000040f00020000000103550000006001100270000001f90010019d000001f901100197000000000001004b0000064b0000c13d0000000100200190000005d80000613d000000400100043d00000007020000290000000000210435000001f90010009c000001f90100804100000040011002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000022e011001c70000800d020000390000000203000039000002380400004100000008050000290000005d0000013d000002320010009c0000071b0000213d0000001f0410003900000252044001970000003f044000390000025205400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000002320050009c0000071b0000213d00000001006001900000071b0000c13d000000400050043f000000000614043600000252031001980000001f0410018f00000000013600190000000205000367000006660000613d000000000705034f000000007807043c0000000006860436000000000016004b000006620000c13d000000000004004b000006380000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000006380000013d000001f90010009c000001f901008041000000c001100210000000060000006b0000067b0000c13d0000000702000029000006800000013d000001ff011001c7000080090200003900000006030000290000000704000029000000000500001907e007d60000040f000500000002001d00020000000103550000006001100270000001f90010019d000001f901100197000000000001004b0000069d0000c13d00000005010000290000000100100190000005d80000613d000000400100043d00000006020000290000000000210435000001f90010009c000001f90100804100000040011002100000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f0000022e011001c70000800d0200003900000003030000390000024d04000041000000080500002900000007060000290000005d0000013d000002320010009c0000071b0000213d0000001f0310003900000252033001970000003f033000390000025204300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000002320040009c0000071b0000213d00000001005001900000071b0000c13d000000400040043f000000000513043600000252021001980000001f0310018f00000000012500190000000204000367000006b80000613d000000000604034f000000006706043c0000000005750436000000000015004b000006b40000c13d000000000003004b000006880000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000006880000013d0000023401000041000000000010043f0000001101000039000000040010043f0000023501000041000007e200010430000001f90010009c000001f901008041000000c001100210000001ff011001c700008009020000390000000803000029000000000500001907e007d60000040f000700000002001d00020000000103550000006001100270000001f90010019d000001f901100197000000000001004b000006f20000c13d00000007010000290000000100100190000000600000613d0000000201000039000000000201041a000000400100043d00000008030000290000000000310435000001f90010009c000001f90100804100000040011002100000000003000414000001f90030009c000001f903008041000000c003300210000000000113019f0000022e011001c7000001fc062001970000800d020000390000000303000039000002330400004100000000050000190000005d0000013d000002320010009c0000071b0000213d0000001f0310003900000252033001970000003f033000390000025204300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000002320040009c0000071b0000213d00000001005001900000071b0000c13d000000400040043f000000000513043600000252021001980000001f0310018f000000000125001900000002040003670000070d0000613d000000000604034f000000006706043c0000000005750436000000000015004b000007090000c13d000000000003004b000006db0000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000006db0000013d0000023401000041000000000010043f0000004101000039000000040010043f0000023501000041000007e2000104300000000001000411000000000010043f000001fd01000041000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007330000613d000000000101043b000000000101041a000000ff00100190000007350000613d000000000001042d0000000001000019000007e200010430000000400100043d0000023a02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000001f90010009c000001f90100804100000040011002100000023b011001c7000007e2000104300001000000000002000100000001001d000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007610000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007610000613d000000000101043b000000000101041a000000ff00100190000007630000613d000000000001042d0000000001000019000007e200010430000000400100043d0000002402100039000000010300002900000000003204350000023a020000410000000000210435000000040210003900000000030004110000000000320435000001f90010009c000001f90100804100000040011002100000023b011001c7000007e2000104300002000000000002000100000002001d000200000001001d000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007be0000613d000000000101043b0000000102000029000001fc02200197000100000002001d000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007be0000613d000000000101043b000000000101041a000000ff00100190000007bd0000613d0000000201000029000000000010043f000000200000043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007be0000613d000000000101043b0000000102000029000000000020043f000000200010043f0000000001000414000001f90010009c000001f901008041000000c001100210000001fe011001c7000080100200003907e007db0000040f0000000100200190000007be0000613d000000000101043b000000000201041a0000025102200197000000000021041b0000000001000414000001f90010009c000001f901008041000000c001100210000001ff011001c70000800d020000390000000403000039000000000700041100000253040000410000000205000029000000010600002907e007d60000040f0000000100200190000007be0000613d000000000001042d0000000001000019000007e200010430000000000001042f000001f90010009c000001f9010080410000004001100210000001f90020009c000001f9020080410000006002200210000000000112019f0000000002000414000001f90020009c000001f902008041000000c002200210000000000112019f000001ff011001c7000080100200003907e007db0000040f0000000100200190000007d40000613d000000000101043b000000000001042d0000000001000019000007e200010430000007d9002104210000000102000039000000000001042d0000000002000019000000000001042d000007de002104230000000102000039000000000001042d0000000002000019000000000001042d000007e000000432000007e10001042e000007e200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d20be27040b8e00df40bca0df34743417f3574a156386188f7d7f14369e5ee82b5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec6d58a2655af2cd69143d408e70af0b0d9dc7bbcfa222b331e96c25160f5c508df1f91cdf1f18aaac45ca4aaddade87aabc2746f6d044da7cf8544558c5776172ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a764000000000002000000000000000000000000000000400000010000000000000000000200000000000000000000000000000000000020000000800000000000000000e42154258c884b86569a2717aa2a913a61e0c7e67ae153dc3c354b3e2d1a821a0000000000000000000000000000000000000000000000000000000070bbccdc00000000000000000000000000000000000000000000000000000000c311d04800000000000000000000000000000000000000000000000000000000e02023a000000000000000000000000000000000000000000000000000000000e02023a100000000000000000000000000000000000000000000000000000000e06dd85700000000000000000000000000000000000000000000000000000000fc7e286d00000000000000000000000000000000000000000000000000000000c311d04900000000000000000000000000000000000000000000000000000000cdeaa0d400000000000000000000000000000000000000000000000000000000d547741f0000000000000000000000000000000000000000000000000000000089650ca10000000000000000000000000000000000000000000000000000000089650ca20000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000000000000000000000a217fddf0000000000000000000000000000000000000000000000000000000070bbccdd00000000000000000000000000000000000000000000000000000000738b660500000000000000000000000000000000000000000000000000000000860f83890000000000000000000000000000000000000000000000000000000036568abd000000000000000000000000000000000000000000000000000000005b7633cf000000000000000000000000000000000000000000000000000000005b7633d000000000000000000000000000000000000000000000000000000000627c0906000000000000000000000000000000000000000000000000000000006c19e7830000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000003ab1a49400000000000000000000000000000000000000000000000000000000498256fe00000000000000000000000000000000000000000000000000000000248a9ca200000000000000000000000000000000000000000000000000000000248a9ca30000000000000000000000000000000000000000000000000000000024a27546000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000000f378e2d000000000000000000000000000000000000000000000000000000001581b6000000000000000000000000000000000000000020000000800000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff1f0000000000000000000000000000000000000080000000000000000000000000020000000000000000000000000000000000002000000000000000000000000068e6c1885896ef6bee8fc3c844a09f7f4216386f01abba29307b8914c078ad109cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390200000200000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff2d7037c69bcf96189308bafd217604e9c2e48dc9a53440d76a9deb9f79e4c0704e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000001ab7da6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ffab3269bdaceca4d1bbc53e74b982ac2b306687e17e21f1e499e7fdf6751ac816365d5f00000000000000000000000000000000000000000000000000000000e2517d3f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000f4d678b80000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000600000000000000000000000002d29bf5372a37714bd740b4bc269dcf08b0e39244636a0b57e080e0f7d41351d6f656666696369656e74000000000000000000000000000000000000000000004d696e20636f656666696369656e74206d757374206265203c3d206d6178206308c379a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000000000000000000000031303030302900000000000000000000000000000000000000000000000000004d617820636f656666696369656e74206d757374206265203e203130302520284d696e20636f656666696369656e74206d757374206265203e20313030252028d92e233d000000000000000000000000000000000000000000000000000000006697b232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000c6b10ad400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff60356a4418000000000000000000000000000000000000000000000000000000006d963f8800000000000000000000000000000000000000000000000000000000a36fc4ad282359d6ef9ef76f382c81149ff9d0247db534e73ba26f8a31c1019700000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000007965db0b00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9df642d80c04c6a0dd6785ea75e5005f804e78bcf62162e83a0fe978551f3147

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

00000000000000000000000000000ef80626c6406ec0bf9720e2e81c066396c000000000000000000000000020000dc5611f4258cb9c0b0d0da971cdba8b96a9

-----Decoded View---------------
Arg [0] : defaultAdmin (address): 0x00000eF80626C6406ec0bf9720e2e81C066396C0
Arg [1] : _signerAddress (address): 0x20000dC5611f4258cb9c0b0d0Da971cDba8b96a9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000ef80626c6406ec0bf9720e2e81c066396c0
Arg [1] : 00000000000000000000000020000dc5611f4258cb9c0b0d0da971cdba8b96a9


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.