S Price: $0.067459 (-3.45%)

Contract

0x7D387B8819Cc8692ef3b83d117F5F5748D21F4F2

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

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

Contract Source Code Verified (Exact Match)

Contract Name:
OracleRouterChainlink

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 100000 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.30;

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

/**
 * OracleRouter (Chainlink passthrough, resilient)
 *
 * - priceUSD(asset) -> USD WAD (1e18) using asset's Chainlink feed
 * - exchangeRate(st, base) -> base per st (WAD) using pair feed (or optional price-ratio fallback)
 * - snapshot(...) -> captures priceUSD() (and optional pairs) for MEV-resistant RFQ fills
 *
 * Safety:
 * - Per-asset heartbeat (staleness) checks
 * - Per-asset deviation caps vs lastGoodPrice (bps); falls back to lastGoodPrice instead of reverting
 * - Similar guards for exchangeRate pairs
 *
 * Notes:
 * - Feeds must be configured to return USD (8 decimals typical). If your feed is non-USD quoted,
 *   add a quote conversion hook or configure the correct USD feed.
 * - For pairs: if no dedicated pair feed, you can enable price-ratio fallback.
 */
interface AggregatorV3Interface {
    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function decimals() external view returns (uint8);
}

contract OracleRouterChainlink is Initializable {
    uint256 private constant WAD = 1e18;
    uint256 private constant BPS = 1e4;

    // Custom errors
    error Unauthorized();
    error NotGuardian();
    error PriceFeedDisabled();
    error AggregatorZeroAddress();
    error NegativePrice();
    error RoundNotComplete();
    error StalePrice();

    /*//////////////////////////////////////////////////////////////
                               ADMIN
    //////////////////////////////////////////////////////////////*/

    address public owner;
    address public guardian;

    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    modifier onlyGuardianOrOwner() {
        _onlyGuardianOrOwner();
        _;
    }

    function _onlyOwner() internal view {
        if (msg.sender != owner) revert Unauthorized();
    }

    function _onlyGuardianOrOwner() internal view {
        if (msg.sender != guardian && msg.sender != owner) revert NotGuardian();
    }

    event OwnerSet(address indexed o);
    event GuardianSet(address indexed g);

    function initialize(address _owner) external initializer {
        owner = _owner;
        guardian = _owner;
        emit OwnerSet(_owner);
        emit GuardianSet(_owner);
    }

    function setOwner(address o) external onlyOwner {
        owner = o;
        emit OwnerSet(o);
    }

    function setGuardian(address g) external onlyOwner {
        guardian = g;
        emit GuardianSet(g);
    }

    /*//////////////////////////////////////////////////////////////
                           PRICE FEEDS (USD)
    //////////////////////////////////////////////////////////////*/

    struct Feed {
        AggregatorV3Interface agg; // Chainlink aggregator
        uint32 heartbeat; // max staleness (seconds)
        bool enabled;
        uint16 deviationBps; // optional clamp vs lastGood (0 = disabled)
        uint256 lastGoodPriceWad; // stored anchor (WAD)
        bool fallbackOnStale; // if true, clamp to anchor on staleness when anchor != 0
    }

    mapping(address => Feed) public priceFeed;

    event PriceFeedSet(address indexed asset, address indexed agg, uint32 heartbeat, bool enabled);
    event PriceDeviationSet(address indexed asset, uint16 deviationBps);
    event PriceAnchorSet(address indexed asset, uint256 lastGoodPriceWad);
    event StaleFallbackSet(address indexed asset, bool enabled);

    function setPriceFeed(address asset, address agg, uint32 heartbeat, bool enabled)
        external
        onlyOwner
    {
        Feed storage f = priceFeed[asset];
        f.agg = AggregatorV3Interface(agg);
        f.heartbeat = heartbeat;
        f.enabled = enabled;
        emit PriceFeedSet(asset, agg, heartbeat, enabled);
    }

    function setPriceDeviation(address asset, uint16 deviationBps) external onlyOwner {
        priceFeed[asset].deviationBps = deviationBps;
        emit PriceDeviationSet(asset, deviationBps);
    }

    function setStaleFallback(address asset, bool enabled) external onlyOwner {
        priceFeed[asset].fallbackOnStale = enabled;
        emit StaleFallbackSet(asset, enabled);
    }

    // Set anchor from current feed (guardian/owner)
    function primeLastGoodPrice(address asset) external onlyGuardianOrOwner {
        Feed storage f = priceFeed[asset];
        if (!f.enabled) revert PriceFeedDisabled();
        uint256 px = _readChainlinkWad(f.agg, f.heartbeat);
        f.lastGoodPriceWad = px;
        emit PriceAnchorSet(asset, px);
    }

    // Emergency/manual anchor set
    function setLastGoodPrice(address asset, uint256 priceWad) external onlyGuardianOrOwner {
        priceFeed[asset].lastGoodPriceWad = priceWad;
        emit PriceAnchorSet(asset, priceWad);
    }

    /*//////////////////////////////////////////////////////////////
                           CORE: priceUSD / exchangeRate
    //////////////////////////////////////////////////////////////*/

    event PriceClamped(address indexed asset, uint256 observedWad, uint256 usedWad);

    function priceUSD(address asset) public view returns (uint256 pxWad) {
        Feed storage f = priceFeed[asset];
        if (!f.enabled) revert PriceFeedDisabled();
        AggregatorV3Interface agg = f.agg;
        if (address(agg) == address(0)) revert AggregatorZeroAddress();

        (uint80 roundId, int256 ans,, uint256 updatedAt, uint80 answeredInRound) =
            agg.latestRoundData();
        if (ans <= 0) revert NegativePrice();
        if (answeredInRound < roundId) revert RoundNotComplete();

        // scale to 1e18
        uint256 u = uint256(ans);
        uint8 aggDecimals = agg.decimals();
        uint256 px = aggDecimals == 18
            ? u
            : (aggDecimals < 18 ? u * (10 ** (18 - aggDecimals)) : u / (10 ** (aggDecimals - 18)));

        // Staleness check with optional fallback to anchor
        if (block.timestamp - updatedAt > f.heartbeat) {
            uint256 anchorWad = f.lastGoodPriceWad;
            if (f.fallbackOnStale && anchorWad != 0) {
                return anchorWad;
            }
            revert StalePrice();
        }

        uint16 devBps = f.deviationBps;
        uint256 anchor = f.lastGoodPriceWad;
        if (devBps == 0 || anchor == 0) return px;
        uint256 diff = px > anchor ? (px - anchor) : (anchor - px);
        if (diff * BPS > anchor * devBps) {
            return anchor; // clamp to last good
        }
        return px;
    }

    /*//////////////////////////////////////////////////////////////
                           INTERNAL HELPERS
    //////////////////////////////////////////////////////////////*/

    function _readChainlinkWad(AggregatorV3Interface agg, uint32 heartbeat)
        internal
        view
        returns (uint256)
    {
        if (address(agg) == address(0)) revert AggregatorZeroAddress();
        (uint80 roundId, int256 ans,, uint256 updatedAt, uint80 answeredInRound) =
            agg.latestRoundData();
        if (ans <= 0) revert NegativePrice();
        if (answeredInRound < roundId) revert RoundNotComplete();
        if (block.timestamp - updatedAt > heartbeat) revert StalePrice();

        // scale to 1e18
        uint256 u = uint256(ans);
        uint8 aggDecimals = agg.decimals();
        if (aggDecimals == 18) return u;
        if (aggDecimals < 18) {
            return u * (10 ** (18 - aggDecimals));
        } else {
            return u / (10 ** (aggDecimals - 18));
        }
    }

    /*//////////////////////////////////////////////////////////////
                          GUARDIAN CONTROLS
    //////////////////////////////////////////////////////////////*/

    // Quickly disable a feed (price or ER) if suspected compromise
    function disablePrice(address asset) external onlyGuardianOrOwner {
        Feed storage f = priceFeed[asset];
        f.enabled = false;
        emit PriceFeedSet(asset, address(f.agg), f.heartbeat, false);
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.30;

/**
 * Minimal initializer guard for proxy-based deployments.
 * Mirrors the common pattern: one-time initialize() replacing constructors.
 */
abstract contract Initializable {
    bool private _initialized;

    modifier initializer() {
        _initializer();
        _;
    }

    function _initializer() internal {
        require(!_initialized, "Initializable: already initialized");
        _initialized = true;
    }

    function initialized() public view returns (bool) {
        return _initialized;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"AggregatorZeroAddress","type":"error"},{"inputs":[],"name":"NegativePrice","type":"error"},{"inputs":[],"name":"NotGuardian","type":"error"},{"inputs":[],"name":"PriceFeedDisabled","type":"error"},{"inputs":[],"name":"RoundNotComplete","type":"error"},{"inputs":[],"name":"StalePrice","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"g","type":"address"}],"name":"GuardianSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"o","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"lastGoodPriceWad","type":"uint256"}],"name":"PriceAnchorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"observedWad","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usedWad","type":"uint256"}],"name":"PriceClamped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint16","name":"deviationBps","type":"uint16"}],"name":"PriceDeviationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"agg","type":"address"},{"indexed":false,"internalType":"uint32","name":"heartbeat","type":"uint32"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PriceFeedSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"StaleFallbackSet","type":"event"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"disablePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"agg","type":"address"},{"internalType":"uint32","name":"heartbeat","type":"uint32"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint16","name":"deviationBps","type":"uint16"},{"internalType":"uint256","name":"lastGoodPriceWad","type":"uint256"},{"internalType":"bool","name":"fallbackOnStale","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"priceUSD","outputs":[{"internalType":"uint256","name":"pxWad","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"primeLastGoodPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"g","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"priceWad","type":"uint256"}],"name":"setLastGoodPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"o","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint16","name":"deviationBps","type":"uint16"}],"name":"setPriceDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"agg","type":"address"},{"internalType":"uint32","name":"heartbeat","type":"uint32"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setStaleFallback","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080806040523460155761123c908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806313af403514610a64578063158ef93e14610a255780631fd48b9a146109675780632096631a146108715780633e4a106a146107db578063452a93201461078a57806366d571de146106ae5780638a0dac4a146106095780638da5cb5b146105b6578063903456711461044a578063c4d66de8146102b4578063d70d170f146101ea578063dfc73912146101005763f4d057ff146100b3575f80fd5b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5760206100f46100ef610b22565b610cef565b604051908152f35b5f80fd5b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610137610b22565b6024359061ffff8216908183036100fc577f44494b6ff2f5bddfbf2de8bad3e23df5b23bcad6eaef133b3f4c9b6f38055e089173ffffffffffffffffffffffffffffffffffffffff60209261018a610ffc565b1693845f526002835260405f20907fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff7affff0000000000000000000000000000000000000000000000000083549260c81b169116179055604051908152a2005b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610221610b22565b602435908115158092036100fc57602073ffffffffffffffffffffffffffffffffffffffff7f7c6c1667a7354fa59fddfe61245b413612254fc1df0d5db611fcf76fb373dae292610270610ffc565b1692835f5260028252600260405f20017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc576102eb610b22565b5f5460ff81166103c6576001907fffffffffffffffffffffff00000000000000000000000000000000000000000074ffffffffffffffffffffffffffffffffffffffff0073ffffffffffffffffffffffffffffffffffffffff85169460081b16911617175f55807fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155807f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe25f80a27fe6c09ffe4572dc9ceaa5ddde4ae41befa655d6fdfe8052077af0970f700e942e5f80a2005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e697469616c697a61626c653a20616c726561647920696e697469616c697a60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b346100fc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610481610b22565b6024359073ffffffffffffffffffffffffffffffffffffffff82168092036100fc576044359063ffffffff82168083036100fc576064358015158091036100fc5773ffffffffffffffffffffffffffffffffffffffff7f71b00df788cc76317d8d027b8c7c735b1b9b856e1a088689e1990db33852a64a93610501610ffc565b165f8181526002602090815260409182902080547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffff000000000000000000000000000000000000000000000000009091161760a09890981b77ffffffff0000000000000000000000000000000000000000169790971760c085901b78ff00000000000000000000000000000000000000000000000016179096558051938452948301919091529290a3005b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602073ffffffffffffffffffffffffffffffffffffffff5f5460081c16604051908152f35b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff610655610b22565b61065d610ffc565b16807fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001557fe6c09ffe4572dc9ceaa5ddde4ae41befa655d6fdfe8052077af0970f700e942e5f80a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6106fa610b22565b610702611047565b16805f52600260205260405f20908154917fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff831690557f71b00df788cc76317d8d027b8c7c735b1b9b856e1a088689e1990db33852a64a604073ffffffffffffffffffffffffffffffffffffffff81519463ffffffff8160a01c1686525f60208701521693a3005b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610812610b22565b7f11a178bb9fc2ed8cab266ee691719245b7d7ce46f0c704e7ae4572528219a5a4602073ffffffffffffffffffffffffffffffffffffffff60243593610856611047565b1692835f526002825280600160405f200155604051908152a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6108bd610b22565b6108c5611047565b16805f52600260205260405f2080549060ff8260c01c161561093f5760016020916109318473ffffffffffffffffffffffffffffffffffffffff63ffffffff7f11a178bb9fc2ed8cab266ee691719245b7d7ce46f0c704e7ae4572528219a5a49760a01c1691166110bb565b9182910155604051908152a2005b7f64bb3412000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6109b3610b22565b165f52600260205260c060405f2080549060ff60026001830154920154169061ffff6040519373ffffffffffffffffffffffffffffffffffffffff8116855263ffffffff8160a01c16602086015260ff81871c161515604086015260c81c1660608401526080830152151560a0820152f35b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602060ff5f54166040519015158152f35b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff610ab0610b22565b610ab8610ffc565b5f547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008360081b169116175f55167f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe25f80a2005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100fc57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b8657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b519069ffffffffffffffffffff821682036100fc57565b908160a09103126100fc57610bde81610bb3565b91602082015191604081015191610bfc608060608401519301610bb3565b90565b908160209103126100fc575160ff811681036100fc5790565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9116019060ff8211610c4957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff166012039060ff8211610c4957565b60ff16604d8111610c4957600a0a90565b8115610ca2570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b81810292918115918404141715610c4957565b91908203918211610c4957565b73ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2080549060ff8260c01c161561093f5773ffffffffffffffffffffffffffffffffffffffff8216918215610fd457604051927ffeaf968c00000000000000000000000000000000000000000000000000000000845260a084600481845afa8015610f3f575f905f915f965f92610f9a575b505f831315610f725769ffffffffffffffffffff809116911610610f4a576020600492604051938480927f313ce5670000000000000000000000000000000000000000000000000000000082525afa908115610f3f57610df9925f92610f0e575b5060ff821660128103610ecc57509050935b42610ce2565b63ffffffff8260a01c1610610e815761ffff60019160c81c169101549080158015610e79575b610e745781831115610e6457610e358284610ce2565b905b6127108202918083046127101490151715610c4957610e569083610ccf565b10610e5f575090565b905090565b610e6e8383610ce2565b90610e37565b505090565b508115610e1f565b50905060ff600260018301549201541680610ec3575b610bfc577f19abf40e000000000000000000000000000000000000000000000000000000005f5260045ffd5b50801515610e97565b60121115610ef457610ee8610ee3610eee93610c76565b610c87565b90610ccf565b93610df3565b610f03610ee3610f0993610c18565b90610c98565b610eee565b610f3191925060203d602011610f38575b610f298183610b45565b810190610bff565b905f610de1565b503d610f1f565b6040513d5f823e3d90fd5b7f159c98a0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f61ca76d2000000000000000000000000000000000000000000000000000000005f5260045ffd5b92505050610fc191945060a03d60a011610fcd575b610fb98183610b45565b810190610bca565b9096939091505f610d80565b503d610faf565b7fa15e78a8000000000000000000000000000000000000000000000000000000005f5260045ffd5b73ffffffffffffffffffffffffffffffffffffffff5f5460081c16330361101f57565b7f82b42900000000000000000000000000000000000000000000000000000000005f5260045ffd5b73ffffffffffffffffffffffffffffffffffffffff6001541633141580611097575b61106f57565b7fef6d0f02000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff5f5460081c16331415611069565b73ffffffffffffffffffffffffffffffffffffffff16908115610fd457604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa918215610f3f575f925f935f925f92611211575b505f851315610f725769ffffffffffffffffffff809116911610610f4a5761114963ffffffff9142610ce2565b9116106111e9576020600492604051938480927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610f3f575f926111c8575b5060ff8216601281146111c257601211156111b357610ee8610ee3610bfc93610c76565b610f03610ee3610bfc93610c18565b50905090565b6111e291925060203d602011610f3857610f298183610b45565b905f61118f565b7f19abf40e000000000000000000000000000000000000000000000000000000005f5260045ffd5b9250505061122f91925060a03d60a011610fcd57610fb98183610b45565b929493909291505f61111c56

Deployed Bytecode

0x60806040526004361015610011575f80fd5b5f3560e01c806313af403514610a64578063158ef93e14610a255780631fd48b9a146109675780632096631a146108715780633e4a106a146107db578063452a93201461078a57806366d571de146106ae5780638a0dac4a146106095780638da5cb5b146105b6578063903456711461044a578063c4d66de8146102b4578063d70d170f146101ea578063dfc73912146101005763f4d057ff146100b3575f80fd5b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5760206100f46100ef610b22565b610cef565b604051908152f35b5f80fd5b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610137610b22565b6024359061ffff8216908183036100fc577f44494b6ff2f5bddfbf2de8bad3e23df5b23bcad6eaef133b3f4c9b6f38055e089173ffffffffffffffffffffffffffffffffffffffff60209261018a610ffc565b1693845f526002835260405f20907fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff7affff0000000000000000000000000000000000000000000000000083549260c81b169116179055604051908152a2005b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610221610b22565b602435908115158092036100fc57602073ffffffffffffffffffffffffffffffffffffffff7f7c6c1667a7354fa59fddfe61245b413612254fc1df0d5db611fcf76fb373dae292610270610ffc565b1692835f5260028252600260405f20017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc576102eb610b22565b5f5460ff81166103c6576001907fffffffffffffffffffffff00000000000000000000000000000000000000000074ffffffffffffffffffffffffffffffffffffffff0073ffffffffffffffffffffffffffffffffffffffff85169460081b16911617175f55807fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155807f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe25f80a27fe6c09ffe4572dc9ceaa5ddde4ae41befa655d6fdfe8052077af0970f700e942e5f80a2005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e697469616c697a61626c653a20616c726561647920696e697469616c697a60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b346100fc5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610481610b22565b6024359073ffffffffffffffffffffffffffffffffffffffff82168092036100fc576044359063ffffffff82168083036100fc576064358015158091036100fc5773ffffffffffffffffffffffffffffffffffffffff7f71b00df788cc76317d8d027b8c7c735b1b9b856e1a088689e1990db33852a64a93610501610ffc565b165f8181526002602090815260409182902080547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffff000000000000000000000000000000000000000000000000009091161760a09890981b77ffffffff0000000000000000000000000000000000000000169790971760c085901b78ff00000000000000000000000000000000000000000000000016179096558051938452948301919091529290a3005b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602073ffffffffffffffffffffffffffffffffffffffff5f5460081c16604051908152f35b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff610655610b22565b61065d610ffc565b16807fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001557fe6c09ffe4572dc9ceaa5ddde4ae41befa655d6fdfe8052077af0970f700e942e5f80a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6106fa610b22565b610702611047565b16805f52600260205260405f20908154917fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff831690557f71b00df788cc76317d8d027b8c7c735b1b9b856e1a088689e1990db33852a64a604073ffffffffffffffffffffffffffffffffffffffff81519463ffffffff8160a01c1686525f60208701521693a3005b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346100fc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57610812610b22565b7f11a178bb9fc2ed8cab266ee691719245b7d7ce46f0c704e7ae4572528219a5a4602073ffffffffffffffffffffffffffffffffffffffff60243593610856611047565b1692835f526002825280600160405f200155604051908152a2005b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6108bd610b22565b6108c5611047565b16805f52600260205260405f2080549060ff8260c01c161561093f5760016020916109318473ffffffffffffffffffffffffffffffffffffffff63ffffffff7f11a178bb9fc2ed8cab266ee691719245b7d7ce46f0c704e7ae4572528219a5a49760a01c1691166110bb565b9182910155604051908152a2005b7f64bb3412000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff6109b3610b22565b165f52600260205260c060405f2080549060ff60026001830154920154169061ffff6040519373ffffffffffffffffffffffffffffffffffffffff8116855263ffffffff8160a01c16602086015260ff81871c161515604086015260c81c1660608401526080830152151560a0820152f35b346100fc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc57602060ff5f54166040519015158152f35b346100fc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100fc5773ffffffffffffffffffffffffffffffffffffffff610ab0610b22565b610ab8610ffc565b5f547fffffffffffffffffffffff0000000000000000000000000000000000000000ff74ffffffffffffffffffffffffffffffffffffffff008360081b169116175f55167f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe25f80a2005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100fc57565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b8657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b519069ffffffffffffffffffff821682036100fc57565b908160a09103126100fc57610bde81610bb3565b91602082015191604081015191610bfc608060608401519301610bb3565b90565b908160209103126100fc575160ff811681036100fc5790565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee9116019060ff8211610c4957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff166012039060ff8211610c4957565b60ff16604d8111610c4957600a0a90565b8115610ca2570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b81810292918115918404141715610c4957565b91908203918211610c4957565b73ffffffffffffffffffffffffffffffffffffffff165f52600260205260405f2080549060ff8260c01c161561093f5773ffffffffffffffffffffffffffffffffffffffff8216918215610fd457604051927ffeaf968c00000000000000000000000000000000000000000000000000000000845260a084600481845afa8015610f3f575f905f915f965f92610f9a575b505f831315610f725769ffffffffffffffffffff809116911610610f4a576020600492604051938480927f313ce5670000000000000000000000000000000000000000000000000000000082525afa908115610f3f57610df9925f92610f0e575b5060ff821660128103610ecc57509050935b42610ce2565b63ffffffff8260a01c1610610e815761ffff60019160c81c169101549080158015610e79575b610e745781831115610e6457610e358284610ce2565b905b6127108202918083046127101490151715610c4957610e569083610ccf565b10610e5f575090565b905090565b610e6e8383610ce2565b90610e37565b505090565b508115610e1f565b50905060ff600260018301549201541680610ec3575b610bfc577f19abf40e000000000000000000000000000000000000000000000000000000005f5260045ffd5b50801515610e97565b60121115610ef457610ee8610ee3610eee93610c76565b610c87565b90610ccf565b93610df3565b610f03610ee3610f0993610c18565b90610c98565b610eee565b610f3191925060203d602011610f38575b610f298183610b45565b810190610bff565b905f610de1565b503d610f1f565b6040513d5f823e3d90fd5b7f159c98a0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f61ca76d2000000000000000000000000000000000000000000000000000000005f5260045ffd5b92505050610fc191945060a03d60a011610fcd575b610fb98183610b45565b810190610bca565b9096939091505f610d80565b503d610faf565b7fa15e78a8000000000000000000000000000000000000000000000000000000005f5260045ffd5b73ffffffffffffffffffffffffffffffffffffffff5f5460081c16330361101f57565b7f82b42900000000000000000000000000000000000000000000000000000000005f5260045ffd5b73ffffffffffffffffffffffffffffffffffffffff6001541633141580611097575b61106f57565b7fef6d0f02000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff5f5460081c16331415611069565b73ffffffffffffffffffffffffffffffffffffffff16908115610fd457604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa918215610f3f575f925f935f925f92611211575b505f851315610f725769ffffffffffffffffffff809116911610610f4a5761114963ffffffff9142610ce2565b9116106111e9576020600492604051938480927f313ce5670000000000000000000000000000000000000000000000000000000082525afa918215610f3f575f926111c8575b5060ff8216601281146111c257601211156111b357610ee8610ee3610bfc93610c76565b610f03610ee3610bfc93610c18565b50905090565b6111e291925060203d602011610f3857610f298183610b45565b905f61118f565b7f19abf40e000000000000000000000000000000000000000000000000000000005f5260045ffd5b9250505061122f91925060a03d60a011610fcd57610fb98183610b45565b929493909291505f61111c56

Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.