Source Code
Latest 25 from a total of 13,638 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit Token | 36452074 | 7 secs ago | IN | 0 ETH | 0.00000507 | ||||
| Deposit Token | 36451341 | 5 mins ago | IN | 0 ETH | 0.00000801 | ||||
| Deposit Token | 36450192 | 12 mins ago | IN | 0 ETH | 0.000008 | ||||
| Deposit Token | 36442529 | 1 hr ago | IN | 0 ETH | 0.00000654 | ||||
| Deposit Token | 36439568 | 1 hr ago | IN | 0 ETH | 0.00000654 | ||||
| Claim Token | 36430474 | 2 hrs ago | IN | 0 ETH | 0.00000698 | ||||
| Deposit Token | 36428077 | 2 hrs ago | IN | 0 ETH | 0.0000063 | ||||
| Claim Token | 36423091 | 3 hrs ago | IN | 0 ETH | 0.0000048 | ||||
| Deposit Token | 36422746 | 3 hrs ago | IN | 0 ETH | 0.00000654 | ||||
| Deposit Token | 36422422 | 3 hrs ago | IN | 0 ETH | 0.00000556 | ||||
| Deposit Token | 36421157 | 3 hrs ago | IN | 0 ETH | 0.00000608 | ||||
| Claim Token | 36406166 | 5 hrs ago | IN | 0 ETH | 0.00000458 | ||||
| Deposit Token | 36405203 | 5 hrs ago | IN | 0 ETH | 0.00000536 | ||||
| Claim Token | 36404820 | 5 hrs ago | IN | 0 ETH | 0.00000666 | ||||
| Deposit Token | 36404312 | 5 hrs ago | IN | 0 ETH | 0.00000556 | ||||
| Deposit Token | 36403412 | 5 hrs ago | IN | 0 ETH | 0.00000485 | ||||
| Claim Token | 36403199 | 5 hrs ago | IN | 0 ETH | 0.00000619 | ||||
| Deposit Token | 36402637 | 5 hrs ago | IN | 0 ETH | 0.00000654 | ||||
| Deposit Token | 36401705 | 5 hrs ago | IN | 0 ETH | 0.00000534 | ||||
| Deposit Token | 36401132 | 5 hrs ago | IN | 0 ETH | 0.00000654 | ||||
| Deposit Token | 36398707 | 5 hrs ago | IN | 0 ETH | 0.00000633 | ||||
| Claim Token | 36397347 | 6 hrs ago | IN | 0 ETH | 0.00000696 | ||||
| Deposit Token | 36395153 | 6 hrs ago | IN | 0 ETH | 0.00000507 | ||||
| Claim Token | 36395049 | 6 hrs ago | IN | 0 ETH | 0.00000619 | ||||
| Deposit Token | 36394515 | 6 hrs ago | IN | 0 ETH | 0.00000654 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32007958 | 31 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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
Contract Source Code (Solidity Standard Json-Input format)
// 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);
}{
"evmVersion": "paris",
"optimizer": {
"enabled": true,
"mode": "3"
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1,639.16
Net Worth in ETH
0.553743
Token Allocations
PENGU
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ABSTRACT | 100.00% | $0.009906 | 165,467 | $1,639.16 |
Loading...
Loading
Loading...
Loading
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.