ETH Price: $2,960.14 (-0.85%)

Contract

0x1Ac90099e2c9cA9c57FE6f79a510A4B6D1c38394

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Deposit Token364520742026-01-24 18:10:537 secs ago1769278253IN
0x1Ac90099...6D1c38394
0 ETH0.000005070.04525
Deposit Token364513412026-01-24 18:05:525 mins ago1769277952IN
0x1Ac90099...6D1c38394
0 ETH0.000008010.04525
Deposit Token364501922026-01-24 17:58:0512 mins ago1769277485IN
0x1Ac90099...6D1c38394
0 ETH0.0000080.04525
Deposit Token364425292026-01-24 17:09:171 hr ago1769274557IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
Deposit Token364395682026-01-24 16:50:581 hr ago1769273458IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
Claim Token364304742026-01-24 15:57:112 hrs ago1769270231IN
0x1Ac90099...6D1c38394
0 ETH0.000006980.04525
Deposit Token364280772026-01-24 15:40:432 hrs ago1769269243IN
0x1Ac90099...6D1c38394
0 ETH0.00000630.04525
Claim Token364230912026-01-24 15:06:093 hrs ago1769267169IN
0x1Ac90099...6D1c38394
0 ETH0.00000480.04525
Deposit Token364227462026-01-24 15:03:423 hrs ago1769267022IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
Deposit Token364224222026-01-24 15:01:163 hrs ago1769266876IN
0x1Ac90099...6D1c38394
0 ETH0.000005560.04525
Deposit Token364211572026-01-24 14:52:333 hrs ago1769266353IN
0x1Ac90099...6D1c38394
0 ETH0.000006080.04525
Claim Token364061662026-01-24 13:09:395 hrs ago1769260179IN
0x1Ac90099...6D1c38394
0 ETH0.000004580.04525
Deposit Token364052032026-01-24 13:02:185 hrs ago1769259738IN
0x1Ac90099...6D1c38394
0 ETH0.000005360.04525
Claim Token364048202026-01-24 12:59:255 hrs ago1769259565IN
0x1Ac90099...6D1c38394
0 ETH0.000006660.04525
Deposit Token364043122026-01-24 12:55:165 hrs ago1769259316IN
0x1Ac90099...6D1c38394
0 ETH0.000005560.04525
Deposit Token364034122026-01-24 12:48:455 hrs ago1769258925IN
0x1Ac90099...6D1c38394
0 ETH0.000004850.04525
Claim Token364031992026-01-24 12:47:195 hrs ago1769258839IN
0x1Ac90099...6D1c38394
0 ETH0.000006190.04525
Deposit Token364026372026-01-24 12:43:235 hrs ago1769258603IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
Deposit Token364017052026-01-24 12:35:535 hrs ago1769258153IN
0x1Ac90099...6D1c38394
0 ETH0.000005340.04525
Deposit Token364011322026-01-24 12:31:375 hrs ago1769257897IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
Deposit Token363987072026-01-24 12:13:235 hrs ago1769256803IN
0x1Ac90099...6D1c38394
0 ETH0.000006330.04525
Claim Token363973472026-01-24 12:02:346 hrs ago1769256154IN
0x1Ac90099...6D1c38394
0 ETH0.000006960.04525
Deposit Token363951532026-01-24 11:44:456 hrs ago1769255085IN
0x1Ac90099...6D1c38394
0 ETH0.000005070.04525
Claim Token363950492026-01-24 11:44:066 hrs ago1769255046IN
0x1Ac90099...6D1c38394
0 ETH0.000006190.04525
Deposit Token363945152026-01-24 11:40:066 hrs ago1769254806IN
0x1Ac90099...6D1c38394
0 ETH0.000006540.04525
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
320079582025-12-24 14:37:1631 days ago1766587036  Contract Creation0 ETH
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Bank

Compiler Version
v0.8.24+commit.e11b9ed9

ZkSolc Version
v1.5.15

Optimization Enabled:
Yes with Mode 3

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.0.0
//
// Roach Racing Club makes trading a social and competitive game —
// play with friends, prove your edge, and win while having fun
// https://roach.fun
/*
                                                                   ..::--------::..
                                                               .:--------------------::
                                                            :----------------------------:
                                                         .:---------------------------------.
                                                        :-------------------------------------
                                                      .----------------------------------------:
                                                     :------------------------------------------:
                                                    :--===----------------------------------===--:
                                                   .--+@@@@%%#+=----------------------=+*#%@@@@+--:
                                                   ---@@@@@@@@@@@#+----------------+#@@@@@@@@@@@=--
                                                  :--+@@@@@@@@@@@@@@#+----------=#@@@@@@@@@@@@@@*--:
                                                  ---#@@@@@@@@@@@@@@@@%+------=%@@@@@@@@@@@@@@@@%---
                                                  -----==+*%@@@@@@@@@@@@%=--=#@@@@@@@@@@@@%*++=-----
                                                  -----------=*@@@@@@@@@@@*+@@@@@@@@@@@#+-----------
                                                  :-------------+%@@@@@@@@@@@@@@@@@@%+-------------:
                                                   ---------------*@@@@@@@@@@@@@@@@*---------------
                                                   :---------------=@@@@@@@@@@@@@@+---------------:
                                                    :---------------=@@@@@@@@@@@@=----------------
                                                     :---------------+@@@@@@@@@@*---------------:
                                                      :---------------%@@@@@@@@@---------------:
                                                        --------------#@@@@@@@@%--------------.
                                                         .------------#@@@@@@@@#------------.
                                                            :---------*@@@@@@@@#---------:.
                                                               :----------------------:.
                                                                     ..::--------:::.



███████╗██╗  ██╗ █████╗ ██████╗  ██████╗ ██╗    ██╗    ███████╗██╗   ██╗███╗   ██╗██████╗ ██╗ ██████╗ █████╗ ████████╗███████╗    ██╗███╗   ██╗ ██████╗
██╔════╝██║  ██║██╔══██╗██╔══██╗██╔═══██╗██║    ██║    ██╔════╝╚██╗ ██╔╝████╗  ██║██╔══██╗██║██╔════╝██╔══██╗╚══██╔══╝██╔════╝    ██║████╗  ██║██╔════╝
███████╗███████║███████║██║  ██║██║   ██║██║ █╗ ██║    ███████╗ ╚████╔╝ ██╔██╗ ██║██║  ██║██║██║     ███████║   ██║   █████╗      ██║██╔██╗ ██║██║
╚════██║██╔══██║██╔══██║██║  ██║██║   ██║██║███╗██║    ╚════██║  ╚██╔╝  ██║╚██╗██║██║  ██║██║██║     ██╔══██║   ██║   ██╔══╝      ██║██║╚██╗██║██║
███████║██║  ██║██║  ██║██████╔╝╚██████╔╝╚███╔███╔╝    ███████║   ██║   ██║ ╚████║██████╔╝██║╚██████╗██║  ██║   ██║   ███████╗    ██║██║ ╚████║╚██████╗██╗
╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═════╝  ╚═════╝  ╚══╝╚══╝     ╚══════╝   ╚═╝   ╚═╝  ╚═══╝╚═════╝ ╚═╝ ╚═════╝╚═╝  ╚═╝   ╚═╝   ╚══════╝    ╚═╝╚═╝  ╚═══╝ ╚═════╝╚═╝

*/
pragma solidity ^0.8.0;

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

/**
 * @title Bank
 * @dev Allows users to claim ERC20 tokens using an authorized signature.
 * The contract can hold multiple ERC20 tokens and distribute them
 * based on off-chain authorizations signed by a designated signer.
 * Fork of {GridleToken} contract.
 */
contract Bank 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 per token for refund validation
    /// @dev deposits[account][token] = amount
    mapping(address => 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
    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 reserves that must always be present per token
    /// @dev Used as a safety floor when systemBalance is very low or zero
    mapping(address => uint256) public minReserves;

    /// @notice Last processed signId per token to track order sequence
    /// @dev lastSignId[token] = signId
    mapping(address => 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 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 Error thrown when min coefficient is not greater than 100%
    error MinCoefficientTooLow();

    /// @notice Error thrown when max coefficient is not greater than 100%
    error MaxCoefficientTooLow();

    /// @notice Error thrown when min coefficient exceeds max coefficient
    error InvalidCoefficientOrder();

    /// @notice Emitted when a successful ERC20 token deposit is made
    /// @param signId The unique identifier for the order
    /// @param depositor The address that made the deposit
    /// @param token The ERC20 token contract address
    /// @param amount The amount deposited
    event TokenDeposited(uint indexed signId, address indexed depositor, address indexed token, uint256 amount);

    /// @notice Emitted when a successful ERC20 token claim is made
    /// @param signId The unique identifier for the order
    /// @param account The address that claimed the tokens
    /// @param token The ERC20 token contract address
    /// @param amount The amount claimed
    event TokenClaimed(uint indexed signId, address indexed account, address indexed token, uint256 amount);

    /// @notice Emitted when ERC20 tokens are refunded to an account
    /// @param account The address that received the refund
    /// @param token The ERC20 token contract address
    /// @param amount The amount refunded
    event TokenRefunded(address indexed account, address indexed token, uint256 amount);

    /// @notice Emitted when automatic withdrawal occurs
    /// @param token The token address
    /// @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 reserve coefficients are updated
    /// @param minReservesCoef The new minimum reserves coefficient
    /// @param maxReservesCoef The new maximum reserves coefficient
    event ReserveCoefficientsUpdated(uint256 minReservesCoef, uint256 maxReservesCoef);

    /// @notice Emitted when minimum reserves are updated for a token
    /// @param token The token address
    /// @param minReserves The new minimum reserves amount
    event MinReservesUpdated(address indexed token, uint256 minReserves);

    /// @notice Emitted when ERC20 tokens are withdrawn from the contract
    /// @param withdrawer The address that performed the withdrawal
    /// @param token The ERC20 token contract address
    /// @param amount The amount withdrawn
    /// @param reserved The amount left reserved in the contract
    event TokenWithdrawn(address indexed withdrawer, address indexed token, uint256 amount, uint256 reserved);

    /// @notice Emitted when tokens are sent directly to the contract for topup
    /// @param sender The address that sent tokens to the contract
    /// @param token The token contract address
    /// @param amount The amount sent
    event Topup(address indexed sender, address indexed token, 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)
    }

    /// @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 minimum and maximum reserve coefficients
    /// @param _minReservesCoef The minimum reserves coefficient in basis points (10000 = 100%)
    /// @param _maxReservesCoef The maximum reserves coefficient in basis points (10000 = 100%)
    function setReserveCoefficients(uint256 _minReservesCoef, uint256 _maxReservesCoef) external onlyRole(DEFAULT_ADMIN_ROLE) {
        if (_minReservesCoef <= 10000) {
            revert MinCoefficientTooLow();
        }
        if (_maxReservesCoef <= 10000) {
            revert MaxCoefficientTooLow();
        }
        if (_minReservesCoef > _maxReservesCoef) {
            revert InvalidCoefficientOrder();
        }
        minReservesCoef = _minReservesCoef;
        maxReservesCoef = _maxReservesCoef;
        emit ReserveCoefficientsUpdated(_minReservesCoef, _maxReservesCoef);
    }

    /// @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 Set absolute minimum reserves for a token that must always be present
    /// @param token The token address
    /// @param _minReserves The minimum amount that must always be in the contract
    function setMinReserves(address token, uint256 _minReserves) external onlyRole(DEFAULT_ADMIN_ROLE) {
        minReserves[token] = _minReserves;
        emit MinReservesUpdated(token, _minReserves);
    }

    /// @notice Internal function to handle automatic withdrawals when balance exceeds limits
    /// @param token The token address
    /// @param systemBalance The required system balance (funds needed for operations)
    function _autoWithdrawToken(address token, uint256 systemBalance) internal {
        // Calculate the total balance targets using coefficients
        // Example: if systemBalance = 100 tokens and minReservesCoef = 11000 (110%)
        // then minTargetFromCoef = 110 tokens (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[token])
            ? minTargetFromCoef
            : (systemBalance + minReserves[token]);

        // Check if current balance exceeds the maximum allowed threshold
        uint256 currentBalance = IERC20(token).balanceOf(address(this));
        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 = IERC20(token).transfer(withdrawAddress, withdrawAmount);
                if (success) {
                    emit AutoWithdrawal(token, withdrawAmount, withdrawAddress);
                }
            }
        }
    }

    /// @notice Deposit ERC20 tokens with signature verification
    /// @param signId The unique identifier for this order
    /// @param token The ERC20 token contract address
    /// @param amount The amount of tokens to deposit
    /// @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 depositToken(
        uint signId,
        address token,
        uint256 amount,
        uint deadline,
        uint systemBalance,
        uint8 sigV,
        bytes32 sigR,
        bytes32 sigS
    ) external {
        if (processedOrders[signId]) {
            revert OrderAlreadyProcessed();
        }

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

        bytes32 msgHash = keccak256(
            abi.encode(signId, msg.sender, token, amount, 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][token] = amount;

        IERC20(token).transferFrom(msg.sender, address(this), amount);
        emit TokenDeposited(signId, msg.sender, token, amount);

        // Auto-withdraw excess balance only if this is a newer signId to ensure systemBalance is fresh
        if (signId > lastSignId[token]) {
            lastSignId[token] = signId;
            _autoWithdrawToken(token, systemBalance);
        }
    }

    /// @notice Claim ERC20 tokens for an order with signature verification
    /// @param signId The unique identifier for the order
    /// @param account The account to receive the tokens
    /// @param token The ERC20 token contract address
    /// @param amount The amount of tokens 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 claimToken(
        uint signId,
        address account,
        address token,
        uint256 amount,
        uint8 sigV,
        bytes32 sigR,
        bytes32 sigS
    ) external {
        if (processedOrders[signId]) {
            revert OrderAlreadyProcessed();
        }

        bytes32 msgHash = keccak256(
            abi.encode(signId, account, token, amount, 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][token] = 0;

        IERC20(token).transfer(account, amount);
        emit TokenClaimed(signId, account, token, amount);
    }

    /// @notice Withdraws ERC-20 tokens held by the contract to the caller, leaving a reserved amount
    /// @param _tokenContract The ERC-20 contract address
    /// @param reserved The amount of tokens to leave in the contract
    function withdrawERC20(
        IERC20 _tokenContract,
        uint256 reserved
    ) external onlyRole(WITHDRAW_ROLE) {
        uint256 balance = _tokenContract.balanceOf(address(this));
        if (balance < reserved) {
            revert InsufficientBalance();
        }
        uint256 withdrawAmount = balance - reserved;
        _tokenContract.transfer(msg.sender, withdrawAmount);
        emit TokenWithdrawn(msg.sender, address(_tokenContract), withdrawAmount, reserved);
    }

    /// @notice Refund ERC20 tokens to a specific account (amount must be <= deposit)
    /// @param account The account to receive the refund
    /// @param token The ERC20 token contract address
    /// @param amount The amount of tokens to refund
    function refundToken(
        address account,
        address token,
        uint256 amount
    ) external onlyRole(REFUND_ROLE) {
        if (account == address(0)) {
            revert ZeroAddress();
        }

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

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

        IERC20(token).transfer(account, amount);
        emit TokenRefunded(account, token, amount);
    }

    /// @notice Allows direct token transfers to topup the contract balance
    /// @param token The ERC20 token contract address
    /// @param amount The amount of tokens to transfer to the contract
    /// @dev This is a convenience function for users to directly send tokens to the contract
    ///      The tokens will be added to the contract's balance and can be used for claims
    function topup(address token, uint256 amount) external {
        IERC20(token).transferFrom(msg.sender, address(this), amount);
        emit Topup(msg.sender, token, amount);
    }
}

// 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) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// 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"
      ]
    }
  },
  "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":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidCoefficientOrder","type":"error"},{"inputs":[],"name":"InvalidRefundAmount","type":"error"},{"inputs":[],"name":"MaxCoefficientTooLow","type":"error"},{"inputs":[],"name":"MinCoefficientTooLow","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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"minReserves","type":"uint256"}],"name":"MinReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minReservesCoef","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxReservesCoef","type":"uint256"}],"name":"ReserveCoefficientsUpdated","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":"uint256","name":"signId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"signId","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"sigV","type":"uint8"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","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":"depositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"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":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"refundToken","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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_minReserves","type":"uint256"}],"name":"setMinReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minReservesCoef","type":"uint256"},{"internalType":"uint256","name":"_maxReservesCoef","type":"uint256"}],"name":"setReserveCoefficients","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":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"topup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

9c4d535b0000000000000000000000000000000000000000000000000000000000000000010002e5124bbac26cde71a08be17483d390d031ca53e57d39d432410709dab300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000652a359448b8a6edd17efcc83cc4c9f6201c27f600000000000000000000000020000dc5611f4258cb9c0b0d0da971cdba8b96a9

Deployed Bytecode

0x0001000000000002000b0000000000020000000000010355000000600310027000000287033001970000000100200190000000570000c13d0000008002000039000000400020043f000000040030008c0000007e0000413d000000000201043b000000e002200270000002950020009c000000800000213d000002a70020009c000000b30000a13d000002a80020009c0000012b0000a13d000002a90020009c000002d20000213d000002ac0020009c0000039a0000613d000002ad0020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000002401100370000000000101043b000800000001001d0000000001000411000000000010043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff001001900000014c0000613d0000000901000029000000000010043f0000000701000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000021041b000000400100043d0000000000210435000002870010009c000002870100804100000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c8011001c70000800d020000390000000203000039000002cc040000410000000905000029000006300000013d0000000002000416000000000002004b0000007e0000c13d0000001f0230003900000288022001970000008002200039000000400020043f0000001f0430018f00000289053001980000008002500039000000680000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000640000c13d000000000004004b000000750000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c0000007e0000413d000000800300043d0000028a0030009c0000007e0000213d000000a00100043d000900000001001d0000028a0010009c000001210000a13d000000000100001900000a1800010430000002960020009c000000fe0000a13d000002970020009c000001590000a13d000002980020009c000002dd0000213d0000029b0020009c0000039f0000613d0000029c0020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000002402100370000000000202043b000800000002001d0000000401100370000000000101043b000900000001001d0000000001000411000000000010043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000400200043d000000000101043b000000000101041a000000ff001001900000050e0000c13d000002be01000041000000000012043500000004012000390000000003000411000000000031043500000024012000390000000000010435000002870020009c00000287020080410000004001200210000002bf011001c700000a1800010430000002b10020009c0000016b0000213d000002b50020009c0000040e0000613d000002b60020009c000004b00000613d000002b70020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000001040030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000002402100370000000000202043b000800000002001d0000028a0020009c0000007e0000213d0000008402100370000000000202043b000500000002001d0000006402100370000000000202043b000700000002001d0000004402100370000000000202043b000600000002001d000000a401100370000000000101043b000400000001001d000000ff0010008c0000007e0000213d0000000901000029000000000010043f0000000301000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000005410000c13d000002d40100004100000000001004430000000001000414000002870010009c0000028701008041000000c001100210000002d5011001c70000800b020000390a160a110000040f0000000100200190000005940000613d000000400400043d000000000101043b0000000703000029000000000031004b000006350000a13d000002dc010000410000000000140435000002870040009c00000287040080410000004001400210000002bb011001c700000a1800010430000002a00020009c000001ae0000213d000002a40020009c0000041f0000613d000002a50020009c000004b90000613d000002a60020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000000402100370000000000202043b0000028a0020009c0000007e0000213d0000002401100370000000000101043b000900000001001d0000028a0010009c0000007e0000213d000000000020043f0000000401000039000000200010043f000000400200003900000000010000190a1609f70000040f0000000902000029000000000020043f000000200010043f000000000100001900000040020000390a1609f70000040f000004bd0000013d000000000003004b000002f10000c13d000000400100043d000002cd020000410000000000210435000002870010009c00000287010080410000004001100210000002bb011001c700000a1800010430000002ae0020009c000003c50000613d000002af0020009c000004320000613d000002b00020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b000900000001001d0000028a0010009c0000007e0000213d0000000001000411000000000010043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000005350000c13d000000400100043d000002be02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000002870010009c00000287010080410000004001100210000002bf011001c700000a18000104300000029d0020009c000003d60000613d0000029e0020009c000004850000613d0000029f0020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b0000028a0010009c0000007e0000213d000000000010043f0000000801000039000002ec0000013d000002b20020009c0000048b0000613d000002b30020009c000004c10000613d000002b40020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000002401100370000000000101043b000800000001001d0000028a0010009c0000007e0000213d0000000901000029000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000101100039000000000101041a000700000001001d000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000005950000c13d000000400100043d00000024021000390000000703000029000005070000013d000002a10020009c000004990000613d000002a20020009c000004d50000613d000002a30020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000e40030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000002402100370000000000202043b000800000002001d0000028a0020009c0000007e0000213d0000004402100370000000000202043b000700000002001d0000028a0020009c0000007e0000213d0000006402100370000000000202043b000600000002001d0000008401100370000000000101043b000500000001001d000000ff0010008c0000007e0000213d0000000901000029000000000010043f0000000301000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000005410000c13d00000007010000290000028a03100197000000400400043d000000a001400039000000000200041000000000002104350000008001400039000000060200002900000000002104350000006001400039000700000003001d0000000000310435000000400140003900000008020000290000000000210435000000a001000039000000000114043600000009020000290000000000210435000002c60040009c0000064d0000213d000000c002400039000300000002001d000000400020043f000002870010009c00000287010080410000004001100210000400000004001d0000000002040433000002870020009c00000287020080410000006002200210000000000112019f0000000002000367000000a403200370000000000303043b000200000003001d000000c402200370000000000202043b000100000002001d0000000002000414000002870020009c0000028702008041000000c002200210000000000112019f0000028d011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000030300002900000000001304350000000402000029000001200120003900000001040000290000000000410435000001000120003900000002040000290000000000410435000000e00120003900000005020000290000000000210435000000000000043f000002870030009c000002870300804100000040013002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c7011001c700000001020000390a160a110000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000002380000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002340000c13d000000000005004b000002450000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f00000000005404350000000100200190000008170000613d0000000101000039000000000101041a000000000200043d000000000121013f0000028a00100198000008770000c13d0000000901000029000000000010043f0000000301000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000801000029000000000010043f0000000401000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000702000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000001041b000000400300043d000500000003001d000000240130003900000006020000290000000000210435000002c3010000410000000000130435000000040130003900000008020000290000000000210435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002bf011001c700000007020000290a160a0c0000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000050b0000290000000505700029000002a10000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000029d0000c13d000000000006004b000002ae0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000009100000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000002c20010009c0000064d0000213d00000001002001900000064d0000c13d000000400010043f000000200030008c0000007e0000413d00000000020b0433000000010020008c0000007e0000213d00000006020000290000000000210435000002870010009c000002870100804100000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000121019f000002c8011001c70000800d020000390000000403000039000002c904000041000000090500002900000008060000290000000707000029000006300000013d000002aa0020009c000003b90000613d000002ab0020009c0000007e0000c13d0000000001000416000000000001004b0000007e0000c13d0000029201000041000000800010043f000002b80100004100000a170001042e000002990020009c000003be0000613d0000029a0020009c0000007e0000c13d0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b0000028a0010009c0000007e0000213d000000000010043f0000000701000039000000200010043f000000400200003900000000010000190a1609f70000040f000004bd0000013d000000000030043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c70000801002000039000800000003001d0a160a110000040f000000080300002900000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000003230000c13d000000000030043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000001000414000002870010009c0000028701008041000000c0011002100000028d011001c70000800d02000039000000040300003900000000070004110000028e04000041000000000500001900000008060000290a160a0c0000040f000000080300002900000001002001900000007e0000613d000000000030043f0000028f01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f000000080300002900000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000003540000c13d000000000030043f0000028f01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000001000414000002870010009c0000028701008041000000c0011002100000028d011001c70000800d02000039000000040300003900000000070004110000028e04000041000002900500004100000008060000290a160a0c0000040f000000080300002900000001002001900000007e0000613d000000000030043f0000029101000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f000000080300002900000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000003850000c13d000000000030043f0000029101000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000001000414000002870010009c0000028701008041000000c0011002100000028d011001c70000800d02000039000000040300003900000000070004110000028e04000041000002920500004100000008060000290a160a0c0000040f000000080300002900000001002001900000007e0000613d0000000101000039000000000201041a000002930220019700000009022001af000000000021041b0000000201000039000000000201041a0000029302200197000000000232019f000000000021041b00002af8010000390000000502000039000000000012041b00002ee0010000390000000602000039000000000012041b000000200100003900000100001004430000012000000443000002940100004100000a170001042e0000000001000416000000000001004b0000007e0000c13d0000000601000039000004bd0000013d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000002402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000000401100370000000000101043b000800000001001d000000000010043f000000200000043f000000400200003900000000010000190a1609f70000040f0000000101100039000000000101041a0a1609780000040f000000080100002900000009020000290a1609a70000040f000000000100001900000a170001042e0000000001000416000000000001004b0000007e0000c13d0000000101000039000004b40000013d0000000001000416000000000001004b0000007e0000c13d0000029001000041000000800010043f000002b80100004100000a170001042e0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000002402100370000000000302043b0000028a0030009c0000007e0000213d0000000002000411000000000023004b000005130000c13d0000000401100370000000000101043b0a1609a70000040f000000000100001900000a170001042e0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000002401100370000000000101043b000800000001001d0000029001000041000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000400400043d0000000403400039000000000101043b000000000101041a000000ff00100190000005440000c13d000002be01000041000000000014043500000000010004110000000000130435000000240140003900000290020000410000000000210435000002870040009c00000287040080410000004001400210000002bf011001c700000a18000104300000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b000002dd001001980000007e0000c13d000002de0010009c00000000020000390000000102006039000002df0010009c00000001022061bf000000800020043f000002b80100004100000a170001042e0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b000900000001001d0000028a0010009c0000007e0000213d0a1609570000040f0000000101000039000000000201041a00000293022001970000000903000029000000000232019f000000000021041b000000000100001900000a170001042e0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000002401100370000000000201043b000002ce01000041000000800010043f00000000010004110000028a01100197000000840010043f00000000010004100000028a01100197000000a40010043f000800000002001d000000c40020043f0000000001000414000002870010009c0000028701008041000000c001100210000002cf011001c700000009020000290a160a0c0000040f000000800a00003900000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf0000045e0000613d000000000801034f000000008908043c000000000a9a043600000000005a004b0000045a0000c13d000000000006004b0000046b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000005170000613d0000001f01400039000000600110018f00000080011001bf000000400010043f000000200030008c0000007e0000413d000000800200043d000000010020008c0000007e0000213d0000000802000029000000000021043500000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c8011001c70000800d020000390000000303000039000002d00400004100000000050004110000000906000029000006300000013d0000000001000416000000000001004b0000007e0000c13d000000800000043f000002b80100004100000a170001042e0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b000000000010043f000000200000043f000000400200003900000000010000190a1609f70000040f0000000101100039000004bd0000013d0000000002000416000000000002004b0000007e0000c13d000000440030008c0000007e0000413d0000002402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000000401100370000000000101043b000000000010043f000000200000043f000000400200003900000000010000190a1609f70000040f0000000902000029000000000020043f000000200010043f00000000010000190000004002000039000004cd0000013d0000000001000416000000000001004b0000007e0000c13d0000000201000039000000000101041a0000028a01100197000000800010043f000002b80100004100000a170001042e0000000001000416000000000001004b0000007e0000c13d0000000501000039000000000101041a000000800010043f000002b80100004100000a170001042e0000000002000416000000000002004b0000007e0000c13d000000240030008c0000007e0000413d0000000401100370000000000101043b000000000010043f0000000301000039000000200010043f000000400200003900000000010000190a1609f70000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000002b80100004100000a170001042e0000000002000416000000000002004b0000007e0000c13d000000640030008c0000007e0000413d0000000402100370000000000202043b000900000002001d0000028a0020009c0000007e0000213d0000002402100370000000000202043b000800000002001d0000028a0020009c0000007e0000213d0000004401100370000000000101043b000700000001001d0000029201000041000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000005dc0000c13d000000400100043d000000240210003900000292030000410000000000320435000002be020000410000000000210435000000040210003900000000030004110000000000320435000001540000013d0000000904000029000027100040008c0000053c0000213d000002bd010000410000058e0000013d000002d101000041000000800010043f000002d20100004100000a18000104300000001f0530018f0000028906300198000000400200043d0000000004620019000005220000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000051e0000c13d000000000005004b0000052f0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000002870020009c00000287020080410000004002200210000000000121019f00000a18000104300000000903000029000000000003004b000001230000613d0000000201000039000000000201041a00000293022001970000042e0000013d0000000803000029000027100030008c0000058b0000213d000002bc010000410000058e0000013d000000400100043d000002d302000041000001250000013d00000009010000290000028a02100197000002c001000041000000000014043500000000010004100000000000130435000002870040009c0000028701000041000000000104401900000040011002100000000003000414000002870030009c0000028703008041000000c003300210000000000113019f000002c1011001c7000700000002001d000900000004001d0a160a110000040f000000090b00002900000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b0019000005670000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000005630000c13d000000000006004b000005740000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000005ff0000613d0000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000002c20020009c0000064d0000213d00000001001001900000064d0000c13d000600000002001d000000400020043f000000200030008c0000007e0000413d000000090100002900000000010104330009000800100074000008230000813d000002c50100004100000006020000290000058e0000013d000000000034004b0000061d0000a13d000002ba010000410000000000120435000002870020009c00000287020080410000004001200210000002bb011001c700000a1800010430000000000001042f0000000901000029000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000ff00100190000006330000c13d0000000901000029000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000001000414000002870010009c0000028701008041000000c0011002100000028d011001c70000800d0200003900000004030000390000028e04000041000000090500002900000008060000290000000007000411000006300000013d0000000901000029000000000001004b000001230000613d000000000010043f0000000401000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000070010006c0000087a0000813d000000400100043d000002cb02000041000001250000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006060000c13d000000000005004b000006170000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000002870020009c00000287020080410000004002200210000000000112019f00000a18000104300000000501000039000000000041041b0000000601000039000000000031041b000000200120003900000000003104350000000000420435000002870020009c000002870200804100000040012002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f0000028c011001c70000800d020000390000000103000039000002b9040000410a160a0c0000040f00000001002001900000007e0000613d000000000100001900000a170001042e000000c00140003900000005020000290000000000210435000000a0014000390000000000310435000000800140003900000006020000290000000000210435000000600140003900000008020000290000000000210435000000e0010000390000000001140436000000e0024000390000000003000410000000000032043500000040024000390000000003000411000000000032043500000009020000290000000000210435000700000004001d000002d60040009c000006530000413d000002db01000041000000000010043f0000004101000039000000040010043f000002c10100004100000a180001043000000007020000290000010003200039000300000003001d000000400030043f000002870010009c000002870100804100000040011002100000000002020433000002870020009c00000287020080410000006002200210000000000112019f0000000002000367000000c403200370000000000303043b000200000003001d000000e402200370000000000202043b000100000002001d0000000002000414000002870020009c0000028702008041000000c002200210000000000112019f0000028d011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000030300002900000000001304350000000702000029000001600120003900000001040000290000000000410435000001400120003900000002040000290000000000410435000001200120003900000004020000290000000000210435000000000000043f000002870030009c000002870300804100000040013002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c7011001c700000001020000390a160a110000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0540018f0000002004400190000006970000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000006930000c13d000000000005004b000006a40000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f00000000005404350000000100200190000008ec0000613d0000000101000039000000000101041a000000000200043d000000000121013f0000028a00100198000008770000c13d0000000901000029000000000010043f0000000301000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000002e00220019700000001022001bf000000000021041b0000000001000411000000000010043f0000000401000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000602000029000000000021041b000000400300043d000700000003001d0000004401300039000000000021043500000000010004100000028a0110019700000024023000390000000000120435000002ce01000041000000000013043500000000010004110000028a0110019700000004023000390000000000120435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002d8011001c700000008020000290a160a0c0000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000070b0000290000000705700029000007050000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000007010000c13d000000000006004b000007120000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000091c0000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000002c20010009c0000064d0000213d00000001002001900000064d0000c13d000000400010043f000000200030008c0000007e0000413d00000000020b0433000000010020008c0000007e0000213d00000006020000290000000000210435000002870010009c000002870100804100000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000121019f000002c8011001c70000800d020000390000000403000039000002d9040000410000000905000029000000000600041100000008070000290a160a0c0000040f00000001002001900000007e0000613d0000000801000029000000000010043f0000000801000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000201041a000000090020006b000006330000a13d0000000902000029000000000021041b00000000010004150000000b0110008a0000000501100210000000050000006b0000000002000019000900000000001d000009280000c13d00072710002001220000000501100270000000070100002f0000000801000029000000000010043f0000000701000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000050010002a000009390000413d0000000501100029000000090010006b0000077b0000213d0000000801000029000000000010043f0000000701000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000101041a000000050010002a000009390000413d000900050010002d000000400300043d000600000003001d000002c0010000410000000000130435000000040130003900000000020004100000000000210435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c1011001c700000008020000290a160a110000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000060b00002900000006057000290000079e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000079a0000c13d000000000006004b000007ab0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000093f0000613d0000001f01400039000000600110018f0000000002b10019000000000012004b00000000010000390000000101004039000500000002001d000002c20020009c0000064d0000213d00000001001001900000064d0000c13d0000000501000029000000400010043f000000200030008c0000007e0000413d00000000010b0433000000070010006c000006330000a13d0009000900100074000006330000a13d0000000201000039000000000101041a000002c302000041000000050300002900000000002304350000028a0110019700000004023000390000000000120435000000240130003900000009020000290000000000210435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002bf011001c700000008020000290a160a0c0000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000007e70000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b000007e30000c13d000000000006004b000007f40000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000094b0000613d0000001f01400039000000600110018f0000000501100029000002c20010009c0000064d0000213d000000400010043f000000200030008c0000007e0000413d00000005020000290000000002020433000000010020008c0000007e0000213d000000000002004b000006330000613d0000000202000039000000000202041a00000009030000290000000000310435000002870010009c000002870100804100000040011002100000000003000414000002870030009c0000028703008041000000c003300210000000000131019f000002c8011001c70000028a062001970000800d020000390000000303000039000002da040000410000000805000029000006300000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000081e0000c13d0000060a0000013d000002c3010000410000000603000029000000000013043500000000010004110000028a0110019700000004023000390000000000120435000000240130003900000009020000290000000000210435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002bf011001c700000007020000290a160a0c0000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000605700029000008480000613d000000000801034f0000000609000029000000008a08043c0000000009a90436000000000059004b000008440000c13d000000000006004b000008550000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000008f80000613d0000001f01400039000000600110018f0000000601100029000002c20010009c0000064d0000213d000000400010043f000000200030008c0000007e0000413d00000006020000290000000002020433000000010020008c0000007e0000213d00000020021000390000000803000029000000000032043500000009020000290000000000210435000002870010009c000002870100804100000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f0000028c011001c70000800d020000390000000303000039000002c40400004100000000050004110000000706000029000006300000013d000000400100043d000002d702000041000001250000013d0000000901000029000000000010043f0000000401000039000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b0000000802000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f00000001002001900000007e0000613d000000000101043b000000000001041b000000400300043d000600000003001d000000240130003900000007020000290000000000210435000002c3010000410000000000130435000000040130003900000009020000290000000000210435000002870030009c0000028701000041000000000103401900000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002bf011001c700000008020000290a160a0c0000040f00000060031002700000028703300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000060b0000290000000605700029000008bc0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b000008b80000c13d000000000006004b000008c90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000009040000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000002c20010009c0000064d0000213d00000001002001900000064d0000c13d000000400010043f000000200030008c0000007e0000413d00000000020b0433000000010020008c0000007e0000213d00000007020000290000000000210435000002870010009c000002870100804100000040011002100000000002000414000002870020009c0000028702008041000000c002200210000000000112019f000002c8011001c70000800d020000390000000303000039000002ca0400004100000009050000290000000806000029000006300000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008f30000c13d0000060a0000013d0000001f0530018f0000028906300198000000400200043d0000000004620019000005220000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008ff0000c13d000005220000013d0000001f0530018f0000028906300198000000400200043d0000000004620019000005220000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000090b0000c13d000005220000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009170000c13d0000060a0000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009230000c13d0000060a0000013d0000000501000039000000000101041a00000005031000b900000005023000fa000000000012004b000009390000c13d00000000010004150000000a0110008a00000005011002100000000602000039000000000402041a00000005024000b900000005052000fa000000000045004b000009390000c13d0009271000300122000007520000013d000002db01000041000000000010043f0000001101000039000000040010043f000002c10100004100000a18000104300000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009460000c13d0000060a0000013d0000001f0530018f0000028906300198000000400200043d00000000046200190000060a0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000009520000c13d0000060a0000013d0000000001000411000000000010043f0000028b01000041000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009690000613d000000000101043b000000000101041a000000ff001001900000096b0000613d000000000001042d000000000100001900000a1800010430000000400100043d000002be02000041000000000021043500000004021000390000000003000411000000000032043500000024021000390000000000020435000002870010009c00000287010080410000004001100210000002bf011001c700000a18000104300001000000000002000100000001001d000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009970000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009970000613d000000000101043b000000000101041a000000ff00100190000009990000613d000000000001042d000000000100001900000a1800010430000000400100043d000000240210003900000001030000290000000000320435000002be020000410000000000210435000000040210003900000000030004110000000000320435000002870010009c00000287010080410000004001100210000002bf011001c700000a18000104300002000000000002000100000002001d000200000001001d000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009f40000613d000000000101043b00000001020000290000028a02200197000100000002001d000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009f40000613d000000000101043b000000000101041a000000ff00100190000009f30000613d0000000201000029000000000010043f000000200000043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009f40000613d000000000101043b0000000102000029000000000020043f000000200010043f0000000001000414000002870010009c0000028701008041000000c0011002100000028c011001c700008010020000390a160a110000040f0000000100200190000009f40000613d000000000101043b000000000201041a000002e002200197000000000021041b0000000001000414000002870010009c0000028701008041000000c0011002100000028d011001c70000800d0200003900000004030000390000000007000411000002e104000041000000020500002900000001060000290a160a0c0000040f0000000100200190000009f40000613d000000000001042d000000000100001900000a1800010430000000000001042f000002870010009c00000287010080410000004001100210000002870020009c00000287020080410000006002200210000000000112019f0000000002000414000002870020009c0000028702008041000000c002200210000000000112019f0000028d011001c700008010020000390a160a110000040f000000010020019000000a0a0000613d000000000101043b000000000001042d000000000100001900000a180001043000000a0f002104210000000102000039000000000001042d0000000002000019000000000001042d00000a14002104230000000102000039000000000001042d0000000002000019000000000001042d00000a160000043200000a170001042e00000a180001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d20be27040b8e00df40bca0df34743417f3574a156386188f7d7f14369e5ee82b5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec6d58a2655af2cd69143d408e70af0b0d9dc7bbcfa222b331e96c25160f5c508df1f91cdf1f18aaac45ca4aaddade87aabc2746f6d044da7cf8544558c5776172ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000006c19e78200000000000000000000000000000000000000000000000000000000a1db978100000000000000000000000000000000000000000000000000000000d547741e00000000000000000000000000000000000000000000000000000000e02023a000000000000000000000000000000000000000000000000000000000e02023a100000000000000000000000000000000000000000000000000000000f5233b7400000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000d70012c500000000000000000000000000000000000000000000000000000000a1db978200000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000cd9961060000000000000000000000000000000000000000000000000000000091d148530000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000000000000000000000932fec40000000000000000000000000000000000000000000000000000000009f3841a3000000000000000000000000000000000000000000000000000000006c19e78300000000000000000000000000000000000000000000000000000000860f8389000000000000000000000000000000000000000000000000000000008f601f660000000000000000000000000000000000000000000000000000000036568abd00000000000000000000000000000000000000000000000000000000498256fd000000000000000000000000000000000000000000000000000000005b7633cf000000000000000000000000000000000000000000000000000000005b7633d000000000000000000000000000000000000000000000000000000000627c090600000000000000000000000000000000000000000000000000000000498256fe000000000000000000000000000000000000000000000000000000004e117ff50000000000000000000000000000000000000000000000000000000036568abe0000000000000000000000000000000000000000000000000000000038d631a7000000000000000000000000000000000000000000000000000000003ab1a49400000000000000000000000000000000000000000000000000000000248a9ca200000000000000000000000000000000000000000000000000000000248a9ca30000000000000000000000000000000000000000000000000000000024a27546000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000001581b600000000000000000000000000000000000000000000000000000000001b07b1800000000000000000000000000000000000000020000000800000000000000000814733d5ca0e46231b9a80a75665dc20980b69a806760f03f70720d005abfe31bd595838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000139583f00000000000000000000000000000000000000000000000000000000093bdba0800000000000000000000000000000000000000000000000000000000e2517d3f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffa9059cbb000000000000000000000000000000000000000000000000000000007a163cc3488948c84f02deddd608c9465235f04837413e5f1051007d0da746d2f4d678b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f00000000000000000000000000000000000000800000000000000000000000000200000000000000000000000000000000000020000000000000000000000000a0126cb27d0e7a0ae1b6240b529bbdaaa427fd657cc72b15acf3ddbac115b66e600b03051499485a8f9fea7ef6cb67cef1902a90a12c9bcb83831bebaffed7fe16365d5f00000000000000000000000000000000000000000000000000000000a69c4a7c0b38d82aa6b1323ed41c96928e115e778969b0266400f2d16b16b5e3d92e233d0000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000595cd27b62af24092ae2d5497be2f8807863b770713cf70254dbebc7c6f4c7c76697b232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000c6b10ad400000000000000000000000000000000000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00356a44180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000005187d31a2b0e5829ff24ba2d281e6506286752e3d938cbaa86d0202f509ffeb02d7037c69bcf96189308bafd217604e9c2e48dc9a53440d76a9deb9f79e4c0704e487b71000000000000000000000000000000000000000000000000000000001ab7da6b0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffc9a7000000000000000000000000000000000000000000000000000000007965db0b00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b000000000000000000a26469706673582212208d3beca189da6de6029b6ff07f9aac52bf51a9ee728d5487906018f41c57ac9964736f6c6378247a6b736f6c633a312e352e31353b736f6c633a302e382e32343b6c6c766d3a312e302e320055

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

000000000000000000000000652a359448b8a6edd17efcc83cc4c9f6201c27f600000000000000000000000020000dc5611f4258cb9c0b0d0da971cdba8b96a9

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000652a359448b8a6edd17efcc83cc4c9f6201c27f6
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.