HYPE Price: $22.66 (-2.30%)
 

Overview

HYPE Balance

HyperEVM LogoHyperEVM LogoHyperEVM Logo0 HYPE

HYPE Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Repay64623882025-06-22 14:27:46217 days ago1750602466IN
0xf47Ae7E4...069d31C38
0 HYPE0.000106030.76307458
Repay57848702025-06-14 21:17:02224 days ago1749935822IN
0xf47Ae7E4...069d31C38
0 HYPE0.000013960.1
Repay56988092025-06-13 21:43:57225 days ago1749851037IN
0xf47Ae7E4...069d31C38
0 HYPE0.000019210.15
Repay56827092025-06-13 17:19:59225 days ago1749835199IN
0xf47Ae7E4...069d31C38
0 HYPE0.000034920.25
Repay56757262025-06-13 15:25:28226 days ago1749828328IN
0xf47Ae7E4...069d31C38
0 HYPE0.00067265.13
Repay56749492025-06-13 15:12:44226 days ago1749827564IN
0xf47Ae7E4...069d31C38
0 HYPE0.000013960.1
Repay56741442025-06-13 14:59:32226 days ago1749826772IN
0xf47Ae7E4...069d31C38
0 HYPE0.000097543.16
Repay56741332025-06-13 14:59:21226 days ago1749826761IN
0xf47Ae7E4...069d31C38
0 HYPE0.000640324.77
Repay56734262025-06-13 14:47:46226 days ago1749826066IN
0xf47Ae7E4...069d31C38
0 HYPE0.000014760.11
Repay56733922025-06-13 14:47:12226 days ago1749826032IN
0xf47Ae7E4...069d31C38
0 HYPE0.00001460.11
Repay56729552025-06-13 14:40:02226 days ago1749825602IN
0xf47Ae7E4...069d31C38
0 HYPE0.000287272.14
Repay56725362025-06-13 14:33:10226 days ago1749825190IN
0xf47Ae7E4...069d31C38
0 HYPE0.000030871
Repay56725242025-06-13 14:32:59226 days ago1749825179IN
0xf47Ae7E4...069d31C38
0 HYPE0.000221491.65
Repay56721402025-06-13 14:26:41226 days ago1749824801IN
0xf47Ae7E4...069d31C38
0 HYPE0.000040270.3
Repay56717472025-06-13 14:20:14226 days ago1749824414IN
0xf47Ae7E4...069d31C38
0 HYPE0.000014760.11
Repay56712612025-06-13 14:12:16226 days ago1749823936IN
0xf47Ae7E4...069d31C38
0 HYPE0.000029320.95
Repay56712482025-06-13 14:12:03226 days ago1749823923IN
0xf47Ae7E4...069d31C38
0 HYPE0.000089940.67
Repay56709372025-06-13 14:06:58226 days ago1749823618IN
0xf47Ae7E4...069d31C38
0 HYPE0.000057720.43
Repay56707932025-06-13 14:04:36226 days ago1749823476IN
0xf47Ae7E4...069d31C38
0 HYPE0.000168881.41
Repay56704702025-06-13 13:59:18226 days ago1749823158IN
0xf47Ae7E4...069d31C38
0 HYPE0.000004320.14
Repay56704392025-06-13 13:58:48226 days ago1749823128IN
0xf47Ae7E4...069d31C38
0 HYPE0.000041610.31
Repay56700642025-06-13 13:52:39226 days ago1749822759IN
0xf47Ae7E4...069d31C38
0 HYPE0.000063090.47
Repay56697532025-06-13 13:47:33226 days ago1749822453IN
0xf47Ae7E4...069d31C38
0 HYPE0.000014760.11
Repay56687742025-06-13 13:31:30226 days ago1749821490IN
0xf47Ae7E4...069d31C38
0 HYPE0.000014760.11
Repay56579592025-06-13 10:34:11226 days ago1749810851IN
0xf47Ae7E4...069d31C38
0 HYPE0.000016460.12
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RepayHelper

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Interface} from "src/contracts/interfaces/IFraxlendV3.sol"; // Using V3 interface based on previous context
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract RepayHelper is ReentrancyGuard {
    using SafeERC20 for IERC20;

    error InvalidRepayAmount();

    /// @notice Repays debt for msg.sender on a given Fraxlend pair.
    /// @param _pair The address of the Fraxlend pair contract.
    /// @param _amount The amount to repay, or type(uint256).max for full repay
    function repay(Interface _pair, uint256 _amount) external nonReentrant {
        address borrower = msg.sender;
        
        // Get borrower's shares and calculate amount to repay
        uint256 borrowerShares = _pair.userBorrowShares(borrower);
        if (borrowerShares == 0) return;

        uint256 sharesToRepay;
        uint256 amountToRepay;
        IERC20 assetToken = IERC20(_pair.asset());

        if (_amount == type(uint256).max) {
            sharesToRepay = borrowerShares;
            amountToRepay = _pair.toBorrowAmount(borrowerShares, true, true);
            assetToken.safeTransferFrom(borrower, address(this), amountToRepay);

        } else {
            if (_amount == 0) revert InvalidRepayAmount();
            sharesToRepay = _pair.toBorrowShares(_amount * 99950 / 100000, false, false);
            amountToRepay = _pair.toBorrowAmount(sharesToRepay, true, false);
            assetToken.safeTransferFrom(borrower, address(this), _amount);
        }

        // Handle asset token transfers
        
        if(assetToken.allowance(address(this), address(_pair)) < type(uint256).max) {
            assetToken.safeApprove(address(_pair), type(uint256).max);
        }

        // Repay and refund any dust
        _pair.repayAsset(sharesToRepay, borrower);
        
        uint256 remainingBalance = assetToken.balanceOf(address(this));
        if (remainingBalance > 0) {
            assetToken.safeTransfer(borrower, remainingBalance);
        }
    }

    /// @notice Calculates the amount needed to approve for repaying a borrower's debt, including a 2% buffer
    /// @param _pair The FraxlendPair contract
    /// @param borrower The address of the borrower
    /// @return amountToApprove The amount to approve, including buffer
    function getAmountToApprove(Interface _pair, address borrower) public view returns (uint256 amountToApprove) {
        // Get borrower's shares
        uint256 borrowerShares = _pair.userBorrowShares(borrower);
        
        // If no shares, return 0
        if (borrowerShares == 0) {
            return 0;
        }

        // Calculate base amount needed (round up)
        uint256 baseAmount = _pair.toBorrowAmount(borrowerShares, true, true);
        
        // Add 2% buffer
        amountToApprove = baseAmount + ((baseAmount * 2e18) / 100e18);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
     * 0 before setting it to a non-zero value.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
     * Revert on invalid signature.
     */
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 7 of 7 : IFraxlendV3.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

library FraxlendPairCore {
    struct CurrentRateInfo {
        uint32 lastBlock;
        uint32 feeToProtocolRate;
        uint64 lastTimestamp;
        uint64 ratePerSec;
        uint64 fullUtilizationRate;
    }
}

interface Interface {
    struct VaultAccount {
        uint128 amount;
        uint128 shares;
    }

    error AccessControlRevoked();
    error BadProtocolFee();
    error BadSwapper();
    error BorrowerSolvent();
    error ExceedsBorrowLimit();
    error ExceedsDepositLimit();
    error ExceedsMaxOracleDeviation();
    error Insolvent(uint256 _borrow, uint256 _collateral, uint256 _exchangeRate);
    error InsufficientAssetsInContract(uint256 _assets, uint256 _request);
    error InterestPaused();
    error InvalidPath(address _expected, address _actual);
    error InvalidReceiver();
    error LiquidatePaused();
    error OnlyPendingTimelock();
    error OnlyProtocolOrOwner();
    error OnlyTimelock();
    error OnlyTimelockOrOwner();
    error PastDeadline(uint256 _blockTimestamp, uint256 _deadline);
    error RepayPaused();
    error SetterRevoked();
    error SlippageTooHigh(uint256 _minOut, uint256 _actual);
    error WithdrawPaused();

    event AddCollateral(address indexed sender, address indexed borrower, uint256 collateralAmount);
    event AddInterest(uint256 interestEarned, uint256 rate, uint256 feesAmount, uint256 feesShare);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event BorrowAsset(
        address indexed _borrower, address indexed _receiver, uint256 _borrowAmount, uint256 _sharesAdded
    );
    event ChangeFee(uint32 newFee);
    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);
    event LeveragedPosition(
        address indexed _borrower,
        address _swapperAddress,
        uint256 _borrowAmount,
        uint256 _borrowShares,
        uint256 _initialCollateralAmount,
        uint256 _amountCollateralOut
    );
    event Liquidate(
        address indexed _borrower,
        uint256 _collateralForLiquidator,
        uint256 _sharesToLiquidate,
        uint256 _amountLiquidatorToRepay,
        uint256 _feesAmount,
        uint256 _sharesToAdjust,
        uint256 _amountToAdjust
    );
    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event PauseInterest(bool isPaused);
    event PauseLiquidate(bool isPaused);
    event PauseRepay(bool isPaused);
    event PauseWithdraw(bool isPaused);
    event RemoveCollateral(
        address indexed _sender, uint256 _collateralAmount, address indexed _receiver, address indexed _borrower
    );
    event RepayAsset(address indexed payer, address indexed borrower, uint256 amountToRepay, uint256 shares);
    event RepayAssetWithCollateral(
        address indexed _borrower,
        address _swapperAddress,
        uint256 _collateralToSwap,
        uint256 _amountAssetOut,
        uint256 _sharesRepaid
    );
    event RevokeBorrowAccessControl(uint256 borrowLimit);
    event RevokeDepositAccessControl(uint256 depositLimit);
    event RevokeInterestAccessControl();
    event RevokeLiquidateAccessControl();
    event RevokeLiquidationFeeSetter();
    event RevokeMaxLTVSetter();
    event RevokeOracleInfoSetter();
    event RevokeRateContractSetter();
    event RevokeRepayAccessControl();
    event RevokeWithdrawAccessControl();
    event SetBorrowLimit(uint256 limit);
    event SetCircuitBreaker(address oldCircuitBreaker, address newCircuitBreaker);
    event SetDepositLimit(uint256 limit);
    event SetLiquidationFees(
        uint256 oldCleanLiquidationFee,
        uint256 oldDirtyLiquidationFee,
        uint256 oldProtocolLiquidationFee,
        uint256 newCleanLiquidationFee,
        uint256 newDirtyLiquidationFee,
        uint256 newProtocolLiquidationFee
    );
    event SetMaxLTV(uint256 oldMaxLTV, uint256 newMaxLTV);
    event SetOracleInfo(
        address oldOracle, uint32 oldMaxOracleDeviation, address newOracle, uint32 newMaxOracleDeviation
    );
    event SetRateContract(address oldRateContract, address newRateContract);
    event SetSwapper(address swapper, bool approval);
    event TimelockTransferStarted(address indexed previousTimelock, address indexed newTimelock);
    event TimelockTransferred(address indexed previousTimelock, address indexed newTimelock);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event UpdateExchangeRate(uint256 lowExchangeRate, uint256 highExchangeRate);
    event UpdateRate(
        uint256 oldRatePerSec, uint256 oldFullUtilizationRate, uint256 newRatePerSec, uint256 newFullUtilizationRate
    );
    event WarnOracleData(address oracle);
    event Withdraw(
        address indexed caller, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
    );
    event WithdrawFees(uint128 shares, address recipient, uint256 amountToTransfer, uint256 collateralAmount);

    function DEPLOYER_ADDRESS() external view returns (address);
    function DEVIATION_PRECISION() external view returns (uint256);
    function EXCHANGE_PRECISION() external view returns (uint256);
    function FEE_PRECISION() external view returns (uint256);
    function LIQ_PRECISION() external view returns (uint256);
    function LTV_PRECISION() external view returns (uint256);
    function MAX_PROTOCOL_FEE() external view returns (uint256);
    function RATE_PRECISION() external view returns (uint256);
    function UTIL_PREC() external view returns (uint256);
    function acceptOwnership() external;
    function acceptTransferTimelock() external;
    function addCollateral(uint256 _collateralAmount, address _borrower) external;
    function addInterest(bool _returnAccounting)
        external
        returns (
            uint256 _interestEarned,
            uint256 _feesAmount,
            uint256 _feesShare,
            FraxlendPairCore.CurrentRateInfo memory _currentRateInfo,
            VaultAccount memory _totalAsset,
            VaultAccount memory _totalBorrow
        );
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function asset() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function borrowAsset(uint256 _borrowAmount, uint256 _collateralAmount, address _receiver)
        external
        returns (uint256 _shares);
    function borrowLimit() external view returns (uint256);
    function changeFee(uint32 _newFee) external;
    function circuitBreakerAddress() external view returns (address);
    function cleanLiquidationFee() external view returns (uint256);
    function collateralContract() external view returns (address);
    function convertToAssets(uint256 _shares) external view returns (uint256 _assets);
    function convertToShares(uint256 _assets) external view returns (uint256 _shares);
    function currentRateInfo()
        external
        view
        returns (
            uint32 lastBlock,
            uint32 feeToProtocolRate,
            uint64 lastTimestamp,
            uint64 ratePerSec,
            uint64 fullUtilizationRate
        );
    function decimals() external view returns (uint8);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
    function deposit(uint256 _amount, address _receiver) external returns (uint256 _sharesReceived);
    function depositLimit() external view returns (uint256);
    function dirtyLiquidationFee() external view returns (uint256);
    function exchangeRateInfo()
        external
        view
        returns (
            address oracle,
            uint32 maxOracleDeviation,
            uint184 lastTimestamp,
            uint256 lowExchangeRate,
            uint256 highExchangeRate
        );
    function getConstants()
        external
        pure
        returns (
            uint256 _LTV_PRECISION,
            uint256 _LIQ_PRECISION,
            uint256 _UTIL_PREC,
            uint256 _FEE_PRECISION,
            uint256 _EXCHANGE_PRECISION,
            uint256 _DEVIATION_PRECISION,
            uint256 _RATE_PRECISION,
            uint256 _MAX_PROTOCOL_FEE
        );
    function getPairAccounting()
        external
        view
        returns (
            uint128 _totalAssetAmount,
            uint128 _totalAssetShares,
            uint128 _totalBorrowAmount,
            uint128 _totalBorrowShares,
            uint256 _totalCollateral
        );
    function getUserSnapshot(address _address)
        external
        view
        returns (uint256 _userAssetShares, uint256 _userBorrowShares, uint256 _userCollateralBalance);
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function isBorrowAccessControlRevoked() external view returns (bool);
    function isDepositAccessControlRevoked() external view returns (bool);
    function isInterestAccessControlRevoked() external view returns (bool);
    function isInterestPaused() external view returns (bool);
    function isLiquidateAccessControlRevoked() external view returns (bool);
    function isLiquidatePaused() external view returns (bool);
    function isLiquidationFeeSetterRevoked() external view returns (bool);
    function isMaxLTVSetterRevoked() external view returns (bool);
    function isOracleSetterRevoked() external view returns (bool);
    function isRateContractSetterRevoked() external view returns (bool);
    function isRepayAccessControlRevoked() external view returns (bool);
    function isRepayPaused() external view returns (bool);
    function isWithdrawAccessControlRevoked() external view returns (bool);
    function isWithdrawPaused() external view returns (bool);
    function leveragedPosition(
        address _swapperAddress,
        uint256 _borrowAmount,
        uint256 _initialCollateralAmount,
        uint256 _amountCollateralOutMin,
        address[] memory _path
    ) external returns (uint256 _totalCollateralBalance);
    function liquidate(uint128 _sharesToLiquidate, uint256 _deadline, address _borrower)
        external
        returns (uint256 _collateralForLiquidator);
    function maxDeposit(address _receiver) external view returns (uint256 _maxAssets);
    function maxLTV() external view returns (uint256);
    function maxMint(address _receiver) external view returns (uint256 _maxShares);
    function maxRedeem(address _owner) external view returns (uint256 _maxShares);
    function maxWithdraw(address _owner) external view returns (uint256 _maxAssets);
    function mint(uint256 _shares, address _receiver) external returns (uint256 _amount);
    function name() external view returns (string memory);
    function owner() external view returns (address);
    function pause() external;
    function pauseBorrow() external;
    function pauseDeposit() external;
    function pauseInterest(bool _isPaused) external;
    function pauseLiquidate(bool _isPaused) external;
    function pauseRepay(bool _isPaused) external;
    function pauseWithdraw(bool _isPaused) external;
    function pendingOwner() external view returns (address);
    function pendingTimelockAddress() external view returns (address);
    function previewAddInterest()
        external
        view
        returns (
            uint256 _interestEarned,
            uint256 _feesAmount,
            uint256 _feesShare,
            FraxlendPairCore.CurrentRateInfo memory _newCurrentRateInfo,
            VaultAccount memory _totalAsset,
            VaultAccount memory _totalBorrow
        );
    function previewDeposit(uint256 _assets) external view returns (uint256 _sharesReceived);
    function previewMint(uint256 _shares) external view returns (uint256 _amount);
    function previewRedeem(uint256 _shares) external view returns (uint256 _assets);
    function previewWithdraw(uint256 _amount) external view returns (uint256 _sharesToBurn);
    function pricePerShare() external view returns (uint256 _amount);
    function protocolLiquidationFee() external view returns (uint256);
    function rateContract() external view returns (address);
    function redeem(uint256 _shares, address _receiver, address _owner) external returns (uint256 _amountToReturn);
    function removeCollateral(uint256 _collateralAmount, address _receiver) external;
    function renounceOwnership() external;
    function renounceTimelock() external;
    function repayAsset(uint256 _shares, address _borrower) external returns (uint256 _amountToRepay);
    function repayAssetWithCollateral(
        address _swapperAddress,
        uint256 _collateralToSwap,
        uint256 _amountAssetOutMin,
        address[] memory _path
    ) external returns (uint256 _amountAssetOut);
    function revokeBorrowLimitAccessControl(uint256 _borrowLimit) external;
    function revokeDepositLimitAccessControl(uint256 _depositLimit) external;
    function revokeInterestAccessControl() external;
    function revokeLiquidateAccessControl() external;
    function revokeLiquidationFeeSetter() external;
    function revokeMaxLTVSetter() external;
    function revokeOracleInfoSetter() external;
    function revokeRateContractSetter() external;
    function revokeRepayAccessControl() external;
    function revokeWithdrawAccessControl() external;
    function setBorrowLimit(uint256 _limit) external;
    function setCircuitBreaker(address _newCircuitBreaker) external;
    function setDepositLimit(uint256 _limit) external;
    function setLiquidationFees(
        uint256 _newCleanLiquidationFee,
        uint256 _newDirtyLiquidationFee,
        uint256 _newProtocolLiquidationFee
    ) external;
    function setMaxLTV(uint256 _newMaxLTV) external;
    function setOracle(address _newOracle, uint32 _newMaxOracleDeviation) external;
    function setRateContract(address _newRateContract) external;
    function setSwapper(address _swapper, bool _approval) external;
    function swappers(address) external view returns (bool);
    function symbol() external view returns (string memory);
    function timelockAddress() external view returns (address);
    function toAssetAmount(uint256 _shares, bool _roundUp, bool _previewInterest)
        external
        view
        returns (uint256 _amount);
    function toAssetShares(uint256 _amount, bool _roundUp, bool _previewInterest)
        external
        view
        returns (uint256 _shares);
    function toBorrowAmount(uint256 _shares, bool _roundUp, bool _previewInterest)
        external
        view
        returns (uint256 _amount);
    function toBorrowShares(uint256 _amount, bool _roundUp, bool _previewInterest)
        external
        view
        returns (uint256 _shares);
    function totalAsset() external view returns (uint128 amount, uint128 shares);
    function totalAssets() external view returns (uint256);
    function totalBorrow() external view returns (uint128 amount, uint128 shares);
    function totalCollateral() external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function transferOwnership(address newOwner) external;
    function transferTimelock(address _newTimelock) external;
    function unpause() external;
    function updateExchangeRate()
        external
        returns (bool _isBorrowAllowed, uint256 _lowExchangeRate, uint256 _highExchangeRate);
    function userBorrowShares(address) external view returns (uint256);
    function userCollateralBalance(address) external view returns (uint256);
    function version() external pure returns (uint256 _major, uint256 _minor, uint256 _patch);
    function withdraw(uint256 _amount, address _receiver, address _owner) external returns (uint256 _sharesToBurn);
    function withdrawFees(uint128 _shares, address _recipient) external returns (uint256 _amountToTransfer);
}

Settings
{
  "evmVersion": "paris",
  "libraries": {},
  "metadata": {
    "appendCBOR": true,
    "bytecodeHash": "ipfs",
    "useLiteralContent": false
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": [
    "@chainlink/=node_modules/@chainlink/",
    "@ensdomains/=node_modules/@ensdomains/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@mean-finance/=node_modules/@mean-finance/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "@uniswap/=node_modules/@uniswap/",
    "base64-sol/=node_modules/base64-sol/",
    "ds-test/=lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "hardhat/=node_modules/hardhat/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
    "gluex-router/=lib/gluex_router_contract/router_v1/",
    "@pythnetwork/=lib/pyth-adapters/node_modules/@pythnetwork/",
    "gluex_router_contract/=lib/gluex_router_contract/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "pyth-adapters/=lib/pyth-adapters/",
    "v3-core/=lib/v3-core/",
    "v3-periphery/=lib/v3-periphery/contracts/"
  ],
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"InvalidRepayAmount","type":"error"},{"inputs":[{"internalType":"contract Interface","name":"_pair","type":"address"},{"internalType":"address","name":"borrower","type":"address"}],"name":"getAmountToApprove","outputs":[{"internalType":"uint256","name":"amountToApprove","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Interface","name":"_pair","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080806040523461001b576001600055610aa890816100218239f35b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816322867d781461007b575063df2a83a41461003757600080fd5b34610078576040366003190112610078576100506100ff565b602435916001600160a01b03831683036100785760206100708484610941565b604051908152f35b80fd5b9050346100fb5760403660031901126100fb576100966100ff565b9060028354146100b957506100b290600283556024359061016e565b6001815580f35b62461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b5080fd5b600435906001600160a01b038216820361011557565b600080fd5b6080810190811067ffffffffffffffff82111761013657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761013657604052565b60408051634fd422df60e01b81523360048083019190915291936020936001600160a01b0393926024929185169186828581865afa9182156106b757600092610688575b50811561067e5787516338d52e0f60e01b81526000969088818881885afa90811561067457889161063a575b5016956000199180196105155750508751637ec4b57160e01b8152858101839052600185820181905260448201528781606481875afa801561049c576000906104e6575b61022f91503033896106c2565b8751636eb1769f60e11b808252308783019081526001600160a01b038616602082015290919089908290819060400103818b5afa9081156104db579089949392916000916104a7575b508211610390575b505091604460009389519485938492633d417d2d60e01b84528984015233888401525af180156103855790859161035c575b50508451916370a0823160e01b8352309083015283828281865afa91821561035157600092610322575b50816102ea575b5050505050565b61031894519363a9059cbb60e01b9085015233908401526044830152604482526103138261011a565b61071d565b38808080806102e3565b90918482813d831161034a575b610339818361014c565b8101031261007857505190386102dc565b503d61032f565b85513d6000823e3d90fd5b813d831161037e575b61036f818361014c565b810103126101155783386102b2565b503d610365565b86513d6000823e3d90fd5b8951908152308782019081526001600160a01b0386166020820152929350909188908290819060400103818a5afa90811561049c5760009161046f575b5061040e5791604487926104076000958b519063095ea7b360e01b878301528589830152848201528381526104018161011a565b8961071d565b9193610280565b875162461bcd60e51b81528086018890526036818601527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b908882813d8311610495575b610485818361014c565b81010312610078575051386103cd565b503d61047b565b89513d6000823e3d90fd5b9192939482813d83116104d4575b6104bf818361014c565b81010312610078575051889392919082610278565b503d6104b5565b8a513d6000823e3d90fd5b8882813d831161050e575b6104fb818361014c565b81010312610078575061022f9051610222565b503d6104f1565b809193501561062a576201866e81026201866d198282040161061857620186a08a51916324fd1bd960e21b8352048782015283868201528360448201528881606481885afa93841561060d5780946105db575b50508851637ec4b57160e01b8152868101849052600186820152600060448201528881606481885afa80156104db579089916105b2575b50506105ad903033896106c2565b61022f565b813d83116105d4575b6105c5818361014c565b8101031261011557873861059f565b503d6105bb565b909193508882813d8311610606575b6105f4818361014c565b81010312610078575051913880610568565b503d6105ea565b8a51903d90823e3d90fd5b634e487b7160e01b8452601187528584fd5b8851630f55bf8d60e21b81528690fd5b90508881813d831161066d575b610651818361014c565b810103126106695751818116810361066957386101de565b8780fd5b503d610647565b8a513d8a823e3d90fd5b5050505050505050565b90918782813d83116106b0575b61069f818361014c565b8101031261007857505190386101b2565b503d610695565b88513d6000823e3d90fd5b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648083019390935291815260a081019181831067ffffffffffffffff8411176101365761071b9260405261071d565b565b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117610136576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d15610862573d92831161084e57906107b8939291604051926107ab88601f19601f840116018561014c565b83523d868885013e61086d565b80519182159184831561082a575b5050509050156107d35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b9193818094500103126100fb578201519081151582036100785750803880846107c6565b634e487b7160e01b85526041600452602485fd5b906107b89392506060915b919290156108cf5750815115610881575090565b3b1561088a5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156108e25750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510610928575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610905565b604051634fd422df60e01b81526001600160a01b0392831660048201529116906020908181602481865afa908115610a3157600091610a45575b508015610a3d578190606460405180958193637ec4b57160e01b8352600483015260016024830152600160448301525afa908115610a3157600091610a05575b509050671bc16d674ec800008082029082820414821517156109ef5768056bc75e2d63100000900481018091116109ef5790565b634e487b7160e01b600052601160045260246000fd5b82813d8311610a2a575b610a19818361014c565b8101031261007857505180386109bb565b503d610a0f565b6040513d6000823e3d90fd5b505050600090565b908282813d8311610a6b575b610a5b818361014c565b810103126100785750513861097b565b503d610a5156fea264697066735822122066e98b49df05efd01fdbccef7ca859b012cf7c1c713020a9f4d464d3c47791a864736f6c63430008130033

Deployed Bytecode

0x608080604052600436101561001357600080fd5b600090813560e01c90816322867d781461007b575063df2a83a41461003757600080fd5b34610078576040366003190112610078576100506100ff565b602435916001600160a01b03831683036100785760206100708484610941565b604051908152f35b80fd5b9050346100fb5760403660031901126100fb576100966100ff565b9060028354146100b957506100b290600283556024359061016e565b6001815580f35b62461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b5080fd5b600435906001600160a01b038216820361011557565b600080fd5b6080810190811067ffffffffffffffff82111761013657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761013657604052565b60408051634fd422df60e01b81523360048083019190915291936020936001600160a01b0393926024929185169186828581865afa9182156106b757600092610688575b50811561067e5787516338d52e0f60e01b81526000969088818881885afa90811561067457889161063a575b5016956000199180196105155750508751637ec4b57160e01b8152858101839052600185820181905260448201528781606481875afa801561049c576000906104e6575b61022f91503033896106c2565b8751636eb1769f60e11b808252308783019081526001600160a01b038616602082015290919089908290819060400103818b5afa9081156104db579089949392916000916104a7575b508211610390575b505091604460009389519485938492633d417d2d60e01b84528984015233888401525af180156103855790859161035c575b50508451916370a0823160e01b8352309083015283828281865afa91821561035157600092610322575b50816102ea575b5050505050565b61031894519363a9059cbb60e01b9085015233908401526044830152604482526103138261011a565b61071d565b38808080806102e3565b90918482813d831161034a575b610339818361014c565b8101031261007857505190386102dc565b503d61032f565b85513d6000823e3d90fd5b813d831161037e575b61036f818361014c565b810103126101155783386102b2565b503d610365565b86513d6000823e3d90fd5b8951908152308782019081526001600160a01b0386166020820152929350909188908290819060400103818a5afa90811561049c5760009161046f575b5061040e5791604487926104076000958b519063095ea7b360e01b878301528589830152848201528381526104018161011a565b8961071d565b9193610280565b875162461bcd60e51b81528086018890526036818601527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b908882813d8311610495575b610485818361014c565b81010312610078575051386103cd565b503d61047b565b89513d6000823e3d90fd5b9192939482813d83116104d4575b6104bf818361014c565b81010312610078575051889392919082610278565b503d6104b5565b8a513d6000823e3d90fd5b8882813d831161050e575b6104fb818361014c565b81010312610078575061022f9051610222565b503d6104f1565b809193501561062a576201866e81026201866d198282040161061857620186a08a51916324fd1bd960e21b8352048782015283868201528360448201528881606481885afa93841561060d5780946105db575b50508851637ec4b57160e01b8152868101849052600186820152600060448201528881606481885afa80156104db579089916105b2575b50506105ad903033896106c2565b61022f565b813d83116105d4575b6105c5818361014c565b8101031261011557873861059f565b503d6105bb565b909193508882813d8311610606575b6105f4818361014c565b81010312610078575051913880610568565b503d6105ea565b8a51903d90823e3d90fd5b634e487b7160e01b8452601187528584fd5b8851630f55bf8d60e21b81528690fd5b90508881813d831161066d575b610651818361014c565b810103126106695751818116810361066957386101de565b8780fd5b503d610647565b8a513d8a823e3d90fd5b5050505050505050565b90918782813d83116106b0575b61069f818361014c565b8101031261007857505190386101b2565b503d610695565b88513d6000823e3d90fd5b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648083019390935291815260a081019181831067ffffffffffffffff8411176101365761071b9260405261071d565b565b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117610136576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d15610862573d92831161084e57906107b8939291604051926107ab88601f19601f840116018561014c565b83523d868885013e61086d565b80519182159184831561082a575b5050509050156107d35750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b9193818094500103126100fb578201519081151582036100785750803880846107c6565b634e487b7160e01b85526041600452602485fd5b906107b89392506060915b919290156108cf5750815115610881575090565b3b1561088a5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156108e25750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510610928575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610905565b604051634fd422df60e01b81526001600160a01b0392831660048201529116906020908181602481865afa908115610a3157600091610a45575b508015610a3d578190606460405180958193637ec4b57160e01b8352600483015260016024830152600160448301525afa908115610a3157600091610a05575b509050671bc16d674ec800008082029082820414821517156109ef5768056bc75e2d63100000900481018091116109ef5790565b634e487b7160e01b600052601160045260246000fd5b82813d8311610a2a575b610a19818361014c565b8101031261007857505180386109bb565b503d610a0f565b6040513d6000823e3d90fd5b505050600090565b908282813d8311610a6b575b610a5b818361014c565b810103126100785750513861097b565b503d610a5156fea264697066735822122066e98b49df05efd01fdbccef7ca859b012cf7c1c713020a9f4d464d3c47791a864736f6c63430008130033

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  ]

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.