S Price: $0.532574 (-10.78%)

Contract

0xaee9C74ce57B079eDdEDE4FE8333C7b4C2fB9d40

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LPManagerHelper

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, BSL 1.1 license
File 1 of 6 : LPManagerHelper.sol
// SPDX-License-Identifier: BUSL-1.1
// (c) Long Gamma Labs, 2024.
pragma solidity ^0.8.28;


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


import { ErrorReporter } from "./ErrorReporter.sol";
import { ILPManager } from "./interfaces/ILPManager.sol";
import { IProxyLOB } from "./interfaces/IProxyLOB.sol";
import { TokenValueCalculator } from "./utils/TokenValueCalculator.sol";


contract LPManagerHelper {
    /// @notice Calculates the total USD value of all tokens in the liquidity pool.
    /// @return totalUSDValue The total USD value of the liquidity pool, normalized to 18 decimal places.
    function getTotalValue(address lpManagerAddress) external view returns (uint256 totalUSDValue) {
        ILPManager lpManager = ILPManager(lpManagerAddress);
        IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress);
        uint256 tokensCount = lpManager.getTokensCount();
        
        for (uint8 i = 0; i < tokensCount; ++i) {
            (address tokenAddress,,,,, uint8 decimals,,) = lpManager.tokens(i);
            IERC20 token = IERC20(tokenAddress);

            uint256 currentTokenShares = token.balanceOf(lpManagerAddress) + proxyLOB.lobReservesByTokenId(i);
            (uint256 currentTokenPrice, int32 currentTokenPriceExpo) = proxyLOB.getPriceOf(i);

            uint256 currentTokenValue = TokenValueCalculator.calcNormalizedValue(
                currentTokenShares,
                decimals,
                currentTokenPrice,
                currentTokenPriceExpo
            );
            totalUSDValue += currentTokenValue;
        }
    }

    /// @notice Returns two arrays, one with the shares of each token, and the other with their USD value.
    /// @dev This function is primarily intended for off-chain analysis.
    /// @return shares An array with the shares of each token.
    /// @return usdValues An array with the USD values of each token.
    function getTokenSharesAndValues(address lpManagerAddress) external view returns (uint256[] memory shares, uint256[] memory usdValues) {
        ILPManager lpManager = ILPManager(lpManagerAddress);
        IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress);

        uint256 tokenCount = lpManager.getTokensCount();
        shares = new uint256[](tokenCount);
        usdValues = new uint256[](tokenCount);

        for (uint8 i = 0; i < tokenCount; ++i) {
            (address tokenAddress,,,,, uint8 decimals,,) = lpManager.tokens(i);
            IERC20 token = IERC20(tokenAddress);
            uint256 currentTokenShares = token.balanceOf(lpManagerAddress) + proxyLOB.lobReservesByTokenId(i);
            shares[i] = currentTokenShares;
            (uint256 currentTokenPrice, int32 currentTokenPriceExpo) = proxyLOB.getPriceOf(i);

            usdValues[i] = TokenValueCalculator.calcNormalizedValue(
                currentTokenShares,
                decimals,
                currentTokenPrice,
                currentTokenPriceExpo
            );
        }
    }

    /// @notice Retrieves the total number of token shares, considering the balance on the contract and orders.
    /// @param tokenId The identifier of the token in the tokens array.
    /// @return The total number of token shares.
    function getTotalSharesOf(address lpManagerAddress, uint8 tokenId) external view returns (uint256) {
        ILPManager lpManager = ILPManager(lpManagerAddress);
        IProxyLOB proxyLOB = IProxyLOB(lpManagerAddress);
        require(tokenId < lpManager.getTokensCount(), ErrorReporter.WrongTokenId());

        (address tokenAddress,,,,,,,) = lpManager.tokens(tokenId);
        IERC20 token = IERC20(tokenAddress);
        uint256 tokensInContract = token.balanceOf(lpManagerAddress);
        uint256 tokensInOrders = proxyLOB.lobReservesByTokenId(tokenId);
        return (tokensInContract + tokensInOrders);
    }
}

File 2 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

File 3 of 6 : ErrorReporter.sol
// SPDX-License-Identifier: BUSL-1.1
// (c) Long Gamma Labs, 2024.
pragma solidity ^0.8.28;


contract ErrorReporter {
    error CooldownDurationNotYetPassed();
    // 0x5fba365d 

    error EmptyDomainName();
    // 0x2f601761 

    error EmptyTokenName();
    // 0xe2592aed 

    error EmptyTokenSymbol();
    // 0x19c7070a 

    error Expired();
    // 0x203d82d8 

    error FeeBpsExceedsMaximum();
    // 0x132df9c5 

    error Forbidden();
    // 0xee90c468 

    error InsufficientBalance();
    // 0xf4d678b8 

    error InsufficientFeeForPythUpdate();
    // 0xe4764c6f 

    error InsufficientLiquidityValue();
    // 0x5b635d0b 

    error InsufficientMarketMakerLPShare();
    // 0x28f53493 

    error InsufficientMintedLP();
    // 0x212c18d0 

    error InsufficientTokenAmount();
    // 0x2ec48042 

    error InsufficientUSDValue();
    // 0xd6f69157 

    error InvalidFloatingPointRepresentation();
    // 0xa25f85b7 

    error InvalidLob();
    // 0xb9c44f1a 

    error InvalidLobAddress();
    // 0xec09da35 

    error InvalidOracleConfidenceLevel();
    // 0xe6b9bbad 

    error InvalidSignature();
    // 0x8baa579f 

    error InvalidTokenWeights();
    // 0x4b8072c3 

    error InvalidTrader();
    // 0xfb7595a2 

    error InvalidTransfer();
    // 0x2f352531 

    error LobDisabled();
    // 0xa6876da4 

    error MarketMakerLPShareExceedsMaximum();
    // 0x84d3d6cb 

    error MaxLiquidityValueExceeded();
    // 0x9009a2d8 

    error MaxOracleAgeExceedsMaximum();
    // 0x8b7df994

    error NativeGasTokenDisabled();
    // 0x60787531 

    error NonPositivePrice();
    // 0x13caeeae 

    error NotImplementedYet();
    // 0xf88c75b4 

    error OracleConfTooHigh();
    // 0x004f2349 

    error OrderAlreadyUsed();
    // 0x88b39043 

    error PartiallyPaused();
    // 0x1fa6172a

    error PriceTooBig();
    // 0x9bec8e38 

    error PriceTooSmall();
    // 0x8460540d 

    error SlashingUnAvailable();
    // 0xd7b45887 

    error TokenDisabled();
    // 0x1931ea85 

    error TokenWeightExceeded();
    // 0x725ad4f5 

    error TransferFailed();
    // 0x90b8ec18 

    error UnknownLob();
    // 0x0b1066eb 

    error WrongNumber();
    // 0x3546a07e 

    error WrongTokenId();
    // 0x749aeece 

    error ZeroAddress();
    // 0xd92e233d 

    error ZeroAmount();
    // 0x1f2a2005 
}

File 4 of 6 : ILPManager.sol
// SPDX-License-Identifier: BUSL-1.1
// (c) Long Gamma Labs, 2024.
pragma solidity ^0.8.28;

struct FeeConfig {
    /// @notice Enable or disable dynamic fees adjustment based on token weight imbalances.
    bool dynamicFeesEnabled;
    /// @notice Admin fee for minting LP tokens (100 = 1%, maximum 1000 = 10%).
    uint16 adminMintLPFeeBps;
    /// @notice Admin fee for burning LP tokens (100 = 1%, maximum 1000 = 10%).
    uint16 adminBurnLPFeeBps;
    /// @notice Base protocol fee (100 = 1%, maximum 1000 = 10%).
    uint16 feeBasisBps;
    /// @notice Additional tax fee for imbalanced operations (100 = 1%, maximum 1000 = 10%).
    uint16 taxBasisBps;
    /// @notice Performance fee in basis points charged when LP token price reaches new high-water mark (100 = 1%, maximum 3000 = 30%).
    uint16 perfFeeBps;
    /// @notice Admin's share of the performance fee in basis points (100 = 1%, maximum 10000 = 100%).
    uint16 adminPerfFeeBps;
    /// @notice The address that will receive the admin fees.
    address adminFeeRecipient;
}

struct LiquidityConfig {
    /// @notice Lockup period after adding liquidity in seconds
    ///         during which removeLiquidity and LP token transfers are blocked
    ///         (maximum 16 777 215 seconds ≈ 194 days)
    uint24 cooldownDuration;
    /// @notice Minimum liquidity value in USD (scaled by 1e18).
    uint128 minLiquidityValueUsd;
    /// @notice Maximum liquidity value in USD (scaled by 1e18).
    uint128 maxLiquidityValueUsd;
}

struct MarketMakerConfig {
    /// @notice Enable or disable minimum market maker share in LP tokens.
    bool marketMakerLPShareEnabled;
    /// @notice Minimum market maker share in LP tokens (100 = 1%, maximum 10000 = 100%).
    uint16 marketMakerLPShareBps;
}

struct NativeTokenConfig {
    /// @notice Flag to enable or disable the use of the native GAS token for transactions.
    bool enabled;
    /// @notice The index of the token in the tokens array that is used as the native GAS token, if enabled.
    uint8 tokenId;
}

struct PriceConfig {
    /// @notice Maximum allowable age of oracle price data in seconds.
    uint16 maxOracleAge;
    /// @notice The period in seconds for which the LP token price is considered valid.
    uint24 priceValidityPeriod;
    /// @notice Base multiplier for calculating the allowed LP token price deviation (scaled by 1e18).
    uint64 baseMultiplier;
    /// @notice The maximum allowed deviation of the LP token price from the previous valid price.
    uint64 maxAllowedPriceDeviation;
}

interface ILPManager {
    // governance
    function setConfig(
        FeeConfig calldata feeConfig,
        LiquidityConfig calldata liquidityConfig,
        MarketMakerConfig calldata mmConfig,
        NativeTokenConfig calldata nativeConfig,
        PriceConfig calldata priceConfig
    ) external;

    function getConfig() external view returns (
        FeeConfig memory feeConfig,
        LiquidityConfig memory liquidityConfig,
        MarketMakerConfig memory mmConfig,
        NativeTokenConfig memory nativeConfig,
        PriceConfig memory priceConfig,
        bool slashingStatus
    );

    function changeToken(
        address tokenAddress,
        bool isActive,
        uint16 targetWeight,
        uint16 lowerBoundWeight,
        uint16 upperBoundWeight,
        uint8 decimals,
        uint24 oracleConfRel,
        bytes32 oraclePriceId
    ) external;

    function changeLob(
        address lobAddress,
        bool isActive,
        uint8 tokenIdX,
        uint8 tokenIdY,
        uint16 maxOrderDistanceBps
    ) external;

    function slashMakersShares(uint256 amount) external;
    function disableSlashingStatus() external;
    function pause() external;
    function validateLPPriceAndDistributeFees(bytes[] calldata priceUpdateData) payable external;

    // client entries
    function addLiquidity(
        uint8 tokenID,
        uint256 amount,
        uint256 minUsdValue,
        uint256 minLPMinted,
        uint256 expires,
        bytes[] calldata priceUpdateData
    ) external payable returns (uint256);

    function removeLiquidity(
        uint8 tokenID,
        uint256 burnLP,
        uint256 minUsdValue,
        uint256 minTokenGet,
        uint256 expires,
        bytes[] calldata priceUpdateData
    ) external payable returns (uint256);

    function collectFees() external;

    // views
    function getFeeBasisPoints(
        uint256 totalValue,
        uint256 initialTokenValue,
        uint256 nextTokenValue,
        uint16 targetTokenWeight
    ) external view returns (uint256);
    function tokens(uint256 index) external view returns (
        address tokenAddress,
        bool isActive,
        uint16 targetWeight,
        uint16 lowerBoundWeight,
        uint16 upperBoundWeight,
        uint8 decimals,
        uint24 oracleConfRel,
        bytes32 oraclePriceId
    );
    function lastAddedAt(address account) external view returns (uint256);
    function totalWeight() external view returns (uint24);
    function checkCooldown(address account) external view;
    function getTokensCount() external view returns (uint256);
    function marketMakers(address account) external view returns (bool);
    function primaryMarketMaker() external view returns (address);
    function validateMarketMakerLPShare() external view;
    function ensureNotPartiallyPaused() external view;
    function lobs(uint256 index) external view returns (
        address lobAddress,
        uint8 tokenIdX,
        uint8 tokenIdY,
        bool isActive,
        uint16 maxOrderDistanceBps
    );
}

File 5 of 6 : IProxyLOB.sol
// SPDX-License-Identifier: BUSL-1.1
// (c) Long Gamma Labs, 2024.
pragma solidity ^0.8.28;


interface IProxyLOB {
    function lobReservesByTokenId(uint8 tokenId) external view returns (uint256);
    function getPriceOf(uint8 tokenId) external view returns (uint256, int32);
    function placeOrder(
        uint8 lobId,
        bool isAsk,
        uint128 quantity,
        uint72 price,
        uint128 maxCommission,
        bool marketOnly,
        bool postOnly,
        uint256 expires,
        bytes[] calldata priceUpdateData
    ) external payable returns (uint64 orderId);
    function claimOrder(uint8 lobId, uint64 orderId, bool onlyClaim, uint256 expires) external;
}

File 6 of 6 : TokenValueCalculator.sol
// SPDX-License-Identifier: BUSL-1.1
// (c) Long Gamma Labs, 2024.
pragma solidity ^0.8.28;


library TokenValueCalculator {

    /// @notice Calculates normalized USD value of tokens with 18 decimals precision.
    /// @param tokenShares The amount of token shares.
    /// @param tokenDecimals The number of decimals the token uses.
    /// @param price The price of one token in USD, scaled by 10^priceExpo.
    /// @param priceExpo The exponent that the price is scaled by.
    /// @return The normalized USD value of the token shares, normalized to 18 decimal places.
    function calcNormalizedValue(
        uint256 tokenShares,
        uint8 tokenDecimals,
        uint256 price,
        int32 priceExpo
    ) internal pure returns (uint256) {
        int256 decimalAdjustment;
        unchecked {
            decimalAdjustment = int256(uint256(tokenDecimals)) - priceExpo - 18;
        }
        
        uint256 normalizedValue = tokenShares * price;
        if (decimalAdjustment > 0) {
            normalizedValue /= 10 ** uint256(decimalAdjustment);
        } else {
            normalizedValue *= 10 ** uint256(-decimalAdjustment);
        }

        return normalizedValue;
    }

    /// @notice Calculates the amount of token shares corresponding to a given USD value, taking into account 
    /// token decimals and price normalization. This is the inverse operation of calcNormalizedValue.
    /// @param usdValue The value in USD for which to calculate the corresponding token shares.
    /// @param tokenDecimals The number of decimals of the token for which shares are being calculated.
    /// @param price The price of the token in USD, adjusted by the price exponent.
    /// @param priceExpo The exponent to which the price is normalized (e.g., -18 for wei normalization).
    /// @return tokenAmount The calculated amount of token shares.
    function calcTokenShares(
        uint256 usdValue,
        uint8 tokenDecimals,
        uint256 price,
        int32 priceExpo
    ) internal pure returns (uint256) {
        int256 decimalAdjustment;
        unchecked {
            decimalAdjustment = int256(uint256(tokenDecimals)) - priceExpo - 18;
        }

        uint256 tokenAmount;
        if (decimalAdjustment > 0) {
            // There is no practical benefit to using mulDiv with real data here.
            tokenAmount = usdValue * 10 ** uint256(decimalAdjustment) / price;
        } else {
            tokenAmount = usdValue / (price * 10 ** uint256(-decimalAdjustment));
        }
        
        return tokenAmount;
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@onchainclob/contracts/=lib/onchain-clob-contracts/src/",
    "@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/",
    "@solmate/src/=lib/onchain-clob-contracts/lib/solmate/src/",
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "onchain-clob-contracts/=lib/onchain-clob-contracts/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "pyth-sdk-solidity/=lib/pyth-sdk-solidity/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"WrongTokenId","type":"error"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"}],"name":"getTokenSharesAndValues","outputs":[{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"uint256[]","name":"usdValues","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"},{"internalType":"uint8","name":"tokenId","type":"uint8"}],"name":"getTotalSharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpManagerAddress","type":"address"}],"name":"getTotalValue","outputs":[{"internalType":"uint256","name":"totalUSDValue","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080806040523460155761099c908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea264697066735822122021a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d64736f6c634300081c0033

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f3560e01c90816368637549146104c457508063a9b631f7146102325763d3c1a7431461003d575f80fd5b3461016f57604036600319011261016f57610056610701565b6024359060ff821680920361016f57604051633962f82d60e01b81526001600160a01b039190911690602081600481855afa90811561017b575f91610200575b508210156101f1576040516327b2595f60e11b8152600481018390529161010083602481855afa92831561017b576024936020915f916101bb575b506040516370a0823160e01b81526004810185905294859182906001600160a01b03165afa92831561017b575f93610186575b5060209060246040518094819363246451e560e01b835260048301525afa90811561017b575f91610144575b602061013c8385610834565b604051908152f35b90506020813d602011610173575b8161015f6020938361074a565b8101031261016f57516020610130565b5f80fd5b3d9150610152565b6040513d5f823e3d90fd5b9092506020813d6020116101b3575b816101a26020938361074a565b8101031261016f5751916020610104565b3d9150610195565b6101dd91506101003d81116101ea575b6101d5818361074a565b8101906107b4565b505050505050505f6100d1565b503d6101cb565b633a4d776760e11b5f5260045ffd5b90506020813d60201161022a575b8161021b6020938361074a565b8101031261016f57515f610096565b3d915061020e565b3461016f57602036600319011261016f576001600160a01b03610253610701565b16604051633962f82d60e01b8152602081600481855afa90811561017b575f91610492575b5061028281610879565b9161028c82610879565b905f5b60ff81169084821015610464576040516327b2595f60e11b8152600481018390529161010083602481875afa92831561017b575f905f94610434575b506040516370a0823160e01b81526004810186905290602090829060249082906001600160a01b03165afa90811561017b575f91610403575b5060405163246451e560e01b81526004810183905290602082602481895afa90811561017b575f916103ce575b61033b9250610834565b9283610347838a6108ab565b5260405193632ea68d8560e01b8552826004860152604085602481895afa801561017b576103939561038d93610386935f925f94610398575b506108f4565b91866108ab565b52610780565b61028f565b9093506103bd91925060403d81116103c7575b6103b5818361074a565b810190610841565b919091928d610380565b503d6103ab565b90506020823d82116103fb575b816103e86020938361074a565b8101031261016f5761033b915190610331565b3d91506103db565b90506020813d821161042c575b8161041d6020938361074a565b8101031261016f575188610304565b3d9150610410565b6020945060249150610454906101003d81116101ea576101d5818361074a565b50509894935050505091506102cb565b6104808661048e86604051938493604085526040850190610717565b908382036020850152610717565b0390f35b90506020813d6020116104bc575b816104ad6020938361074a565b8101031261016f575182610278565b3d91506104a0565b3461016f57602036600319011261016f576104dd610701565b633962f82d60e01b82526001600160a01b0316905f90602081600481865afa90811561017b575f916106cf575b505f915b60ff831690828210156106c4576040516327b2595f60e11b8152600481018390529061010082602481895afa91821561017b575f905f93610694575b506040516370a0823160e01b81526004810188905290602090829060249082906001600160a01b03165afa90811561017b575f91610663575b5060405163246451e560e01b815260048101859052906020826024818b5afa90811561017b575f9161062e575b6105ba9250610834565b60405193632ea68d8560e01b855260048501526040846024818a5afa801561017b57610602946105fc946105f6935f925f9461060857506108f4565b90610834565b92610780565b9161050e565b90935061062491925060403d81116103c7576103b5818361074a565b919091928b610380565b90506020823d821161065b575b816106486020938361074a565b8101031261016f576105ba9151906105b0565b3d915061063b565b90506020813d821161068c575b8161067d6020938361074a565b8101031261016f575187610583565b3d9150610670565b60209350602491506106b4906101003d81116101ea576101d5818361074a565b505097949350505050915061054a565b602090604051908152f35b90506020813d6020116106f9575b816106ea6020938361074a565b8101031261016f57518361050a565b3d91506106dd565b600435906001600160a01b038216820361016f57565b90602080835192838152019201905f5b8181106107345750505090565b8251845260209384019390920191600101610727565b90601f8019910116810190811067ffffffffffffffff82111761076c57604052565b634e487b7160e01b5f52604160045260245ffd5b60ff1660ff81146107915760010190565b634e487b7160e01b5f52601160045260245ffd5b519061ffff8216820361016f57565b91908261010091031261016f5781516001600160a01b038116810361016f57916020810151801515810361016f57916107ef604083016107a5565b916107fc606082016107a5565b91610809608083016107a5565b9160a081015160ff8116810361016f579160c082015162ffffff8116810361016f5760e09092015190565b9190820180921161079157565b919082604091031261016f57602082519201518060030b810361016f5790565b67ffffffffffffffff811161076c5760051b60200190565b9061088382610861565b610890604051918261074a565b82815280926108a1601f1991610861565b0190602036910137565b80518210156108bf5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b8181029291811591840414171561079157565b604d811161079157600a0a90565b91929060ff61090f9260030b911603926011198401926108d3565b905f811315610942576109239192506108e6565b90811561092e570490565b634e487b7160e01b5f52601260045260245ffd5b600160ff1b146107915761095d6012610963935f03016108e6565b906108d3565b9056fea264697066735822122021a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d64736f6c634300081c0033

Deployed Bytecode Sourcemap

411:3434:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;411:3434:2;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;3471:26:2;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;;3471:26;;;;;;;411:3434;3471:26;;;411:3434;3461:36;;;411:3434;;;;;-1:-1:-1;;;3571:25:2;;411:3434;3571:25;;411:3434;;;;3571:25;411:3434;;;3571:25;;;;;;;;411:3434;3571:25;411:3434;3571:25;411:3434;3571:25;;;411:3434;-1:-1:-1;411:3434:2;;-1:-1:-1;;;3678:33:2;;411:3434;3678:33;;411:3434;;;;;;;;-1:-1:-1;;;;;411:3434:2;3678:33;;;;;;;411:3434;3678:33;;;411:3434;;;;;;;;;;;;;;3746:38;;411:3434;3746:38;;411:3434;3746:38;;;;;;;411:3434;3746:38;;;411:3434;;3802:33;;;;:::i;:::-;411:3434;;;;;;3746:38;;;411:3434;3746:38;;411:3434;3746:38;;;;;;411:3434;3746:38;;;:::i;:::-;;;411:3434;;;;;;3746:38;;411:3434;;;;3746:38;;;-1:-1:-1;3746:38:2;;;411:3434;;;;;;;;;3678:33;;;;411:3434;3678:33;;411:3434;3678:33;;;;;;411:3434;3678:33;;;:::i;:::-;;;411:3434;;;;;;;3678:33;;;;;-1:-1:-1;3678:33:2;;3571:25;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;411:3434;;;;;;;;;3471:26;;;411:3434;3471:26;;411:3434;3471:26;;;;;;411:3434;3471:26;;;:::i;:::-;;;411:3434;;;;;3471:26;;;;;;-1:-1:-1;3471:26:2;;411:3434;;;;;;-1:-1:-1;;411:3434:2;;;;-1:-1:-1;;;;;411:3434:2;;:::i;:::-;;;;;;;2202:26;;411:3434;2202:26;411:3434;2202:26;;;;;;;;;411:3434;2202:26;;;411:3434;2247:25;;;;:::i;:::-;2294;;;;:::i;:::-;2335:11;411:3434;2364:3;411:3434;;;2348:14;;;;;;;411:3434;;-1:-1:-1;;;2430:19:2;;411:3434;2430:19;;411:3434;;;;2430:19;411:3434;2430:19;411:3434;2430:19;;;;;;;;411:3434;;;2430:19;;;2364:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;2541:33:2;;411:3434;2541:33;;411:3434;;;;;;;;2430:19;;411:3434;;-1:-1:-1;;;;;411:3434:2;2541:33;;;;;;;411:3434;2541:33;;;2364:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;2577:32:2;;411:3434;2577:32;;411:3434;;;;;;2430:19;411:3434;2577:32;;;;;;;;411:3434;2577:32;;;2364:3;2541:68;;;;:::i;:::-;2623:30;;;;;;:::i;:::-;411:3434;;;;;;;2726:22;;;411:3434;2726:22;;411:3434;;2726:22;2430:19;2726:22;;;;;;;;2364:3;2726:22;2763:205;2726:22;2778:190;2726:22;411:3434;;;2726:22;;;2364:3;2778:190;;:::i;:::-;2763:205;;;:::i;:::-;411:3434;2364:3;:::i;:::-;2335:11;;2726:22;;;;;;;;411:3434;2726:22;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;2577:32;;;411:3434;2577:32;;;;;;;;;411:3434;2577:32;;;:::i;:::-;;;411:3434;;;;2541:68;411:3434;;2577:32;;;;;;-1:-1:-1;2577:32:2;;2541:33;;;411:3434;2541:33;;;;;;;;;411:3434;2541:33;;;:::i;:::-;;;411:3434;;;;;2541:33;;;;;;-1:-1:-1;2541:33:2;;2430:19;411:3434;2430:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;2348:14;411:3434;2348:14;411:3434;2348:14;411:3434;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;2202:26;;;411:3434;2202:26;;411:3434;2202:26;;;;;;411:3434;2202:26;;;:::i;:::-;;;411:3434;;;;;2202:26;;;;;;-1:-1:-1;2202:26:2;;411:3434;;;;;;-1:-1:-1;;411:3434:2;;;;;;:::i;:::-;-1:-1:-1;;;878:26:2;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;878:26;;;;;;;411:3434;878:26;;;411:3434;928:11;411:3434;923:668;958:3;411:3434;;;941:15;;;;;;;411:3434;;-1:-1:-1;;;1024:19:2;;411:3434;1024:19;;411:3434;;;;1024:19;411:3434;1024:19;411:3434;1024:19;;;;;;;;411:3434;;;1024:19;;;958:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;1136:33:2;;411:3434;1136:33;;411:3434;;;;;;;;1024:19;;411:3434;;-1:-1:-1;;;;;411:3434:2;1136:33;;;;;;;411:3434;1136:33;;;958:3;-1:-1:-1;411:3434:2;;-1:-1:-1;;;1172:32:2;;411:3434;1172:32;;411:3434;;;;;;1024:19;411:3434;1172:32;;;;;;;;411:3434;1172:32;;;958:3;1136:68;;;;:::i;:::-;411:3434;;;;;;1277:22;;411:3434;1277:22;;411:3434;;1277:22;1024:19;1277:22;;;;;;;;958:3;1277:22;1546:34;1277:22;1342:190;1277:22;411:3434;;;1277:22;;;1342:190;;:::i;:::-;1546:34;;:::i;:::-;958:3;;:::i;:::-;928:11;;;1277:22;;;;;;;;411:3434;1277:22;;;;;;;;;:::i;:::-;;;;;;;;1172:32;;;411:3434;1172:32;;;;;;;;;411:3434;1172:32;;;:::i;:::-;;;411:3434;;;;1136:68;411:3434;;1172:32;;;;;;-1:-1:-1;1172:32:2;;1136:33;;;411:3434;1136:33;;;;;;;;;411:3434;1136:33;;;:::i;:::-;;;411:3434;;;;;1136:33;;;;;;-1:-1:-1;1136:33:2;;1024:19;411:3434;1024:19;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;941:15;411:3434;941:15;411:3434;;;;;;878:26;;;411:3434;878:26;;411:3434;878:26;;;;;;411:3434;878:26;;;:::i;:::-;;;411:3434;;;;;878:26;;;;;;-1:-1:-1;878:26:2;;411:3434;;;;-1:-1:-1;;;;;411:3434:2;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;411:3434:2;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;411:3434:2;;;;;-1:-1:-1;411:3434:2;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;411:3434:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;577:617:5:-;;;;411:3434:2;940:19:5;577:617;411:3434:2;;;;;;;;;;940:19:5;;:::i;:::-;973:21;-1:-1:-1;973:21:5;;-1:-1:-1;;;1029:32:5;;;;;:::i;:::-;411:3434:2;;;;;;577:617:5;:::o;411:3434:2:-;;;;-1:-1:-1;411:3434:2;883:2:5;411:3434:2;;;-1:-1:-1;411:3434:2;969:186:5;-1:-1:-1;;;411:3434:2;;;1111:33:5;883:2;1092:52;411:3434:2;-1:-1:-1;411:3434:2;;1111:33:5;:::i;:::-;1092:52;;:::i;:::-;577:617;:::o

Swarm Source

ipfs://21a98ca3901770dd6f7b8d71f4074289939ab372690f1bc473a977ea4794035d

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.