ETH Price: $3,593.15 (+3.64%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

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:
OracleLib

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion
File 1 of 2 : OracleLib.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;

import "../libraries/Errors.sol";

/// Adapted from UniswapV3's Oracle

library OracleLib {
    struct Observation {
        uint32 blockTimestamp;
        uint216 lnImpliedRateCumulative;
        bool initialized;
        // 1 SLOT = 256 bits
    }

    function transform(
        Observation memory last,
        uint32 blockTimestamp,
        uint96 lnImpliedRate
    ) public pure returns (Observation memory) {
        return
            Observation({
                blockTimestamp: blockTimestamp,
                lnImpliedRateCumulative: last.lnImpliedRateCumulative +
                    uint216(lnImpliedRate) *
                    (blockTimestamp - last.blockTimestamp),
                initialized: true
            });
    }

    function initialize(
        Observation[65535] storage self,
        uint32 time
    ) public returns (uint16 cardinality, uint16 cardinalityNext) {
        self[0] = Observation({blockTimestamp: time, lnImpliedRateCumulative: 0, initialized: true});
        return (1, 1);
    }

    function write(
        Observation[65535] storage self,
        uint16 index,
        uint32 blockTimestamp,
        uint96 lnImpliedRate,
        uint16 cardinality,
        uint16 cardinalityNext
    ) public returns (uint16 indexUpdated, uint16 cardinalityUpdated) {
        Observation memory last = self[index];

        // early return if we've already written an observation this block
        if (last.blockTimestamp == blockTimestamp) return (index, cardinality);

        // if the conditions are right, we can bump the cardinality
        if (cardinalityNext > cardinality && index == (cardinality - 1)) {
            cardinalityUpdated = cardinalityNext;
        } else {
            cardinalityUpdated = cardinality;
        }

        indexUpdated = (index + 1) % cardinalityUpdated;
        self[indexUpdated] = transform(last, blockTimestamp, lnImpliedRate);
    }

    function grow(Observation[65535] storage self, uint16 current, uint16 next) public returns (uint16) {
        if (current == 0) revert Errors.OracleUninitialized();
        // no-op if the passed next value isn't greater than the current next value
        if (next <= current) return current;
        // store in each slot to prevent fresh SSTOREs in swaps
        // this data will not be used because the initialized boolean is still false
        for (uint16 i = current; i != next; ) {
            self[i].blockTimestamp = 1;
            unchecked {
                ++i;
            }
        }
        return next;
    }

    function binarySearch(
        Observation[65535] storage self,
        uint32 target,
        uint16 index,
        uint16 cardinality
    ) public view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {
        uint256 l = (index + 1) % cardinality; // oldest observation
        uint256 r = l + cardinality - 1; // newest observation
        uint256 i;
        while (true) {
            i = (l + r) / 2;

            beforeOrAt = self[i % cardinality];

            // we've landed on an uninitialized observation, keep searching higher (more recently)
            if (!beforeOrAt.initialized) {
                l = i + 1;
                continue;
            }

            atOrAfter = self[(i + 1) % cardinality];

            bool targetAtOrAfter = beforeOrAt.blockTimestamp <= target;

            // check if we've found the answer!
            if (targetAtOrAfter && target <= atOrAfter.blockTimestamp) break;

            if (!targetAtOrAfter) r = i - 1;
            else l = i + 1;
        }
    }

    function getSurroundingObservations(
        Observation[65535] storage self,
        uint32 target,
        uint96 lnImpliedRate,
        uint16 index,
        uint16 cardinality
    ) public view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {
        // optimistically set before to the newest observation
        beforeOrAt = self[index];

        // if the target is chronologically at or after the newest observation, we can early return
        if (beforeOrAt.blockTimestamp <= target) {
            if (beforeOrAt.blockTimestamp == target) {
                // if newest observation equals target, we're in the same block, so we can ignore atOrAfter
                return (beforeOrAt, atOrAfter);
            } else {
                // otherwise, we need to transform
                return (beforeOrAt, transform(beforeOrAt, target, lnImpliedRate));
            }
        }

        // now, set beforeOrAt to the oldest observation
        beforeOrAt = self[(index + 1) % cardinality];
        if (!beforeOrAt.initialized) beforeOrAt = self[0];

        // ensure that the target is chronologically at or after the oldest observation
        if (target < beforeOrAt.blockTimestamp) revert Errors.OracleTargetTooOld(target, beforeOrAt.blockTimestamp);

        // if we've reached this point, we have to binary search
        return binarySearch(self, target, index, cardinality);
    }

    function observeSingle(
        Observation[65535] storage self,
        uint32 time,
        uint32 secondsAgo,
        uint96 lnImpliedRate,
        uint16 index,
        uint16 cardinality
    ) public view returns (uint216 lnImpliedRateCumulative) {
        if (secondsAgo == 0) {
            Observation memory last = self[index];
            if (last.blockTimestamp != time) {
                return transform(last, time, lnImpliedRate).lnImpliedRateCumulative;
            }
            return last.lnImpliedRateCumulative;
        }

        uint32 target = time - secondsAgo;

        (Observation memory beforeOrAt, Observation memory atOrAfter) = getSurroundingObservations(
            self,
            target,
            lnImpliedRate,
            index,
            cardinality
        );

        if (target == beforeOrAt.blockTimestamp) {
            // we're at the left boundary
            return beforeOrAt.lnImpliedRateCumulative;
        } else if (target == atOrAfter.blockTimestamp) {
            // we're at the right boundary
            return atOrAfter.lnImpliedRateCumulative;
        } else {
            // we're in the middle
            return (beforeOrAt.lnImpliedRateCumulative +
                uint216(
                    (uint256(atOrAfter.lnImpliedRateCumulative - beforeOrAt.lnImpliedRateCumulative) *
                        (target - beforeOrAt.blockTimestamp)) / (atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp)
                ));
        }
    }

    function observe(
        Observation[65535] storage self,
        uint32 time,
        uint32[] memory secondsAgos,
        uint96 lnImpliedRate,
        uint16 index,
        uint16 cardinality
    ) public view returns (uint216[] memory lnImpliedRateCumulative) {
        if (cardinality == 0) revert Errors.OracleZeroCardinality();

        lnImpliedRateCumulative = new uint216[](secondsAgos.length);
        for (uint256 i = 0; i < lnImpliedRateCumulative.length; ++i) {
            lnImpliedRateCumulative[i] = observeSingle(self, time, secondsAgos[i], lnImpliedRate, index, cardinality);
        }
    }
}

File 2 of 2 : Errors.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;

library Errors {
    // BulkSeller
    error BulkInsufficientSyForTrade(uint256 currentAmount, uint256 requiredAmount);
    error BulkInsufficientTokenForTrade(uint256 currentAmount, uint256 requiredAmount);
    error BulkInSufficientSyOut(uint256 actualSyOut, uint256 requiredSyOut);
    error BulkInSufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);
    error BulkInsufficientSyReceived(uint256 actualBalance, uint256 requiredBalance);
    error BulkNotMaintainer();
    error BulkNotAdmin();
    error BulkSellerAlreadyExisted(address token, address SY, address bulk);
    error BulkSellerInvalidToken(address token, address SY);
    error BulkBadRateTokenToSy(uint256 actualRate, uint256 currentRate, uint256 eps);
    error BulkBadRateSyToToken(uint256 actualRate, uint256 currentRate, uint256 eps);

    // APPROX
    error ApproxFail();
    error ApproxParamsInvalid(uint256 guessMin, uint256 guessMax, uint256 eps);
    error ApproxBinarySearchInputInvalid(
        uint256 approxGuessMin,
        uint256 approxGuessMax,
        uint256 minGuessMin,
        uint256 maxGuessMax
    );

    // MARKET + MARKET MATH CORE
    error MarketExpired();
    error MarketZeroAmountsInput();
    error MarketZeroAmountsOutput();
    error MarketZeroLnImpliedRate();
    error MarketInsufficientPtForTrade(int256 currentAmount, int256 requiredAmount);
    error MarketInsufficientPtReceived(uint256 actualBalance, uint256 requiredBalance);
    error MarketInsufficientSyReceived(uint256 actualBalance, uint256 requiredBalance);
    error MarketZeroTotalPtOrTotalAsset(int256 totalPt, int256 totalAsset);
    error MarketExchangeRateBelowOne(int256 exchangeRate);
    error MarketProportionMustNotEqualOne();
    error MarketRateScalarBelowZero(int256 rateScalar);
    error MarketScalarRootBelowZero(int256 scalarRoot);
    error MarketProportionTooHigh(int256 proportion, int256 maxProportion);

    error OracleUninitialized();
    error OracleTargetTooOld(uint32 target, uint32 oldest);
    error OracleZeroCardinality();

    error MarketFactoryExpiredPt();
    error MarketFactoryInvalidPt();
    error MarketFactoryMarketExists();

    error MarketFactoryLnFeeRateRootTooHigh(uint80 lnFeeRateRoot, uint256 maxLnFeeRateRoot);
    error MarketFactoryOverriddenFeeTooHigh(uint80 overriddenFee, uint256 marketLnFeeRateRoot);
    error MarketFactoryReserveFeePercentTooHigh(uint8 reserveFeePercent, uint8 maxReserveFeePercent);
    error MarketFactoryZeroTreasury();
    error MarketFactoryInitialAnchorTooLow(int256 initialAnchor, int256 minInitialAnchor);
    error MFNotPendleMarket(address addr);

    // ROUTER
    error RouterInsufficientLpOut(uint256 actualLpOut, uint256 requiredLpOut);
    error RouterInsufficientSyOut(uint256 actualSyOut, uint256 requiredSyOut);
    error RouterInsufficientPtOut(uint256 actualPtOut, uint256 requiredPtOut);
    error RouterInsufficientYtOut(uint256 actualYtOut, uint256 requiredYtOut);
    error RouterInsufficientPYOut(uint256 actualPYOut, uint256 requiredPYOut);
    error RouterInsufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);
    error RouterInsufficientSyRepay(uint256 actualSyRepay, uint256 requiredSyRepay);
    error RouterInsufficientPtRepay(uint256 actualPtRepay, uint256 requiredPtRepay);
    error RouterNotAllSyUsed(uint256 netSyDesired, uint256 netSyUsed);

    error RouterTimeRangeZero();
    error RouterCallbackNotPendleMarket(address caller);
    error RouterInvalidAction(bytes4 selector);
    error RouterInvalidFacet(address facet);

    error RouterKyberSwapDataZero();

    error SimulationResults(bool success, bytes res);

    // YIELD CONTRACT
    error YCExpired();
    error YCNotExpired();
    error YieldContractInsufficientSy(uint256 actualSy, uint256 requiredSy);
    error YCNothingToRedeem();
    error YCPostExpiryDataNotSet();
    error YCNoFloatingSy();

    // YieldFactory
    error YCFactoryInvalidExpiry();
    error YCFactoryYieldContractExisted();
    error YCFactoryZeroExpiryDivisor();
    error YCFactoryZeroTreasury();
    error YCFactoryInterestFeeRateTooHigh(uint256 interestFeeRate, uint256 maxInterestFeeRate);
    error YCFactoryRewardFeeRateTooHigh(uint256 newRewardFeeRate, uint256 maxRewardFeeRate);

    // SY
    error SYInvalidTokenIn(address token);
    error SYInvalidTokenOut(address token);
    error SYZeroDeposit();
    error SYZeroRedeem();
    error SYInsufficientSharesOut(uint256 actualSharesOut, uint256 requiredSharesOut);
    error SYInsufficientTokenOut(uint256 actualTokenOut, uint256 requiredTokenOut);

    // SY-specific
    error SYQiTokenMintFailed(uint256 errCode);
    error SYQiTokenRedeemFailed(uint256 errCode);
    error SYQiTokenRedeemRewardsFailed(uint256 rewardAccruedType0, uint256 rewardAccruedType1);
    error SYQiTokenBorrowRateTooHigh(uint256 borrowRate, uint256 borrowRateMax);

    error SYCurveInvalidPid();
    error SYCurve3crvPoolNotFound();

    error SYApeDepositAmountTooSmall(uint256 amountDeposited);
    error SYBalancerInvalidPid();
    error SYInvalidRewardToken(address token);

    error SYStargateRedeemCapExceeded(uint256 amountLpDesired, uint256 amountLpRedeemable);

    error SYBalancerReentrancy();

    error NotFromTrustedRemote(uint16 srcChainId, bytes path);

    error ApxETHNotEnoughBuffer();

    // Liquidity Mining
    error VCInactivePool(address pool);
    error VCPoolAlreadyActive(address pool);
    error VCZeroVePendle(address user);
    error VCExceededMaxWeight(uint256 totalWeight, uint256 maxWeight);
    error VCEpochNotFinalized(uint256 wTime);
    error VCPoolAlreadyAddAndRemoved(address pool);

    error VEInvalidNewExpiry(uint256 newExpiry);
    error VEExceededMaxLockTime();
    error VEInsufficientLockTime();
    error VENotAllowedReduceExpiry();
    error VEZeroAmountLocked();
    error VEPositionNotExpired();
    error VEZeroPosition();
    error VEZeroSlope(uint128 bias, uint128 slope);
    error VEReceiveOldSupply(uint256 msgTime);

    error GCNotPendleMarket(address caller);
    error GCNotVotingController(address caller);

    error InvalidWTime(uint256 wTime);
    error ExpiryInThePast(uint256 expiry);
    error ChainNotSupported(uint256 chainId);

    error FDTotalAmountFundedNotMatch(uint256 actualTotalAmount, uint256 expectedTotalAmount);
    error FDEpochLengthMismatch();
    error FDInvalidPool(address pool);
    error FDPoolAlreadyExists(address pool);
    error FDInvalidNewFinishedEpoch(uint256 oldFinishedEpoch, uint256 newFinishedEpoch);
    error FDInvalidStartEpoch(uint256 startEpoch);
    error FDInvalidWTimeFund(uint256 lastFunded, uint256 wTime);
    error FDFutureFunding(uint256 lastFunded, uint256 currentWTime);

    error BDInvalidEpoch(uint256 epoch, uint256 startTime);

    // Cross-Chain
    error MsgNotFromSendEndpoint(uint16 srcChainId, bytes path);
    error MsgNotFromReceiveEndpoint(address sender);
    error InsufficientFeeToSendMsg(uint256 currentFee, uint256 requiredFee);
    error ApproxDstExecutionGasNotSet();
    error InvalidRetryData();

    // GENERIC MSG
    error ArrayLengthMismatch();
    error ArrayEmpty();
    error ArrayOutOfBounds();
    error ZeroAddress();
    error FailedToSendEther();
    error InvalidMerkleProof();

    error OnlyLayerZeroEndpoint();
    error OnlyYT();
    error OnlyYCFactory();
    error OnlyWhitelisted();

    // Swap Aggregator
    error SAInsufficientTokenIn(address tokenIn, uint256 amountExpected, uint256 amountActual);
    error UnsupportedSelector(uint256 aggregatorType, bytes4 selector);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint32","name":"target","type":"uint32"},{"internalType":"uint32","name":"oldest","type":"uint32"}],"name":"OracleTargetTooOld","type":"error"},{"inputs":[],"name":"OracleUninitialized","type":"error"},{"inputs":[],"name":"OracleZeroCardinality","type":"error"},{"inputs":[{"components":[{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"uint216","name":"lnImpliedRateCumulative","type":"uint216"},{"internalType":"bool","name":"initialized","type":"bool"}],"internalType":"struct OracleLib.Observation","name":"last","type":"tuple"},{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"uint96","name":"lnImpliedRate","type":"uint96"}],"name":"transform","outputs":[{"components":[{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"uint216","name":"lnImpliedRateCumulative","type":"uint216"},{"internalType":"bool","name":"initialized","type":"bool"}],"internalType":"struct OracleLib.Observation","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"}]

6080806040523461001c5761105690816100228239308160080152f35b600080fdfe604060808152307f0000000000000000000000000000000000000000000000000000000000000000149060048036101561003857600080fd5b600092833560e01c9081631dd421ce146104e4578163335129ad146104635781634af74b68146103e9578163587cdc061461038e5781635d27625914610334578163b8d236ac14610239578163ca7dab2c146101af575063f8500bcc1461009e57600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360160a081126101a3576060136101ab576100d861071d565b63ffffffff913582811681036101a75781526024357affffffffffffffffffffffffffffffffffffffffffffffffffffff811681036101a757602082015260443580151581036101a7578382015260643591821682036101a357608435936bffffffffffffffffffffffff851685036101a0575060609361019e9261015c92610f92565b915180926040809163ffffffff81511684527affffffffffffffffffffffffffffffffffffffffffffffffffffff602082015116602085015201511515910152565bf35b80fd5b8380fd5b8480fd5b8280fd5b8491506101a057827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0577f01000000000000000000000000000000000000000000000000000000000000009060018461020c6106f2565b63ffffffff61021961071d565b911693848252602082015201521790355580516001815260016020820152f35b50509160a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a05761026e6106f2565b90604435906bffffffffffffffffffffffff821682036101a057506102af60c09461019e936102f39361029f610827565b916102a86107e3565b9335610eb0565b9190935180946040809163ffffffff81511684527affffffffffffffffffffffffffffffffffffffffffffffffffffff602082015116602085015201511515910152565b805163ffffffff16606084015260208101517affffffffffffffffffffffffffffffffffffffffffffffffffffff16608084015260400151151560a0830152565b50509160807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061019e6102f36102af60c0946103766106f2565b61037e610816565b90610387610827565b9235610d4c565b838584926101a05760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061ffff6103e16020936103d2610805565b6103da610816565b9135610c7b565b915191168152f35b8491506101a05760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061045090610427610805565b61042f61070a565b6104376107c8565b906104406107e3565b926104496107f4565b9435610b15565b825161ffff928316815291166020820152f35b50509160c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a057507affffffffffffffffffffffffffffffffffffffffffffffffffffff6103e16020936104bb6106f2565b6104c361070a565b6104cb6107c8565b906104d46107e3565b926104dd6107f4565b9435610946565b82858560c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106ee5782359061051c6106f2565b6044359267ffffffffffffffff84116101a757366023850112156101a757838601359161055061054b846107b0565b61076c565b948593808752602460208098019160051b830101913683116106ea57602401905b8282106106ca575050506105836107c8565b9261058c6107e3565b946105956107f4565b9861ffff8a16156106a357508151966105bc6105b361054b8a6107b0565b98808a526107b0565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818a019201368337895b895181101561064657808a7affffffffffffffffffffffffffffffffffffffffffffffffffffff61063c8f946106366001968f8f8f8f8f61062e8863ffffffff92610838565b511691610946565b93610838565b91169052016105e8565b509190898983519485948186019282875251809352850193925b82811061066f57505050500390f35b83517affffffffffffffffffffffffffffffffffffffffffffffffffffff1685528695509381019392810192600101610660565b90517f6a868421000000000000000000000000000000000000000000000000000000008152fd5b813563ffffffff811681036106e6578152908701908701610571565b8980fd5b8880fd5b5080fd5b6024359063ffffffff8216820361070557565b600080fd5b6044359063ffffffff8216820361070557565b604051906060820182811067ffffffffffffffff82111761073d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761073d57604052565b67ffffffffffffffff811161073d5760051b60200190565b606435906bffffffffffffffffffffffff8216820361070557565b6084359061ffff8216820361070557565b60a4359061ffff8216820361070557565b6024359061ffff8216820361070557565b6044359061ffff8216820361070557565b6064359061ffff8216820361070557565b805182101561084c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff82101561084c570190600090565b9061089561071d565b915463ffffffff811683527affffffffffffffffffffffffffffffffffffffffffffffffffffff8160201c16602084015260f81c15156040830152565b63ffffffff91821690821603919082116108e857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190917affffffffffffffffffffffffffffffffffffffffffffffffffffff808094169116019182116108e857565b92949193909463ffffffff9485811615610a9557610969906109709596976108d2565b8095610eb0565b919092808451168183169081146000146109ac5750505050602001517affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b81849593945116146000146109e257505050602001517affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff939192939182602085015116938484602084015116038481116108e857610a2d858592169782845116906108d2565b16958681029681880414901517156108e8578280610a50935116915116906108d2565b168015610a6657610a6393041690610917565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50915093610acb610ac57affffffffffffffffffffffffffffffffffffffffffffffffffffff966020969561087b565b5061088c565b928084511690821603610ae057505001511690565b610ae992610f92565b01511690565b90600161ffff809316019182116108e857565b9061ffff809116918215610a6657160690565b919593929490610b28610ac5828561087b565b9163ffffffff9485845116868a1614610c6f5761ffff8082169081818516119182610c27575b5050610b859493610b7f93610b729a93610b7793600014610c1d5750998a91610aef565b610b02565b988993610f92565b9261087b565b929092610bee57815160208084015160409094015193901b7effffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691161790151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b9050998a91610aef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91949a939695925001908382116108e8579198939491939284811691161483610b7f610b4e565b91975090955050505050565b9061ffff91828216918215610cee5783851692831115610ce6575b8284821603610ca6575050505090565b80610cb285928461087b565b5090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008254161790550116610c96565b935050505090565b60046040517fdc14e8a1000000000000000000000000000000000000000000000000000000008152fd5b610d2061071d565b90600082526000602083015260006040830152565b919082018092116108e857565b8115610a66570690565b9391610b7290610d5a610d18565b50610d63610d18565b50610d738561ffff938493610aef565b16931691610d818385610d35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff948582019182116108e8575b610db88282610d35565b91600192831c92610dd5610ac5610dcf8987610d42565b8b61087b565b90604082015115610e9a57840190818511610e4357610e00610ac5610dfa8a85610d42565b8c61087b565b9063ffffffff918282511692808a168094119384159182610e8c575b5050610e7e57505015610e71575050858201918211610e4357610db891905b909150610dae565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b909150610db89250610e3b565b995099505050505050915050565b835116101590503880610e1c565b919250508201809211610e4357610db891610e3b565b9493929194610ebd610d18565b50610ec6610d18565b610ed3610ac5858461087b565b9063ffffffff918281511698838616998a811115610f735750505050610f08610ac5610f0287610b7288610aef565b8461087b565b604081015115610f64575b511695868110610f2d5750610f29949550610d4c565b9091565b60449087604051917f9ca3426c00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50610f6e8261088c565b610f13565b93509550955096915014600014610f8a5750509190565b82610a639395505b9091610fe690610fa0610d18565b507affffffffffffffffffffffffffffffffffffffffffffffffffffff926bffffffffffffffffffffffff8460208301511692169063ffffffff938480925116876108d2565b169084828202169181830414901517156108e85761100391610917565b9061100c61071d565b93168352166020820152600160408201529056fea2646970667358221220c9b08349016bbf041415e42d6dc6eff71a3f2129bead43784c9adba3997895fc64736f6c63430008180033

Deployed Bytecode

0x604060808152307f00000000000000000000000083d6fa7f8904299f4a9499fe83b6ae3f21ffba57149060048036101561003857600080fd5b600092833560e01c9081631dd421ce146104e4578163335129ad146104635781634af74b68146103e9578163587cdc061461038e5781635d27625914610334578163b8d236ac14610239578163ca7dab2c146101af575063f8500bcc1461009e57600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360160a081126101a3576060136101ab576100d861071d565b63ffffffff913582811681036101a75781526024357affffffffffffffffffffffffffffffffffffffffffffffffffffff811681036101a757602082015260443580151581036101a7578382015260643591821682036101a357608435936bffffffffffffffffffffffff851685036101a0575060609361019e9261015c92610f92565b915180926040809163ffffffff81511684527affffffffffffffffffffffffffffffffffffffffffffffffffffff602082015116602085015201511515910152565bf35b80fd5b8380fd5b8480fd5b8280fd5b8491506101a057827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0577f01000000000000000000000000000000000000000000000000000000000000009060018461020c6106f2565b63ffffffff61021961071d565b911693848252602082015201521790355580516001815260016020820152f35b50509160a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a05761026e6106f2565b90604435906bffffffffffffffffffffffff821682036101a057506102af60c09461019e936102f39361029f610827565b916102a86107e3565b9335610eb0565b9190935180946040809163ffffffff81511684527affffffffffffffffffffffffffffffffffffffffffffffffffffff602082015116602085015201511515910152565b805163ffffffff16606084015260208101517affffffffffffffffffffffffffffffffffffffffffffffffffffff16608084015260400151151560a0830152565b50509160807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061019e6102f36102af60c0946103766106f2565b61037e610816565b90610387610827565b9235610d4c565b838584926101a05760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061ffff6103e16020936103d2610805565b6103da610816565b9135610c7b565b915191168152f35b8491506101a05760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a0575061045090610427610805565b61042f61070a565b6104376107c8565b906104406107e3565b926104496107f4565b9435610b15565b825161ffff928316815291166020820152f35b50509160c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101a057507affffffffffffffffffffffffffffffffffffffffffffffffffffff6103e16020936104bb6106f2565b6104c361070a565b6104cb6107c8565b906104d46107e3565b926104dd6107f4565b9435610946565b82858560c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106ee5782359061051c6106f2565b6044359267ffffffffffffffff84116101a757366023850112156101a757838601359161055061054b846107b0565b61076c565b948593808752602460208098019160051b830101913683116106ea57602401905b8282106106ca575050506105836107c8565b9261058c6107e3565b946105956107f4565b9861ffff8a16156106a357508151966105bc6105b361054b8a6107b0565b98808a526107b0565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818a019201368337895b895181101561064657808a7affffffffffffffffffffffffffffffffffffffffffffffffffffff61063c8f946106366001968f8f8f8f8f61062e8863ffffffff92610838565b511691610946565b93610838565b91169052016105e8565b509190898983519485948186019282875251809352850193925b82811061066f57505050500390f35b83517affffffffffffffffffffffffffffffffffffffffffffffffffffff1685528695509381019392810192600101610660565b90517f6a868421000000000000000000000000000000000000000000000000000000008152fd5b813563ffffffff811681036106e6578152908701908701610571565b8980fd5b8880fd5b5080fd5b6024359063ffffffff8216820361070557565b600080fd5b6044359063ffffffff8216820361070557565b604051906060820182811067ffffffffffffffff82111761073d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761073d57604052565b67ffffffffffffffff811161073d5760051b60200190565b606435906bffffffffffffffffffffffff8216820361070557565b6084359061ffff8216820361070557565b60a4359061ffff8216820361070557565b6024359061ffff8216820361070557565b6044359061ffff8216820361070557565b6064359061ffff8216820361070557565b805182101561084c5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff82101561084c570190600090565b9061089561071d565b915463ffffffff811683527affffffffffffffffffffffffffffffffffffffffffffffffffffff8160201c16602084015260f81c15156040830152565b63ffffffff91821690821603919082116108e857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190917affffffffffffffffffffffffffffffffffffffffffffffffffffff808094169116019182116108e857565b92949193909463ffffffff9485811615610a9557610969906109709596976108d2565b8095610eb0565b919092808451168183169081146000146109ac5750505050602001517affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b81849593945116146000146109e257505050602001517affffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b7affffffffffffffffffffffffffffffffffffffffffffffffffffff939192939182602085015116938484602084015116038481116108e857610a2d858592169782845116906108d2565b16958681029681880414901517156108e8578280610a50935116915116906108d2565b168015610a6657610a6393041690610917565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50915093610acb610ac57affffffffffffffffffffffffffffffffffffffffffffffffffffff966020969561087b565b5061088c565b928084511690821603610ae057505001511690565b610ae992610f92565b01511690565b90600161ffff809316019182116108e857565b9061ffff809116918215610a6657160690565b919593929490610b28610ac5828561087b565b9163ffffffff9485845116868a1614610c6f5761ffff8082169081818516119182610c27575b5050610b859493610b7f93610b729a93610b7793600014610c1d5750998a91610aef565b610b02565b988993610f92565b9261087b565b929092610bee57815160208084015160409094015193901b7effffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691161790151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b9050998a91610aef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91949a939695925001908382116108e8579198939491939284811691161483610b7f610b4e565b91975090955050505050565b9061ffff91828216918215610cee5783851692831115610ce6575b8284821603610ca6575050505090565b80610cb285928461087b565b5090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008254161790550116610c96565b935050505090565b60046040517fdc14e8a1000000000000000000000000000000000000000000000000000000008152fd5b610d2061071d565b90600082526000602083015260006040830152565b919082018092116108e857565b8115610a66570690565b9391610b7290610d5a610d18565b50610d63610d18565b50610d738561ffff938493610aef565b16931691610d818385610d35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff948582019182116108e8575b610db88282610d35565b91600192831c92610dd5610ac5610dcf8987610d42565b8b61087b565b90604082015115610e9a57840190818511610e4357610e00610ac5610dfa8a85610d42565b8c61087b565b9063ffffffff918282511692808a168094119384159182610e8c575b5050610e7e57505015610e71575050858201918211610e4357610db891905b909150610dae565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b909150610db89250610e3b565b995099505050505050915050565b835116101590503880610e1c565b919250508201809211610e4357610db891610e3b565b9493929194610ebd610d18565b50610ec6610d18565b610ed3610ac5858461087b565b9063ffffffff918281511698838616998a811115610f735750505050610f08610ac5610f0287610b7288610aef565b8461087b565b604081015115610f64575b511695868110610f2d5750610f29949550610d4c565b9091565b60449087604051917f9ca3426c00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50610f6e8261088c565b610f13565b93509550955096915014600014610f8a5750509190565b82610a639395505b9091610fe690610fa0610d18565b507affffffffffffffffffffffffffffffffffffffffffffffffffffff926bffffffffffffffffffffffff8460208301511692169063ffffffff938480925116876108d2565b169084828202169181830414901517156108e85761100391610917565b9061100c61071d565b93168352166020820152600160408201529056fea2646970667358221220c9b08349016bbf041415e42d6dc6eff71a3f2129bead43784c9adba3997895fc64736f6c63430008180033

Block Transaction Difficulty 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
Loading...
Loading

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.