MON Price: $0.018877 (+3.05%)

Contract

0xBfc6216915536bf83e94fB8f24Fc197adB2e3401

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurvePoolConnector

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.0;

import { ICurvePool } from "contracts/interfaces/external/curve/ICurvePool.sol";
import {
    ILiquidityConnector,
    AddLiquidityParams,
    RemoveLiquidityParams
} from "contracts/interfaces/ILiquidityConnector.sol";
import { IFarmConnector, Farm } from "contracts/interfaces/IFarmConnector.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

struct CurveAddLiquidityExtraData {
    uint256 minMintAmount;
}

interface IERC20Decimals {
    function decimals() external view returns (uint8);
}

contract CurvePoolConnector is ILiquidityConnector, IFarmConnector {
    error NotSupported();

    function addLiquidity(
        AddLiquidityParams memory addLiquidityParams
    ) external override {
        CurveAddLiquidityExtraData memory extraData = abi.decode(
            addLiquidityParams.extraData, (CurveAddLiquidityExtraData)
        );

        ICurvePool(addLiquidityParams.router).add_liquidity(
            addLiquidityParams.desiredAmounts, extraData.minMintAmount
        );
    }

    function removeLiquidity(
        RemoveLiquidityParams memory removeLiquidityParams
    ) external override {
        ICurvePool(removeLiquidityParams.router).remove_liquidity(
            removeLiquidityParams.lpAmountIn,
            removeLiquidityParams.minAmountsOut
        );
    }

    function getPoolPrice(
        address lpToken,
        uint256 baseTokenIndex,
        uint256 quoteTokenIndex
    ) external view override returns (uint256 price) {
        address baseToken = ICurvePool(lpToken).coins(baseTokenIndex);
        uint256 baseTokenDecimals = IERC20Decimals(baseToken).decimals();
        address quoteToken = ICurvePool(lpToken).coins(quoteTokenIndex);
        uint256 quoteTokenDecimals = IERC20Decimals(quoteToken).decimals();

        uint256 amountOut0 = ICurvePool(lpToken).get_dy(
            int128(uint128(baseTokenIndex)),
            int128(uint128(quoteTokenIndex)),
            10 ** baseTokenDecimals
        );

        // We swap e.g. 1e18 DAI for USDC. This will return 1e6 USDC.
        // The price is 1e-12 USDC wei for wei or 1e18 normalized (1e6 USDC per
        // 1e18 DAI, price is 1e18).
        // We swap e.g. 1e6 USDC for DAI. This will return 1e12 DAI.
        // The price is 1e12 DAI wei for wei or 1e18 normalized (1e18 DAI per
        // 1e6 USDC, price is 1e18).
        if (amountOut0 > 0) {
            price = amountOut0 * 10 ** (18 - quoteTokenDecimals);
        } else {
            // e.g. 1e18 of base token is < 1 wei of quote token
            uint256 amountOut1 = ICurvePool(lpToken).get_dy(
                int128(uint128(quoteTokenIndex)),
                int128(uint128(baseTokenIndex)),
                10 ** quoteTokenDecimals
            );
            if (amountOut1 == 0) {
                revert InvalidPrice();
            }
            price = 1e36 / (amountOut1 * 10 ** (18 - baseTokenDecimals));
        }

        if (price == 0) {
            revert InvalidPrice();
        }
    }

    function getReserves(
        address lpToken
    ) external view override returns (uint256[] memory reserves) {
        reserves = ICurvePool(lpToken).get_balances();
    }

    function getTokens(
        address lpToken
    ) external view override returns (address[] memory tokens) {
        tokens = new address[](ICurvePool(lpToken).N_COINS());
        for (uint256 i = 0; i < tokens.length; i++) {
            tokens[i] = ICurvePool(lpToken).coins(i);
        }
    }

    // IFarmConnector implementation - no-op for pools without gauges
    // LP tokens stay in the caller's wallet (Sickle)

    function deposit(
        Farm calldata, // farm
        address, // token
        bytes memory // _extraData
    ) external pure override {
        // No-op: LP tokens stay in the caller's wallet
    }

    function withdraw(
        Farm calldata, // farm
        uint256, // amount
        bytes memory // _extraData
    ) external pure override {
        // No-op: LP tokens are already in the caller's wallet
    }

    function claim(
        Farm calldata, // farm
        bytes memory // extraData
    ) external pure override {
        // No-op: No rewards to claim for pools without gauges
    }

    function balanceOf(
        Farm calldata farm,
        address user
    ) external view override returns (uint256) {
        // Return the LP token balance directly from the pool
        return IERC20(farm.stakingContract).balanceOf(user);
    }

    function earned(
        Farm calldata, // farm
        address, // user
        address[] calldata rewardTokens
    ) external pure override returns (uint256[] memory) {
        // No rewards for pools without gauges
        uint256[] memory rewards = new uint256[](rewardTokens.length);
        return rewards;
    }

    function isStaked(
        Farm calldata, // farm
        address // user
    ) external pure override returns (bool) {
        // LP tokens are held but not staked
        return false;
    }
}

File 2 of 9 : ICurvePool.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ICurvePool {
    // Events
    event Transfer(
        address indexed sender, address indexed receiver, uint256 value
    );
    event Approval(
        address indexed owner, address indexed spender, uint256 value
    );
    event TokenExchange(
        address indexed buyer,
        int128 sold_id,
        uint256 tokens_sold,
        int128 bought_id,
        uint256 tokens_bought
    );
    event TokenExchangeUnderlying(
        address indexed buyer,
        int128 sold_id,
        uint256 tokens_sold,
        int128 bought_id,
        uint256 tokens_bought
    );
    event AddLiquidity(
        address indexed provider,
        uint256[] token_amounts,
        uint256[] fees,
        uint256 invariant,
        uint256 token_supply
    );
    event RemoveLiquidity(
        address indexed provider,
        uint256[] token_amounts,
        uint256[] fees,
        uint256 token_supply
    );
    event RemoveLiquidityOne(
        address indexed provider,
        int128 token_id,
        uint256 token_amount,
        uint256 coin_amount,
        uint256 token_supply
    );
    event RemoveLiquidityImbalance(
        address indexed provider,
        uint256[] token_amounts,
        uint256[] fees,
        uint256 invariant,
        uint256 token_supply
    );
    event RampA(
        uint256 old_A, uint256 new_A, uint256 initial_time, uint256 future_time
    );
    event StopRampA(uint256 A, uint256 t);
    event ApplyNewFee(uint256 fee, uint256 offpeg_fee_multiplier);
    event SetNewMATime(uint256 ma_exp_time, uint256 D_ma_time);

    // Exchange functions
    function exchange(
        int128 i,
        int128 j,
        uint256 _dx,
        uint256 _min_dy
    ) external returns (uint256);
    function exchange(
        int128 i,
        int128 j,
        uint256 _dx,
        uint256 _min_dy,
        address _receiver
    ) external returns (uint256);
    function exchange_received(
        int128 i,
        int128 j,
        uint256 _dx,
        uint256 _min_dy
    ) external returns (uint256);
    function exchange_received(
        int128 i,
        int128 j,
        uint256 _dx,
        uint256 _min_dy,
        address _receiver
    ) external returns (uint256);

    // Liquidity functions
    function add_liquidity(
        uint256[] calldata _amounts,
        uint256 _min_mint_amount
    ) external returns (uint256);
    function add_liquidity(
        uint256[] calldata _amounts,
        uint256 _min_mint_amount,
        address _receiver
    ) external returns (uint256);
    function remove_liquidity_one_coin(
        uint256 _burn_amount,
        int128 i,
        uint256 _min_received
    ) external returns (uint256);
    function remove_liquidity_one_coin(
        uint256 _burn_amount,
        int128 i,
        uint256 _min_received,
        address _receiver
    ) external returns (uint256);
    function remove_liquidity_imbalance(
        uint256[] calldata _amounts,
        uint256 _max_burn_amount
    ) external returns (uint256);
    function remove_liquidity_imbalance(
        uint256[] calldata _amounts,
        uint256 _max_burn_amount,
        address _receiver
    ) external returns (uint256);
    function remove_liquidity(
        uint256 _burn_amount,
        uint256[] calldata _min_amounts
    ) external returns (uint256[] memory);
    function remove_liquidity(
        uint256 _burn_amount,
        uint256[] calldata _min_amounts,
        address _receiver
    ) external returns (uint256[] memory);
    function remove_liquidity(
        uint256 _burn_amount,
        uint256[] calldata _min_amounts,
        address _receiver,
        bool _claim_admin_fees
    ) external returns (uint256[] memory);

    // Admin functions
    function withdraw_admin_fees() external;
    function ramp_A(uint256 _future_A, uint256 _future_time) external;
    function stop_ramp_A() external;
    function set_new_fee(
        uint256 _new_fee,
        uint256 _new_offpeg_fee_multiplier
    ) external;
    function set_ma_exp_time(
        uint256 _ma_exp_time,
        uint256 _D_ma_time
    ) external;

    // View functions
    function last_price(
        uint256 i
    ) external view returns (uint256);
    function ema_price(
        uint256 i
    ) external view returns (uint256);
    function get_p(
        uint256 i
    ) external view returns (uint256);
    function price_oracle(
        uint256 i
    ) external view returns (uint256);
    function D_oracle() external view returns (uint256);
    function get_dx(
        int128 i,
        int128 j,
        uint256 dy
    ) external view returns (uint256);
    function get_dy(
        int128 i,
        int128 j,
        uint256 dx
    ) external view returns (uint256);
    function calc_withdraw_one_coin(
        uint256 _burn_amount,
        int128 i
    ) external view returns (uint256);
    function calc_token_amount(
        uint256[] calldata _amounts,
        bool _is_deposit
    ) external view returns (uint256);
    function get_virtual_price() external view returns (uint256);
    function get_balances() external view returns (uint256[] memory);
    function stored_rates() external view returns (uint256[] memory);
    function dynamic_fee(int128 i, int128 j) external view returns (uint256);

    // ERC20 functions
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool);
    function approve(
        address _spender,
        uint256 _value
    ) external returns (bool);
    function permit(
        address _owner,
        address _spender,
        uint256 _value,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) external returns (bool);
    function totalSupply() external view returns (uint256);
    function balanceOf(
        address arg0
    ) external view returns (uint256);
    function allowance(
        address arg0,
        address arg1
    ) external view returns (uint256);

    // Additional view functions
    function A() external view returns (uint256);
    function A_precise() external view returns (uint256);
    function version() external view returns (string memory);
    function N_COINS() external view returns (uint256);
    function coins(
        uint256 arg0
    ) external view returns (address);
    function fee() external view returns (uint256);
    function offpeg_fee_multiplier() external view returns (uint256);
    function admin_fee() external view returns (uint256);
    function initial_A() external view returns (uint256);
    function future_A() external view returns (uint256);
    function initial_A_time() external view returns (uint256);
    function future_A_time() external view returns (uint256);
    function admin_balances(
        uint256 arg0
    ) external view returns (uint256);
    function ma_exp_time() external view returns (uint256);
    function D_ma_time() external view returns (uint256);
    function ma_last_time() external view returns (uint256);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function nonces(
        address arg0
    ) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function salt() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {
    AddLiquidityParams,
    RemoveLiquidityParams
} from "contracts/structs/LiquidityStructs.sol";

interface ILiquidityConnector {
    error InvalidPrice();

    function addLiquidity(
        AddLiquidityParams memory addLiquidityParams
    ) external;

    function removeLiquidity(
        RemoveLiquidityParams memory removeLiquidityParams
    ) external;

    function getPoolPrice(
        address lpToken,
        uint256 baseTokenIndex,
        uint256 quoteTokenIndex
    ) external view returns (uint256);

    function getReserves(
        address lpToken
    ) external view returns (uint256[] memory reserves);

    function getTokens(
        address lpToken
    ) external view returns (address[] memory tokens);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { Farm } from "contracts/structs/FarmStrategyStructs.sol";

interface IFarmConnector {
    function deposit(
        Farm calldata farm,
        address token,
        bytes memory extraData
    ) external;

    function withdraw(
        Farm calldata farm,
        uint256 amount,
        bytes memory extraData
    ) external;

    function claim(Farm calldata farm, bytes memory extraData) external;

    function balanceOf(
        Farm calldata farm,
        address user
    ) external view returns (uint256);

    function earned(
        Farm calldata farm,
        address user,
        address[] calldata rewardTokens
    ) external view returns (uint256[] memory);

    function isStaked(
        Farm calldata farm,
        address user
    ) external view returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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);
}

File 6 of 9 : LiquidityStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

struct AddLiquidityParams {
    address router;
    address lpToken;
    address[] tokens;
    uint256[] desiredAmounts;
    uint256[] minAmounts;
    bytes extraData;
}

struct RemoveLiquidityParams {
    address router;
    address lpToken;
    address[] tokens;
    uint256 lpAmountIn;
    uint256[] minAmountsOut;
    bytes extraData;
}

File 7 of 9 : FarmStrategyStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import { ZapIn, ZapOut } from "contracts/structs/ZapStructs.sol";
import { SwapParams } from "contracts/structs/SwapStructs.sol";

struct Farm {
    address stakingContract;
    uint256 poolIndex;
}

struct DepositParams {
    Farm farm;
    address[] tokensIn;
    uint256[] amountsIn;
    ZapIn zap;
    bytes extraData;
}

struct WithdrawParams {
    bytes extraData;
    ZapOut zap;
    address[] tokensOut;
}

struct HarvestParams {
    SwapParams[] swaps;
    bytes extraData;
    address[] tokensOut;
}

struct CompoundParams {
    Farm claimFarm;
    bytes claimExtraData;
    address[] rewardTokens;
    ZapIn zap;
    Farm depositFarm;
    bytes depositExtraData;
}

struct SimpleDepositParams {
    Farm farm;
    address lpToken;
    uint256 amountIn;
    bytes extraData;
}

struct SimpleHarvestParams {
    address[] rewardTokens;
    bytes extraData;
}

struct SimpleWithdrawParams {
    address lpToken;
    uint256 amountOut;
    bytes extraData;
}

File 8 of 9 : ZapStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { SwapParams } from "contracts/structs/SwapStructs.sol";

import {
    AddLiquidityParams,
    RemoveLiquidityParams
} from "contracts/structs/LiquidityStructs.sol";

struct ZapIn {
    SwapParams[] swaps;
    AddLiquidityParams addLiquidityParams;
}

struct ZapOut {
    RemoveLiquidityParams removeLiquidityParams;
    SwapParams[] swaps;
}

File 9 of 9 : SwapStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

struct SwapParams {
    address tokenApproval;
    address router;
    uint256 amountIn;
    uint256 desiredAmountOut;
    uint256 minAmountOut;
    address tokenIn;
    address tokenOut;
    bytes extraData;
}

Settings
{
  "remappings": [
    "solmate/=lib/solmate/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@morpho-blue/=lib/morpho-blue/src/",
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "morpho-blue/=lib/morpho-blue/",
    "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
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"InvalidPrice","type":"error"},{"inputs":[],"name":"NotSupported","type":"error"},{"inputs":[{"components":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"desiredAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AddLiquidityParams","name":"addLiquidityParams","type":"tuple"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"farm","type":"tuple"},{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"},{"internalType":"address","name":"","type":"address"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"}],"name":"earned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"uint256","name":"baseTokenIndex","type":"uint256"},{"internalType":"uint256","name":"quoteTokenIndex","type":"uint256"}],"name":"getPoolPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256[]","name":"reserves","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"},{"internalType":"address","name":"","type":"address"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256","name":"lpAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct RemoveLiquidityParams","name":"removeLiquidityParams","type":"tuple"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"poolIndex","type":"uint256"}],"internalType":"struct Farm","name":"","type":"tuple"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50611263806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063450efe2111610071578063450efe211461013f5780638bddf1871461015f5780639a47bf0814610171578063dd89e3d214610184578063dd9e02cd14610192578063fb986deb146101a557600080fd5b8063195ac61e146100ae5780631b89f200146100d65780633941dc18146100eb5780633e99c1e41461010c57806341d07dc01461012c575b600080fd5b6100c16100bc366004610939565b6101b8565b60405190151581526020015b60405180910390f35b6100e96100e4366004610a4e565b505050565b005b6100fe6100f9366004610aa5565b6101c1565b6040519081526020016100cd565b61011f61011a366004610ada565b610552565b6040516100cd9190610b32565b6100e961013a366004610c2c565b6105ba565b61015261014d366004610ada565b61063a565b6040516100cd9190610d0c565b6100e961016d366004610d59565b5050565b61011f61017f366004610da7565b610798565b6100e96100e4366004610e3a565b6100fe6101a0366004610939565b6107e8565b6100e96101b3366004610e84565b61086a565b60005b92915050565b60405163c661065760e01b81526004810183905260009081906001600160a01b0386169063c661065790602401602060405180830381865afa15801561020b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022f9190610f3f565b90506000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102959190610f5c565b60ff1690506000866001600160a01b031663c6610657866040518263ffffffff1660e01b81526004016102ca91815260200190565b602060405180830381865afa1580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b9190610f3f565b90506000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190610f5c565b60ff16905060006001600160a01b038916635e0d443f898961039488600a611079565b6040516001600160e01b031960e086901b168152600f93840b60048201529190920b60248201526044810191909152606401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104079190611085565b905080156104365761041a82601261109e565b61042590600a611079565b61042f90826110b1565b9550610526565b60006001600160a01b038a16635e0d443f898b61045487600a611079565b6040516001600160e01b031960e086901b168152600f93840b60048201529190920b60248201526044810191909152606401602060405180830381865afa1580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c79190611085565b9050806000036104e95760405162bfc92160e01b815260040160405180910390fd5b6104f485601261109e565b6104ff90600a611079565b61050990826110b1565b610522906ec097ce7bc90715b34b9f10000000006110c8565b9650505b856000036105465760405162bfc92160e01b815260040160405180910390fd5b50505050509392505050565b6060816001600160a01b03166314f059796040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101bb91908101906110ea565b80516060820151608083015160405163350376e360e21b81526001600160a01b039093169263d40ddb8c926105f392909160040161117a565b6000604051808303816000875af1158015610612573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261016d91908101906110ea565b6060816001600160a01b031663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069e9190611085565b6001600160401b038111156106b5576106b5610971565b6040519080825280602002602001820160405280156106de578160200160208202803683370190505b50905060005b81518110156107925760405163c661065760e01b8152600481018290526001600160a01b0384169063c661065790602401602060405180830381865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190610f3f565b8282815181106107685761076861119b565b6001600160a01b03909216602092830291909101909101528061078a816111b1565b9150506106e4565b50919050565b60606000826001600160401b038111156107b4576107b4610971565b6040519080825280602002602001820160405280156107dd578160200160208202803683370190505b509695505050505050565b60006107f76020840184610ada565b6040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611085565b9392505050565b60008160a0015180602001905181019061088491906111ca565b825160608401518251604051635b96faef60e11b81529394506001600160a01b039092169263b72df5de926108bc929160040161120b565b6020604051808303816000875af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e49190611085565b60006040828403121561079257600080fd5b6001600160a01b038116811461092657600080fd5b50565b803561093481610911565b919050565b6000806060838503121561094c57600080fd5b61095684846108ff565b9150604083013561096681610911565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156109a9576109a9610971565b60405290565b604051601f8201601f191681016001600160401b03811182821017156109d7576109d7610971565b604052919050565b600082601f8301126109f057600080fd5b81356001600160401b03811115610a0957610a09610971565b610a1c601f8201601f19166020016109af565b818152846020838601011115610a3157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060808486031215610a6357600080fd5b610a6d85856108ff565b92506040840135915060608401356001600160401b03811115610a8f57600080fd5b610a9b868287016109df565b9150509250925092565b600080600060608486031215610aba57600080fd5b8335610ac581610911565b95602085013595506040909401359392505050565b600060208284031215610aec57600080fd5b813561086381610911565b600081518084526020808501945080840160005b83811015610b2757815187529582019590820190600101610b0b565b509495945050505050565b6020815260006108636020830184610af7565b60006001600160401b03821115610b5e57610b5e610971565b5060051b60200190565b600082601f830112610b7957600080fd5b81356020610b8e610b8983610b45565b6109af565b82815260059290921b84018101918181019086841115610bad57600080fd5b8286015b848110156107dd578035610bc481610911565b8352918301918301610bb1565b600082601f830112610be257600080fd5b81356020610bf2610b8983610b45565b82815260059290921b84018101918181019086841115610c1157600080fd5b8286015b848110156107dd5780358352918301918301610c15565b600060208284031215610c3e57600080fd5b81356001600160401b0380821115610c5557600080fd5b9083019060c08286031215610c6957600080fd5b610c71610987565b610c7a83610929565b8152610c8860208401610929565b6020820152604083013582811115610c9f57600080fd5b610cab87828601610b68565b60408301525060608301356060820152608083013582811115610ccd57600080fd5b610cd987828601610bd1565b60808301525060a083013582811115610cf157600080fd5b610cfd878286016109df565b60a08301525095945050505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4d5783516001600160a01b031683529284019291840191600101610d28565b50909695505050505050565b60008060608385031215610d6c57600080fd5b610d7684846108ff565b915060408301356001600160401b03811115610d9157600080fd5b610d9d858286016109df565b9150509250929050565b60008060008060808587031215610dbd57600080fd5b610dc786866108ff565b93506040850135610dd781610911565b925060608501356001600160401b0380821115610df357600080fd5b818701915087601f830112610e0757600080fd5b813581811115610e1657600080fd5b8860208260051b8501011115610e2b57600080fd5b95989497505060200194505050565b600080600060808486031215610e4f57600080fd5b610e5985856108ff565b92506040840135610e6981610911565b915060608401356001600160401b03811115610a8f57600080fd5b600060208284031215610e9657600080fd5b81356001600160401b0380821115610ead57600080fd5b9083019060c08286031215610ec157600080fd5b610ec9610987565b610ed283610929565b8152610ee060208401610929565b6020820152604083013582811115610ef757600080fd5b610f0387828601610b68565b604083015250606083013582811115610f1b57600080fd5b610f2787828601610bd1565b606083015250608083013582811115610ccd57600080fd5b600060208284031215610f5157600080fd5b815161086381610911565b600060208284031215610f6e57600080fd5b815160ff8116811461086357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115610fd0578160001904821115610fb657610fb6610f7f565b80851615610fc357918102915b93841c9390800290610f9a565b509250929050565b600082610fe7575060016101bb565b81610ff4575060006101bb565b816001811461100a576002811461101457611030565b60019150506101bb565b60ff84111561102557611025610f7f565b50506001821b6101bb565b5060208310610133831016604e8410600b8410161715611053575081810a6101bb565b61105d8383610f95565b806000190482111561107157611071610f7f565b029392505050565b60006108638383610fd8565b60006020828403121561109757600080fd5b5051919050565b818103818111156101bb576101bb610f7f565b80820281158282048414176101bb576101bb610f7f565b6000826110e557634e487b7160e01b600052601260045260246000fd5b500490565b600060208083850312156110fd57600080fd5b82516001600160401b0381111561111357600080fd5b8301601f8101851361112457600080fd5b8051611132610b8982610b45565b81815260059190911b8201830190838101908783111561115157600080fd5b928401925b8284101561116f57835182529284019290840190611156565b979650505050505050565b8281526040602082015260006111936040830184610af7565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016111c3576111c3610f7f565b5060010190565b6000602082840312156111dc57600080fd5b604051602081018181106001600160401b03821117156111fe576111fe610971565b6040529151825250919050565b60408152600061121e6040830185610af7565b9050826020830152939250505056fea26469706673582212205f8742c51e0b10041535ee5125fe2980092cebffe3de2ea08c1938043dcf219a64736f6c63430008130033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063450efe2111610071578063450efe211461013f5780638bddf1871461015f5780639a47bf0814610171578063dd89e3d214610184578063dd9e02cd14610192578063fb986deb146101a557600080fd5b8063195ac61e146100ae5780631b89f200146100d65780633941dc18146100eb5780633e99c1e41461010c57806341d07dc01461012c575b600080fd5b6100c16100bc366004610939565b6101b8565b60405190151581526020015b60405180910390f35b6100e96100e4366004610a4e565b505050565b005b6100fe6100f9366004610aa5565b6101c1565b6040519081526020016100cd565b61011f61011a366004610ada565b610552565b6040516100cd9190610b32565b6100e961013a366004610c2c565b6105ba565b61015261014d366004610ada565b61063a565b6040516100cd9190610d0c565b6100e961016d366004610d59565b5050565b61011f61017f366004610da7565b610798565b6100e96100e4366004610e3a565b6100fe6101a0366004610939565b6107e8565b6100e96101b3366004610e84565b61086a565b60005b92915050565b60405163c661065760e01b81526004810183905260009081906001600160a01b0386169063c661065790602401602060405180830381865afa15801561020b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061022f9190610f3f565b90506000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102959190610f5c565b60ff1690506000866001600160a01b031663c6610657866040518263ffffffff1660e01b81526004016102ca91815260200190565b602060405180830381865afa1580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b9190610f3f565b90506000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190610f5c565b60ff16905060006001600160a01b038916635e0d443f898961039488600a611079565b6040516001600160e01b031960e086901b168152600f93840b60048201529190920b60248201526044810191909152606401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104079190611085565b905080156104365761041a82601261109e565b61042590600a611079565b61042f90826110b1565b9550610526565b60006001600160a01b038a16635e0d443f898b61045487600a611079565b6040516001600160e01b031960e086901b168152600f93840b60048201529190920b60248201526044810191909152606401602060405180830381865afa1580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c79190611085565b9050806000036104e95760405162bfc92160e01b815260040160405180910390fd5b6104f485601261109e565b6104ff90600a611079565b61050990826110b1565b610522906ec097ce7bc90715b34b9f10000000006110c8565b9650505b856000036105465760405162bfc92160e01b815260040160405180910390fd5b50505050509392505050565b6060816001600160a01b03166314f059796040518163ffffffff1660e01b8152600401600060405180830381865afa158015610592573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526101bb91908101906110ea565b80516060820151608083015160405163350376e360e21b81526001600160a01b039093169263d40ddb8c926105f392909160040161117a565b6000604051808303816000875af1158015610612573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261016d91908101906110ea565b6060816001600160a01b031663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069e9190611085565b6001600160401b038111156106b5576106b5610971565b6040519080825280602002602001820160405280156106de578160200160208202803683370190505b50905060005b81518110156107925760405163c661065760e01b8152600481018290526001600160a01b0384169063c661065790602401602060405180830381865afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190610f3f565b8282815181106107685761076861119b565b6001600160a01b03909216602092830291909101909101528061078a816111b1565b9150506106e4565b50919050565b60606000826001600160401b038111156107b4576107b4610971565b6040519080825280602002602001820160405280156107dd578160200160208202803683370190505b509695505050505050565b60006107f76020840184610ada565b6040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108639190611085565b9392505050565b60008160a0015180602001905181019061088491906111ca565b825160608401518251604051635b96faef60e11b81529394506001600160a01b039092169263b72df5de926108bc929160040161120b565b6020604051808303816000875af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e49190611085565b60006040828403121561079257600080fd5b6001600160a01b038116811461092657600080fd5b50565b803561093481610911565b919050565b6000806060838503121561094c57600080fd5b61095684846108ff565b9150604083013561096681610911565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156109a9576109a9610971565b60405290565b604051601f8201601f191681016001600160401b03811182821017156109d7576109d7610971565b604052919050565b600082601f8301126109f057600080fd5b81356001600160401b03811115610a0957610a09610971565b610a1c601f8201601f19166020016109af565b818152846020838601011115610a3157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060808486031215610a6357600080fd5b610a6d85856108ff565b92506040840135915060608401356001600160401b03811115610a8f57600080fd5b610a9b868287016109df565b9150509250925092565b600080600060608486031215610aba57600080fd5b8335610ac581610911565b95602085013595506040909401359392505050565b600060208284031215610aec57600080fd5b813561086381610911565b600081518084526020808501945080840160005b83811015610b2757815187529582019590820190600101610b0b565b509495945050505050565b6020815260006108636020830184610af7565b60006001600160401b03821115610b5e57610b5e610971565b5060051b60200190565b600082601f830112610b7957600080fd5b81356020610b8e610b8983610b45565b6109af565b82815260059290921b84018101918181019086841115610bad57600080fd5b8286015b848110156107dd578035610bc481610911565b8352918301918301610bb1565b600082601f830112610be257600080fd5b81356020610bf2610b8983610b45565b82815260059290921b84018101918181019086841115610c1157600080fd5b8286015b848110156107dd5780358352918301918301610c15565b600060208284031215610c3e57600080fd5b81356001600160401b0380821115610c5557600080fd5b9083019060c08286031215610c6957600080fd5b610c71610987565b610c7a83610929565b8152610c8860208401610929565b6020820152604083013582811115610c9f57600080fd5b610cab87828601610b68565b60408301525060608301356060820152608083013582811115610ccd57600080fd5b610cd987828601610bd1565b60808301525060a083013582811115610cf157600080fd5b610cfd878286016109df565b60a08301525095945050505050565b6020808252825182820181905260009190848201906040850190845b81811015610d4d5783516001600160a01b031683529284019291840191600101610d28565b50909695505050505050565b60008060608385031215610d6c57600080fd5b610d7684846108ff565b915060408301356001600160401b03811115610d9157600080fd5b610d9d858286016109df565b9150509250929050565b60008060008060808587031215610dbd57600080fd5b610dc786866108ff565b93506040850135610dd781610911565b925060608501356001600160401b0380821115610df357600080fd5b818701915087601f830112610e0757600080fd5b813581811115610e1657600080fd5b8860208260051b8501011115610e2b57600080fd5b95989497505060200194505050565b600080600060808486031215610e4f57600080fd5b610e5985856108ff565b92506040840135610e6981610911565b915060608401356001600160401b03811115610a8f57600080fd5b600060208284031215610e9657600080fd5b81356001600160401b0380821115610ead57600080fd5b9083019060c08286031215610ec157600080fd5b610ec9610987565b610ed283610929565b8152610ee060208401610929565b6020820152604083013582811115610ef757600080fd5b610f0387828601610b68565b604083015250606083013582811115610f1b57600080fd5b610f2787828601610bd1565b606083015250608083013582811115610ccd57600080fd5b600060208284031215610f5157600080fd5b815161086381610911565b600060208284031215610f6e57600080fd5b815160ff8116811461086357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115610fd0578160001904821115610fb657610fb6610f7f565b80851615610fc357918102915b93841c9390800290610f9a565b509250929050565b600082610fe7575060016101bb565b81610ff4575060006101bb565b816001811461100a576002811461101457611030565b60019150506101bb565b60ff84111561102557611025610f7f565b50506001821b6101bb565b5060208310610133831016604e8410600b8410161715611053575081810a6101bb565b61105d8383610f95565b806000190482111561107157611071610f7f565b029392505050565b60006108638383610fd8565b60006020828403121561109757600080fd5b5051919050565b818103818111156101bb576101bb610f7f565b80820281158282048414176101bb576101bb610f7f565b6000826110e557634e487b7160e01b600052601260045260246000fd5b500490565b600060208083850312156110fd57600080fd5b82516001600160401b0381111561111357600080fd5b8301601f8101851361112457600080fd5b8051611132610b8982610b45565b81815260059190911b8201830190838101908783111561115157600080fd5b928401925b8284101561116f57835182529284019290840190611156565b979650505050505050565b8281526040602082015260006111936040830184610af7565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016111c3576111c3610f7f565b5060010190565b6000602082840312156111dc57600080fd5b604051602081018181106001600160401b03821117156111fe576111fe610971565b6040529151825250919050565b60408152600061121e6040830185610af7565b9050826020830152939250505056fea26469706673582212205f8742c51e0b10041535ee5125fe2980092cebffe3de2ea08c1938043dcf219a64736f6c63430008130033

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

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.