Sepolia Testnet

Contract

0x45Febf2710b0096c72dDD1214EC05F52d6f36D95

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Pause61751552024-06-24 8:36:24170 days ago1719218184IN
0x45Febf27...2d6f36D95
0 ETH0.0007967428.74887086
Stake Multiple61750862024-06-24 8:21:36170 days ago1719217296IN
0x45Febf27...2d6f36D95
0.1 ETH0.0008152510.08267782
Stake Multiple61750412024-06-24 8:12:36170 days ago1719216756IN
0x45Febf27...2d6f36D95
0.1 ETH0.000752599.30773672
Stake Multiple61749552024-06-24 7:55:00170 days ago1719215700IN
0x45Febf27...2d6f36D95
0.1 ETH0.000441715.46369799
Stake Multiple61749532024-06-24 7:54:36170 days ago1719215676IN
0x45Febf27...2d6f36D95
0.1 ETH0.00043775.41328705
Stake Multiple61749252024-06-24 7:49:00170 days ago1719215340IN
0x45Febf27...2d6f36D95
0.01 ETH0.000272585.88846366
Stake Multiple61749072024-06-24 7:45:24170 days ago1719215124IN
0x45Febf27...2d6f36D95
0.02 ETH0.000345715.43901333
Stake Multiple61748492024-06-24 7:33:48170 days ago1719214428IN
0x45Febf27...2d6f36D95
0.1 ETH0.000437575.41168514
Stake Multiple61748192024-06-24 7:27:48170 days ago1719214068IN
0x45Febf27...2d6f36D95
0.1 ETH0.000495426.12711651
Stake Multiple61747692024-06-24 7:17:48170 days ago1719213468IN
0x45Febf27...2d6f36D95
0.5 ETH0.000462395.71612349
Stake Multiple61747622024-06-24 7:16:24170 days ago1719213384IN
0x45Febf27...2d6f36D95
0.1 ETH0.000480235.93937165
Stake Multiple61747132024-06-24 7:06:36170 days ago1719212796IN
0x45Febf27...2d6f36D95
0.05 ETH0.000739879.14900533
Stake Multiple61746132024-06-24 6:46:36170 days ago1719211596IN
0x45Febf27...2d6f36D95
0.5 ETH0.00054286.71021448
Stake Multiple61745832024-06-24 6:40:36170 days ago1719211236IN
0x45Febf27...2d6f36D95
0.1 ETH0.000560446.93128426
Stake Multiple61745142024-06-24 6:26:48170 days ago1719210408IN
0x45Febf27...2d6f36D95
0.1 ETH0.000566727.00897437
Stake Multiple61744932024-06-24 6:22:36170 days ago1719210156IN
0x45Febf27...2d6f36D95
0.5 ETH0.000702918.6894959
Stake Multiple61744302024-06-24 6:10:00170 days ago1719209400IN
0x45Febf27...2d6f36D95
0.033 ETH0.000735299.09370922
Stake Multiple61744142024-06-24 6:06:48170 days ago1719209208IN
0x45Febf27...2d6f36D95
0.5 ETH0.0009161811.32587712
Stake Multiple61743692024-06-24 5:57:48170 days ago1719208668IN
0x45Febf27...2d6f36D95
0.1 ETH0.0011495214.21681275
Stake Multiple61743652024-06-24 5:57:00170 days ago1719208620IN
0x45Febf27...2d6f36D95
0.5 ETH0.0012438515.37659092
Stake Multiple61743112024-06-24 5:46:12170 days ago1719207972IN
0x45Febf27...2d6f36D95
1 ETH0.0013788617.05065304
Stake Multiple61742952024-06-24 5:43:00170 days ago1719207780IN
0x45Febf27...2d6f36D95
0.04 ETH0.0015642419.35150998
Stake Multiple61742622024-06-24 5:36:24170 days ago1719207384IN
0x45Febf27...2d6f36D95
1 ETH0.0015773919.50558276
Stake Multiple61741952024-06-24 5:23:00170 days ago1719206580IN
0x45Febf27...2d6f36D95
0.01 ETH0.000194574.20338066
Stake Multiple61741912024-06-24 5:22:12170 days ago1719206532IN
0x45Febf27...2d6f36D95
0.05 ETH0.000344584.26097551
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
61750862024-06-24 8:21:36170 days ago1719217296
0x45Febf27...2d6f36D95
0.025 ETH
61750862024-06-24 8:21:36170 days ago1719217296
0x45Febf27...2d6f36D95
0.05 ETH
61750862024-06-24 8:21:36170 days ago1719217296
0x45Febf27...2d6f36D95
0.025 ETH
61750412024-06-24 8:12:36170 days ago1719216756
0x45Febf27...2d6f36D95
0.025 ETH
61750412024-06-24 8:12:36170 days ago1719216756
0x45Febf27...2d6f36D95
0.05 ETH
61750412024-06-24 8:12:36170 days ago1719216756
0x45Febf27...2d6f36D95
0.025 ETH
61749552024-06-24 7:55:00170 days ago1719215700
0x45Febf27...2d6f36D95
0.08 ETH
61749552024-06-24 7:55:00170 days ago1719215700
0x45Febf27...2d6f36D95
0.01 ETH
61749552024-06-24 7:55:00170 days ago1719215700
0x45Febf27...2d6f36D95
0.01 ETH
61749532024-06-24 7:54:36170 days ago1719215676
0x45Febf27...2d6f36D95
0.025 ETH
61749532024-06-24 7:54:36170 days ago1719215676
0x45Febf27...2d6f36D95
0.05 ETH
61749532024-06-24 7:54:36170 days ago1719215676
0x45Febf27...2d6f36D95
0.025 ETH
61749252024-06-24 7:49:00170 days ago1719215340
0x45Febf27...2d6f36D95
0.01 ETH
61749072024-06-24 7:45:24170 days ago1719215124
0x45Febf27...2d6f36D95
0.01 ETH
61749072024-06-24 7:45:24170 days ago1719215124
0x45Febf27...2d6f36D95
0.01 ETH
61748492024-06-24 7:33:48170 days ago1719214428
0x45Febf27...2d6f36D95
0.025 ETH
61748492024-06-24 7:33:48170 days ago1719214428
0x45Febf27...2d6f36D95
0.05 ETH
61748492024-06-24 7:33:48170 days ago1719214428
0x45Febf27...2d6f36D95
0.025 ETH
61748192024-06-24 7:27:48170 days ago1719214068
0x45Febf27...2d6f36D95
0.025 ETH
61748192024-06-24 7:27:48170 days ago1719214068
0x45Febf27...2d6f36D95
0.05 ETH
61748192024-06-24 7:27:48170 days ago1719214068
0x45Febf27...2d6f36D95
0.025 ETH
61747692024-06-24 7:17:48170 days ago1719213468
0x45Febf27...2d6f36D95
0.125 ETH
61747692024-06-24 7:17:48170 days ago1719213468
0x45Febf27...2d6f36D95
0.25 ETH
61747692024-06-24 7:17:48170 days ago1719213468
0x45Febf27...2d6f36D95
0.125 ETH
61747622024-06-24 7:16:24170 days ago1719213384
0x45Febf27...2d6f36D95
0.025 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DropnestStaking

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : DropnestStaking.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

/// @title DropnestStaking
/// @notice This contract is being used for managing deposits to dropnest protocool.
contract DropnestStaking is Ownable, Pausable, ReentrancyGuard {

    ///////////////////
    // Errors        //
    ///////////////////
    error DropnestStaking_DepositLessThanMinimumAmount(uint256 protocolId, uint256 amount);
    error DropnestStaking_ZeroAddressProvided();
    error DropnestStaking_ProtocolDoesNotExist();
    error DropnestStaking_DepositDoesntMatchAmountProportion();
    error DropnestStaking_ArraysLengthMismatch();
    error DropnestStaking_MaxNumberOfProtocolsReached();
    error DropnestStaking_NotEnoughBalance();
    error DropnestStaking_ProtocolIsNotActive(uint256 protocolId);
    error DropnestStaking_CannotChangeProtocolStatus(uint256 protocolId, bool status);
    error DropnestStaking_MinProtocolDepositAmountCannotBeZero();

    /////////////////////
    // State Variables //
    /////////////////////
    // protocolId => the target address to move the liquidity
    mapping(uint256 => address) public farmAddresses;

    //protocolId => bool to check if the protocol is active or not
    mapping(uint256 => bool) public protocolStatus;

    // protocols list
    string[] public protocols;

    // number of protocols
    uint256 private protocolCounter = 0;

    // minimum deposit amount
    uint256 internal minProtocolDepositAmount = 0.01 ether;

    // maximum number of protocols to stake in one batch
    uint256 internal constant MAX_NUMBER_OF_PROTOCOLS = 10;

    ///////////////////
    // Events        //
    ///////////////////
    /// @notice Event emitted when ETH is deposited
    event Deposited(uint256 indexed protocolId, address indexed from, address to, uint256 amount);

    /// @notice Event emitted when new project has been added to protocol
    event ProtocolAdded(uint256 protocolId, string protocolName, address to);

    /// @notice Event emitted when an existing project updates the farmer address
    event ProtocolUpdated(uint256 protocolId, string protocolName, address to);

    // @notice Event emitted when protocol status is updated
    event ProtocolStatusUpdated(uint256 protocolId, bool status);

    // @notice Event emitted when protocol status is updated
    event MinDepositAmountUpdated(uint256 newMinAmount);

    ///////////////////
    // Functions     //
    ///////////////////
    /// @notice Constructor to initialize the contract
    /// @param _protocols The list of protocols to be whitelisted
    /// @param _addresses The list of addresses corresponding to the protocols
    constructor(string[] memory _protocols, address[] memory _addresses) Ownable(msg.sender) {
        if (_protocols.length != _addresses.length) {
            revert DropnestStaking_ArraysLengthMismatch();
        }
        for (uint256 i = 0; i < _protocols.length; i++) {
            _addProtocol(_protocols[i], _addresses[i]);
        }
    }

    /////////////////////////
    // External Functions  //
    /////////////////////////

    /// @notice Allows a user to stake their ETH on multiple protocols
    /// @param _protocolIds The array of protocolIds to stake on
    /// @param _protocolAmounts The array of amounts to stake on each protocol
    function stakeMultiple(uint256[] memory _protocolIds, uint256[] memory _protocolAmounts) external payable whenNotPaused {
        uint256 totalDepositAmount = msg.value;
        uint256 totalSum = 0;

        if (_protocolIds.length != _protocolAmounts.length) {
            revert DropnestStaking_ArraysLengthMismatch();
        }
        if (_protocolIds.length > MAX_NUMBER_OF_PROTOCOLS) {
            revert DropnestStaking_MaxNumberOfProtocolsReached();
        }
        for (uint256 i = 0; i < _protocolIds.length; i++) {
            totalSum += _protocolAmounts[i];
        }
        if (totalSum != totalDepositAmount) {
            revert DropnestStaking_DepositDoesntMatchAmountProportion();
        }
        for (uint256 i = 0; i < _protocolIds.length; i++) {
            uint256 protocolId = _protocolIds[i];
            uint256 amount = _protocolAmounts[i];
            _stake(protocolId, amount);
        }
    }

    /// @notice Allows a user to stake their ETH
    /// @param protocolId The protocolId to stake on
    function stake(uint256 protocolId) external payable whenNotPaused {
        _stake(protocolId, msg.value);
    }

    /// @notice Allows the owner to add new protocol or update the farmerAddress for existing one
    /// @param protocolName The protocol name to be added
    /// @param farmerAddress The address corresponding to the farmer address of the protocol
    function addProtocolOrUpdate(string memory protocolName, address farmerAddress) external onlyOwner {
        for (uint256 i = 0; i < protocols.length; i++) {
            if (keccak256(abi.encodePacked(protocols[i])) == keccak256(abi.encodePacked(protocolName))) {
                uint256 id = i + 1;
                farmAddresses[id] = farmerAddress;
                emit ProtocolUpdated(id, protocolName, farmerAddress);
                return;
            }
        }
        _addProtocol(protocolName, farmerAddress);
    }

    /// @notice Allows the owner to set the protocol status
    /// @param protocolId The protocol unique identifier
    /// @param status The boolean depending on the status of the protocol
    function setProtocolStatus(uint256 protocolId, bool status) external onlyOwner {
        if (farmAddresses[protocolId] == address(0)) {
            revert DropnestStaking_ProtocolDoesNotExist();
        }
        if (protocolStatus[protocolId] == status) {
            revert DropnestStaking_CannotChangeProtocolStatus(protocolId, status);
        }
        protocolStatus[protocolId] = status;
        emit ProtocolStatusUpdated(protocolId, status);
    }

    /// @notice Allows the owner to pause the contract
    function pause() external onlyOwner {
        _pause();
    }

    /// @notice Allows the owner to unpause the contract
    function unpause() external onlyOwner {
        _unpause();
    }

    function setMinProtocolDepositAmount(uint256 amount) external onlyOwner {
        if (amount == 0) {
            revert DropnestStaking_MinProtocolDepositAmountCannotBeZero();
        }
        minProtocolDepositAmount = amount;
        emit MinDepositAmountUpdated(amount);
    }

    //////////////////////////////////////////////////////
    // Private & Internal View & Pure Functions         //
    //////////////////////////////////////////////////////

    /// @notice Allows a user to stake their ETH
    /// @param protocolId The protocol to stake on
    /// @param protocolAmount The amount of ETH to stake
    function _stake(uint256 protocolId, uint256 protocolAmount) nonReentrant private {
        if (protocolAmount < minProtocolDepositAmount) {
            revert DropnestStaking_DepositLessThanMinimumAmount(protocolId, protocolAmount);
        }
        address to = farmAddresses[protocolId];
        if (to == address(0)) {
            revert DropnestStaking_ProtocolDoesNotExist();
        }
        if (!protocolStatus[protocolId]) {
            revert DropnestStaking_ProtocolIsNotActive(protocolId);
        }
        emit Deposited(protocolId, msg.sender, to, protocolAmount);
        payable(to).transfer(protocolAmount);
    }

    /// @notice Sets the whitelist
    /// @param protocolName The protocol name to be whitelisted
    /// @param to The address corresponding to the protocol
    function _addProtocol(string memory protocolName, address to) private {
        if (to == address(0)) {
            revert DropnestStaking_ZeroAddressProvided();
        }
        protocolCounter++;
        protocols.push(protocolName);
        farmAddresses[protocolCounter] = to;
        protocolStatus[protocolCounter] = true;
        emit ProtocolAdded(protocolCounter, protocolName, to);
    }

    //////////////////////////////////////////////////////////
    // External & Public View & Pure Functions              //
    //////////////////////////////////////////////////////////

    /// @notice Returns the list of protocols
    function getProtocols() public view returns (string[] memory) {
        return protocols;
    }

    /// @notice Returns the address of the specified protocol
    /// @param protocolId The protocol unique identifier
    function getFarmAddress(uint256 protocolId) public view returns (address) {
        return farmAddresses[protocolId];
    }

    /// @notice Returns the minimum deposit amount for a protocol
    /// @return The minimum deposit amount in wei
    function getMinProtocolDepositAmount() public view returns (uint256) {
        return minProtocolDepositAmount;
    }
}

File 2 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 5 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 5 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @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 EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * 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;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    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
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // 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;
    }
}

File 5 of 5 : Context.sol
// 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;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"string[]","name":"_protocols","type":"string[]"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DropnestStaking_ArraysLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"DropnestStaking_CannotChangeProtocolStatus","type":"error"},{"inputs":[],"name":"DropnestStaking_DepositDoesntMatchAmountProportion","type":"error"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DropnestStaking_DepositLessThanMinimumAmount","type":"error"},{"inputs":[],"name":"DropnestStaking_MaxNumberOfProtocolsReached","type":"error"},{"inputs":[],"name":"DropnestStaking_MinProtocolDepositAmountCannotBeZero","type":"error"},{"inputs":[],"name":"DropnestStaking_NotEnoughBalance","type":"error"},{"inputs":[],"name":"DropnestStaking_ProtocolDoesNotExist","type":"error"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"}],"name":"DropnestStaking_ProtocolIsNotActive","type":"error"},{"inputs":[],"name":"DropnestStaking_ZeroAddressProvided","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"protocolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"MinDepositAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"protocolId","type":"uint256"},{"indexed":false,"internalType":"string","name":"protocolName","type":"string"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"ProtocolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"protocolId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"ProtocolStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"protocolId","type":"uint256"},{"indexed":false,"internalType":"string","name":"protocolName","type":"string"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"ProtocolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"string","name":"protocolName","type":"string"},{"internalType":"address","name":"farmerAddress","type":"address"}],"name":"addProtocolOrUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"farmAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"}],"name":"getFarmAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinProtocolDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocols","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocolStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protocols","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinProtocolDepositAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setProtocolStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"protocolId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_protocolIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_protocolAmounts","type":"uint256[]"}],"name":"stakeMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600555662386f26fc100006006553480156200002157600080fd5b50604051620019003803806200190083398101604081905262000044916200038c565b33806200006b57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000768162000114565b506000805460ff60a01b19169055600180558051825114620000ab5760405163048e2b7f60e41b815260040160405180910390fd5b60005b82518110156200010b5762000102838281518110620000d157620000d1620004cb565b6020026020010151838381518110620000ee57620000ee620004cb565b60200260200101516200016460201b60201c565b600101620000ae565b505050620006b3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166200018c5760405163c825500160e01b815260040160405180910390fd5b600580549060006200019e83620004e1565b9091555050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01620001e183826200059a565b5060058054600090815260026020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352600390915290819020805460ff19166001179055905490517fb23175a7672d7a3f1ee8d6475a301b6ca026e7defa7bef314817383e8c01c2ef916200025d918590859062000666565b60405180910390a15050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002aa57620002aa62000269565b604052919050565b60006001600160401b03821115620002ce57620002ce62000269565b5060051b60200190565b60005b83811015620002f5578181015183820152602001620002db565b50506000910152565b600082601f8301126200031057600080fd5b81516020620003296200032383620002b2565b6200027f565b8083825260208201915060208460051b8701019350868411156200034c57600080fd5b602086015b84811015620003815780516001600160a01b0381168114620003735760008081fd5b835291830191830162000351565b509695505050505050565b6000806040808486031215620003a157600080fd5b83516001600160401b0380821115620003b957600080fd5b8186019150601f87601f840112620003d057600080fd5b82516020620003e36200032383620002b2565b82815260059290921b8501810191818101908b8411156200040357600080fd5b8287015b848110156200049557805187811115620004215760008081fd5b8801603f81018e13620004345760008081fd5b84810151888111156200044b576200044b62000269565b6200045e818901601f191687016200027f565b8181528f8c838501011115620004745760008081fd5b62000485828883018e8601620002d8565b8552505091830191830162000407565b50918a015191985090955050505080831115620004b157600080fd5b5050620004c185828601620002fe565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200050257634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200051e57607f821691505b6020821081036200053f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000595576000816000526020600020601f850160051c81016020861015620005705750805b601f850160051c820191505b8181101562000591578281556001016200057c565b5050505b505050565b81516001600160401b03811115620005b657620005b662000269565b620005ce81620005c7845462000509565b8462000545565b602080601f831160018114620006065760008415620005ed5750858301515b600019600386901b1c1916600185901b17855562000591565b600085815260208120601f198616915b82811015620006375788860151825594840194600190910190840162000616565b5085821015620006565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b83815260606020820152600083518060608401526200068d816080850160208801620002d8565b6001600160a01b0393909316604083015250601f91909101601f19160160800192915050565b61123d80620006c36000396000f3fe6080604052600436106100fe5760003560e01c80638456cb59116100955780639117fcc3116100645780639117fcc3146102b4578063a694fc3a146102d2578063ce6dfadb146102e5578063f2fde38b1461031b578063f434bb681461033b57600080fd5b80638456cb59146102065780638c3962201461021b5780638d75ef67146102485780638da5cb5b1461029657600080fd5b80635c975abb116100d15780635c975abb146101925780636069af65146101b15780636bb32608146101d1578063715018a6146101f157600080fd5b80632027f9c2146101035780632c583bf3146101255780633f4ba83a14610138578063530ec9a11461014d575b600080fd5b34801561010f57600080fd5b5061012361011e366004610cda565b61035d565b005b610123610133366004610e00565b610471565b34801561014457600080fd5b50610123610582565b34801561015957600080fd5b5061017d610168366004610e64565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561019e57600080fd5b50600054600160a01b900460ff1661017d565b3480156101bd57600080fd5b506101236101cc366004610e64565b610594565b3480156101dd57600080fd5b506101236101ec366004610e7d565b6105f8565b3480156101fd57600080fd5b506101236106d6565b34801561021257600080fd5b506101236106e8565b34801561022757600080fd5b5061023b610236366004610e64565b6106f8565b6040516101899190610f02565b34801561025457600080fd5b5061027e610263366004610e64565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610189565b3480156102a257600080fd5b506000546001600160a01b031661027e565b3480156102c057600080fd5b50600654604051908152602001610189565b6101236102e0366004610e64565b6107a4565b3480156102f157600080fd5b5061027e610300366004610e64565b6000908152600260205260409020546001600160a01b031690565b34801561032757600080fd5b50610123610336366004610f1c565b6107b9565b34801561034757600080fd5b506103506107f4565b6040516101899190610f37565b6103656108cd565b60005b60045481101561046257826040516020016103839190610f9b565b60405160208183030381529060405280519060200120600482815481106103ac576103ac610fb7565b906000526020600020016040516020016103c69190611007565b604051602081830303815290604052805190602001200361045a5760006103ee826001611093565b6000818152600260205260409081902080546001600160a01b0319166001600160a01b038716179055519091507f7dd8ffdcd2ccb9b0f3f3ddb2928047a881eab9d5ac08757468a08c9d078814f39061044c908390879087906110ac565b60405180910390a150505050565b600101610368565b5061046d82826108fa565b5050565b6104796109ec565b805182513491600091146104a05760405163048e2b7f60e41b815260040160405180910390fd5b600a845111156104c35760405163e734d99f60e01b815260040160405180910390fd5b60005b84518110156104fe578381815181106104e1576104e1610fb7565b6020026020010151826104f49190611093565b91506001016104c6565b5081811461051f57604051636115681b60e01b815260040160405180910390fd5b60005b845181101561057b57600085828151811061053f5761053f610fb7565b60200260200101519050600085838151811061055d5761055d610fb7565b602002602001015190506105718282610a17565b5050600101610522565b5050505050565b61058a6108cd565b610592610b3b565b565b61059c6108cd565b806000036105bd576040516338e15c6960e21b815260040160405180910390fd5b60068190556040518181527fb443c8bd39a1b60d415144f9148c6f90c2b68a553eb90c62cef5e44979db009d9060200160405180910390a150565b6106006108cd565b6000828152600260205260409020546001600160a01b031661063557604051633c8f475960e01b815260040160405180910390fd5b60008281526003602052604090205481151560ff90911615150361067c5760405163f4091bb560e01b81526004810183905281151560248201526044015b60405180910390fd5b600082815260036020908152604091829020805460ff19168415159081179091558251858152918201527f837e140d77345d035fa5a122b62a86b4bedc07200343fe4e52d32ea433039d9891015b60405180910390a15050565b6106de6108cd565b6105926000610b90565b6106f06108cd565b610592610be0565b6004818154811061070857600080fd5b90600052602060002001600091509050805461072390610fcd565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90610fcd565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b6107ac6109ec565b6107b68134610a17565b50565b6107c16108cd565b6001600160a01b0381166107eb57604051631e4fbdf760e01b815260006004820152602401610673565b6107b681610b90565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156108c457838290600052602060002001805461083790610fcd565b80601f016020809104026020016040519081016040528092919081815260200182805461086390610fcd565b80156108b05780601f10610885576101008083540402835291602001916108b0565b820191906000526020600020905b81548152906001019060200180831161089357829003601f168201915b505050505081526020019060010190610818565b50505050905090565b6000546001600160a01b031633146105925760405163118cdaa760e01b8152336004820152602401610673565b6001600160a01b0381166109215760405163c825500160e01b815260040160405180910390fd5b60058054906000610931836110dd565b9091555050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016109728382611147565b5060058054600090815260026020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352600390915290819020805460ff19166001179055905490517fb23175a7672d7a3f1ee8d6475a301b6ca026e7defa7bef314817383e8c01c2ef916106ca91859085906110ac565b600054600160a01b900460ff16156105925760405163d93c066560e01b815260040160405180910390fd5b610a1f610c23565b600654811015610a4c576040516388db644560e01b81526004810183905260248101829052604401610673565b6000828152600260205260409020546001600160a01b031680610a8257604051633c8f475960e01b815260040160405180910390fd5b60008381526003602052604090205460ff16610ab45760405163412706e960e11b815260048101849052602401610673565b604080516001600160a01b038316815260208101849052339185917f984a71c9d95fd4794aeba33ae72edfec22053fde75488d63abef9dc69ee795af910160405180910390a36040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610b30573d6000803e3d6000fd5b505061046d60018055565b610b43610c4d565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610be86109ec565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b733390565b600260015403610c4657604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600054600160a01b900460ff1661059257604051638dfc202b60e01b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610cb657610cb6610c77565b604052919050565b80356001600160a01b0381168114610cd557600080fd5b919050565b60008060408385031215610ced57600080fd5b823567ffffffffffffffff80821115610d0557600080fd5b818501915085601f830112610d1957600080fd5b8135602082821115610d2d57610d2d610c77565b610d3f601f8301601f19168201610c8d565b92508183528781838601011115610d5557600080fd5b81818501828501376000818385010152829550610d73818801610cbe565b9450505050509250929050565b600082601f830112610d9157600080fd5b8135602067ffffffffffffffff821115610dad57610dad610c77565b8160051b610dbc828201610c8d565b9283528481018201928281019087851115610dd657600080fd5b83870192505b84831015610df557823582529183019190830190610ddc565b979650505050505050565b60008060408385031215610e1357600080fd5b823567ffffffffffffffff80821115610e2b57600080fd5b610e3786838701610d80565b93506020850135915080821115610e4d57600080fd5b50610e5a85828601610d80565b9150509250929050565b600060208284031215610e7657600080fd5b5035919050565b60008060408385031215610e9057600080fd5b8235915060208301358015158114610ea757600080fd5b809150509250929050565b60005b83811015610ecd578181015183820152602001610eb5565b50506000910152565b60008151808452610eee816020860160208601610eb2565b601f01601f19169290920160200192915050565b602081526000610f156020830184610ed6565b9392505050565b600060208284031215610f2e57600080fd5b610f1582610cbe565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610f8e57603f19888603018452610f7c858351610ed6565b94509285019290850190600101610f60565b5092979650505050505050565b60008251610fad818460208701610eb2565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680610fe157607f821691505b60208210810361100157634e487b7160e01b600052602260045260246000fd5b50919050565b600080835461101581610fcd565b6001828116801561102d576001811461104257611071565b60ff1984168752821515830287019450611071565b8760005260208060002060005b858110156110685781548a82015290840190820161104f565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156110a6576110a661107d565b92915050565b8381526060602082015260006110c56060830185610ed6565b905060018060a01b0383166040830152949350505050565b6000600182016110ef576110ef61107d565b5060010190565b601f821115611142576000816000526020600020601f850160051c8101602086101561111f5750805b601f850160051c820191505b8181101561113e5782815560010161112b565b5050505b505050565b815167ffffffffffffffff81111561116157611161610c77565b6111758161116f8454610fcd565b846110f6565b602080601f8311600181146111aa57600084156111925750858301515b600019600386901b1c1916600185901b17855561113e565b600085815260208120601f198616915b828110156111d9578886015182559484019460019091019084016111ba565b50858210156111f75787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea26469706673582212205832a0b2c2d868bef954f5cc2827f4b70d7c8d3b931360918441d603d0b364ca64736f6c63430008170033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000054b6172616b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c696e656100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d6f6e61640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005417a75726f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507566666572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055461696b6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000084a062636fa9c653645e93ace69ebc0bc2297544000000000000000000000000d9348779ff75be0e31fd2c7c2180c242658febae00000000000000000000000056a85eace64aab2da245aecd96d62d2c5e862529000000000000000000000000b2cee9221b857b86dab5ce9123874707c77006ba0000000000000000000000008cd75b8768259aa9fe6b8f217cce4e37cac8e76d0000000000000000000000002bd866f401ab7af785bf1b2d0eec4767997f9cc2

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c80638456cb59116100955780639117fcc3116100645780639117fcc3146102b4578063a694fc3a146102d2578063ce6dfadb146102e5578063f2fde38b1461031b578063f434bb681461033b57600080fd5b80638456cb59146102065780638c3962201461021b5780638d75ef67146102485780638da5cb5b1461029657600080fd5b80635c975abb116100d15780635c975abb146101925780636069af65146101b15780636bb32608146101d1578063715018a6146101f157600080fd5b80632027f9c2146101035780632c583bf3146101255780633f4ba83a14610138578063530ec9a11461014d575b600080fd5b34801561010f57600080fd5b5061012361011e366004610cda565b61035d565b005b610123610133366004610e00565b610471565b34801561014457600080fd5b50610123610582565b34801561015957600080fd5b5061017d610168366004610e64565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561019e57600080fd5b50600054600160a01b900460ff1661017d565b3480156101bd57600080fd5b506101236101cc366004610e64565b610594565b3480156101dd57600080fd5b506101236101ec366004610e7d565b6105f8565b3480156101fd57600080fd5b506101236106d6565b34801561021257600080fd5b506101236106e8565b34801561022757600080fd5b5061023b610236366004610e64565b6106f8565b6040516101899190610f02565b34801561025457600080fd5b5061027e610263366004610e64565b6002602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610189565b3480156102a257600080fd5b506000546001600160a01b031661027e565b3480156102c057600080fd5b50600654604051908152602001610189565b6101236102e0366004610e64565b6107a4565b3480156102f157600080fd5b5061027e610300366004610e64565b6000908152600260205260409020546001600160a01b031690565b34801561032757600080fd5b50610123610336366004610f1c565b6107b9565b34801561034757600080fd5b506103506107f4565b6040516101899190610f37565b6103656108cd565b60005b60045481101561046257826040516020016103839190610f9b565b60405160208183030381529060405280519060200120600482815481106103ac576103ac610fb7565b906000526020600020016040516020016103c69190611007565b604051602081830303815290604052805190602001200361045a5760006103ee826001611093565b6000818152600260205260409081902080546001600160a01b0319166001600160a01b038716179055519091507f7dd8ffdcd2ccb9b0f3f3ddb2928047a881eab9d5ac08757468a08c9d078814f39061044c908390879087906110ac565b60405180910390a150505050565b600101610368565b5061046d82826108fa565b5050565b6104796109ec565b805182513491600091146104a05760405163048e2b7f60e41b815260040160405180910390fd5b600a845111156104c35760405163e734d99f60e01b815260040160405180910390fd5b60005b84518110156104fe578381815181106104e1576104e1610fb7565b6020026020010151826104f49190611093565b91506001016104c6565b5081811461051f57604051636115681b60e01b815260040160405180910390fd5b60005b845181101561057b57600085828151811061053f5761053f610fb7565b60200260200101519050600085838151811061055d5761055d610fb7565b602002602001015190506105718282610a17565b5050600101610522565b5050505050565b61058a6108cd565b610592610b3b565b565b61059c6108cd565b806000036105bd576040516338e15c6960e21b815260040160405180910390fd5b60068190556040518181527fb443c8bd39a1b60d415144f9148c6f90c2b68a553eb90c62cef5e44979db009d9060200160405180910390a150565b6106006108cd565b6000828152600260205260409020546001600160a01b031661063557604051633c8f475960e01b815260040160405180910390fd5b60008281526003602052604090205481151560ff90911615150361067c5760405163f4091bb560e01b81526004810183905281151560248201526044015b60405180910390fd5b600082815260036020908152604091829020805460ff19168415159081179091558251858152918201527f837e140d77345d035fa5a122b62a86b4bedc07200343fe4e52d32ea433039d9891015b60405180910390a15050565b6106de6108cd565b6105926000610b90565b6106f06108cd565b610592610be0565b6004818154811061070857600080fd5b90600052602060002001600091509050805461072390610fcd565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90610fcd565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b505050505081565b6107ac6109ec565b6107b68134610a17565b50565b6107c16108cd565b6001600160a01b0381166107eb57604051631e4fbdf760e01b815260006004820152602401610673565b6107b681610b90565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156108c457838290600052602060002001805461083790610fcd565b80601f016020809104026020016040519081016040528092919081815260200182805461086390610fcd565b80156108b05780601f10610885576101008083540402835291602001916108b0565b820191906000526020600020905b81548152906001019060200180831161089357829003601f168201915b505050505081526020019060010190610818565b50505050905090565b6000546001600160a01b031633146105925760405163118cdaa760e01b8152336004820152602401610673565b6001600160a01b0381166109215760405163c825500160e01b815260040160405180910390fd5b60058054906000610931836110dd565b9091555050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016109728382611147565b5060058054600090815260026020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352600390915290819020805460ff19166001179055905490517fb23175a7672d7a3f1ee8d6475a301b6ca026e7defa7bef314817383e8c01c2ef916106ca91859085906110ac565b600054600160a01b900460ff16156105925760405163d93c066560e01b815260040160405180910390fd5b610a1f610c23565b600654811015610a4c576040516388db644560e01b81526004810183905260248101829052604401610673565b6000828152600260205260409020546001600160a01b031680610a8257604051633c8f475960e01b815260040160405180910390fd5b60008381526003602052604090205460ff16610ab45760405163412706e960e11b815260048101849052602401610673565b604080516001600160a01b038316815260208101849052339185917f984a71c9d95fd4794aeba33ae72edfec22053fde75488d63abef9dc69ee795af910160405180910390a36040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610b30573d6000803e3d6000fd5b505061046d60018055565b610b43610c4d565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610be86109ec565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b733390565b600260015403610c4657604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600054600160a01b900460ff1661059257604051638dfc202b60e01b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610cb657610cb6610c77565b604052919050565b80356001600160a01b0381168114610cd557600080fd5b919050565b60008060408385031215610ced57600080fd5b823567ffffffffffffffff80821115610d0557600080fd5b818501915085601f830112610d1957600080fd5b8135602082821115610d2d57610d2d610c77565b610d3f601f8301601f19168201610c8d565b92508183528781838601011115610d5557600080fd5b81818501828501376000818385010152829550610d73818801610cbe565b9450505050509250929050565b600082601f830112610d9157600080fd5b8135602067ffffffffffffffff821115610dad57610dad610c77565b8160051b610dbc828201610c8d565b9283528481018201928281019087851115610dd657600080fd5b83870192505b84831015610df557823582529183019190830190610ddc565b979650505050505050565b60008060408385031215610e1357600080fd5b823567ffffffffffffffff80821115610e2b57600080fd5b610e3786838701610d80565b93506020850135915080821115610e4d57600080fd5b50610e5a85828601610d80565b9150509250929050565b600060208284031215610e7657600080fd5b5035919050565b60008060408385031215610e9057600080fd5b8235915060208301358015158114610ea757600080fd5b809150509250929050565b60005b83811015610ecd578181015183820152602001610eb5565b50506000910152565b60008151808452610eee816020860160208601610eb2565b601f01601f19169290920160200192915050565b602081526000610f156020830184610ed6565b9392505050565b600060208284031215610f2e57600080fd5b610f1582610cbe565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015610f8e57603f19888603018452610f7c858351610ed6565b94509285019290850190600101610f60565b5092979650505050505050565b60008251610fad818460208701610eb2565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680610fe157607f821691505b60208210810361100157634e487b7160e01b600052602260045260246000fd5b50919050565b600080835461101581610fcd565b6001828116801561102d576001811461104257611071565b60ff1984168752821515830287019450611071565b8760005260208060002060005b858110156110685781548a82015290840190820161104f565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156110a6576110a661107d565b92915050565b8381526060602082015260006110c56060830185610ed6565b905060018060a01b0383166040830152949350505050565b6000600182016110ef576110ef61107d565b5060010190565b601f821115611142576000816000526020600020601f850160051c8101602086101561111f5750805b601f850160051c820191505b8181101561113e5782815560010161112b565b5050505b505050565b815167ffffffffffffffff81111561116157611161610c77565b6111758161116f8454610fcd565b846110f6565b602080601f8311600181146111aa57600084156111925750858301515b600019600386901b1c1916600185901b17855561113e565b600085815260208120601f198616915b828110156111d9578886015182559484019460019091019084016111ba565b50858210156111f75787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea26469706673582212205832a0b2c2d868bef954f5cc2827f4b70d7c8d3b931360918441d603d0b364ca64736f6c63430008170033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000054b6172616b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054c696e656100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d6f6e61640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005417a75726f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006507566666572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055461696b6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000084a062636fa9c653645e93ace69ebc0bc2297544000000000000000000000000d9348779ff75be0e31fd2c7c2180c242658febae00000000000000000000000056a85eace64aab2da245aecd96d62d2c5e862529000000000000000000000000b2cee9221b857b86dab5ce9123874707c77006ba0000000000000000000000008cd75b8768259aa9fe6b8f217cce4e37cac8e76d0000000000000000000000002bd866f401ab7af785bf1b2d0eec4767997f9cc2

-----Decoded View---------------
Arg [0] : _protocols (string[]): Karak,Linea,Monad,Azuro,Puffer,Taiko
Arg [1] : _addresses (address[]): 0x84A062636Fa9c653645e93ace69EBC0Bc2297544,0xd9348779FF75be0e31fd2C7C2180C242658fEbae,0x56a85EaCE64aaB2da245aECD96D62d2c5e862529,0xb2CEe9221b857B86Dab5Ce9123874707c77006Ba,0x8Cd75B8768259AA9fE6B8f217ccE4e37CAC8e76D,0x2Bd866F401aB7Af785bf1b2D0Eec4767997f9Cc2

-----Encoded View---------------
28 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 4b6172616b000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 4c696e6561000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 4d6f6e6164000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [16] : 417a75726f000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [18] : 5075666665720000000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [20] : 5461696b6f000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [22] : 00000000000000000000000084a062636fa9c653645e93ace69ebc0bc2297544
Arg [23] : 000000000000000000000000d9348779ff75be0e31fd2c7c2180c242658febae
Arg [24] : 00000000000000000000000056a85eace64aab2da245aecd96d62d2c5e862529
Arg [25] : 000000000000000000000000b2cee9221b857b86dab5ce9123874707c77006ba
Arg [26] : 0000000000000000000000008cd75b8768259aa9fe6b8f217cce4e37cac8e76d
Arg [27] : 0000000000000000000000002bd866f401ab7af785bf1b2d0eec4767997f9cc2


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.