S Price: $0.067777 (-0.66%)
Gas: 55 Gwei

Contract

0x6530c850701Fe47731c7aE913b60cF553bA1174A

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

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 100 runs

Other Settings:
shanghai EvmVersion
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

import "../interfaces/INumaTokenToEthConverter.sol";
import "../libraries/OracleUtils.sol";

contract USDToEthConverter is INumaTokenToEthConverter, OracleUtils {
   
    address public immutable pricefeedETH_USD;
    uint128 immutable chainlink_heartbeatETH_USD;

    //uint decimals;

    constructor(
        address _pricefeedETH_USD,
        uint128 _chainlink_heartbeatETH_USD,
        address _uptimeFeedAddress //,
    )
        //uint _decimals
        OracleUtils(_uptimeFeedAddress)
    {

        pricefeedETH_USD = _pricefeedETH_USD;
        chainlink_heartbeatETH_USD = _chainlink_heartbeatETH_USD;
        //decimals = _decimals;
    }

   /**
    * @dev eth to pool token using 2 oracles 
    */
    function convertEthToToken(
        uint256 _ethAmount
    ) public view checkSequencerActive returns (uint256 tokenAmount) {
       
        (
            uint80 roundID2,
            int256 price2,
            ,
            uint256 timeStamp2,
            uint80 answeredInRound2
        ) = AggregatorV3Interface(pricefeedETH_USD).latestRoundData();

        // heartbeat check
        require(
            timeStamp2 >= block.timestamp - chainlink_heartbeatETH_USD,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator2 = IChainlinkAggregator(
            IChainlinkPriceFeed(pricefeedETH_USD).aggregator()
        );
        require(
            ((price2 > int256(aggregator2.minAnswer())) &&
                (price2 < int256(aggregator2.maxAnswer()))),
            "min/max reached"
        );
        require(answeredInRound2 >= roundID2, "Answer given before round");

        // compose oracles

        // Chainlink ETH/USD price feed has 8 decimals; ethAmount is in wei (18 decimals)
        // To convert:
        //   (ethAmount in wei) * (ethPriceUsd) / 10^(decimals difference)
        //   = ethAmount * ethPriceUsd / 10^8
        tokenAmount = (_ethAmount * uint256(price2)) / 1e8;
    }

   /**
    * @dev pool token to eth using 2 oracles 
    */
    function convertTokenToEth(
        uint256 _tokenAmount
    ) public view checkSequencerActive returns (uint256 ethValue) {
       
        (
            uint80 roundID2,
            int256 price2,
            ,
            uint256 timeStamp2,
            uint80 answeredInRound2
        ) = AggregatorV3Interface(pricefeedETH_USD).latestRoundData();

        // heartbeat check
        require(
            timeStamp2 >= block.timestamp - chainlink_heartbeatETH_USD,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator2 = IChainlinkAggregator(
            IChainlinkPriceFeed(pricefeedETH_USD).aggregator()
        );
        require(
            ((price2 > int256(aggregator2.minAnswer())) &&
                (price2 < int256(aggregator2.maxAnswer()))),
            "min/max reached"
        );

        require(answeredInRound2 >= roundID2, "Answer given before round");


        // Chainlink ETH/USD price feed has 8 decimals; usdAmount is in 18 decimals
        // To convert:
        //   (usdAmount in 18 decimals) * 10^(decimals difference) / ethPriceUsd
        //   = usdAmount * 10^8 / ethPriceUsd
        ethValue = (_tokenAmount * 1e8) / uint256(price2);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

interface INumaTokenToEthConverter {
    function convertEthToToken(
        uint256 _ethAmount
    ) external view returns (uint256);

    function convertTokenToEth(
        uint256 _tokenAmount
    ) external view returns (uint256);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.20;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol";
import {IChainlinkAggregator} from "../interfaces/IChainlinkAggregator.sol";
import {IChainlinkPriceFeed} from "../interfaces/IChainlinkPriceFeed.sol";

import "@uniswap/v3-core/contracts/libraries/FullMath.sol";

contract OracleUtils {
    uint256 private constant GRACE_PERIOD_TIME = 3600;

    error SequencerDown();
    error GracePeriodNotOver();

    address internal sequencerUptimeFeed;
    constructor(address _uptimeFeedAddress) {
        sequencerUptimeFeed = _uptimeFeedAddress;
    }

    modifier checkSequencerActive() {
        if (sequencerUptimeFeed != address(0)) {
            (
                ,
                /*uint80 roundID*/ int256 answer,
                uint256 startedAt /*uint256 updatedAt*/ /*uint80 answeredInRound*/,
                ,

            ) = AggregatorV2V3Interface(sequencerUptimeFeed).latestRoundData();

            // Answer == 0: Sequencer is up
            // Answer == 1: Sequencer is down
            bool isSequencerUp = answer == 0;
            if (!isSequencerUp) {
                revert SequencerDown();
            }

            // Make sure the grace period has passed after the
            // sequencer is back up.
            uint256 timeSinceUp = block.timestamp - startedAt;
            if (timeSinceUp <= GRACE_PERIOD_TIME) {
                revert GracePeriodNotOver();
            }
        }
        _;
    }

    /**
     * @dev chainlink call to a pricefeed with any amount
     */
    function ethToToken(
        uint256 _ethAmount,
        address _pricefeed,
        uint128 _chainlink_heartbeat,
        uint256 _decimals
    ) public view checkSequencerActive returns (uint256 tokenAmount) {
        (
            uint80 roundID,
            int256 price,
            ,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = AggregatorV3Interface(_pricefeed).latestRoundData();

        // heartbeat check
        require(
            timeStamp >= block.timestamp - _chainlink_heartbeat,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator = IChainlinkAggregator(
            IChainlinkPriceFeed(_pricefeed).aggregator()
        );
        require(
            ((price > int256(aggregator.minAnswer())) &&
                (price < int256(aggregator.maxAnswer()))),
            "min/max reached"
        );

        require(answeredInRound >= roundID, "Answer given before round");

        //if ETH is on the left side of the fraction in the price feed
        if (ethLeftSide(_pricefeed)) {
            tokenAmount = FullMath.mulDiv(
                _ethAmount,
                uint256(price),
                10 ** AggregatorV3Interface(_pricefeed).decimals()
            );
        } else {
            tokenAmount = FullMath.mulDiv(
                _ethAmount,
                10 ** AggregatorV3Interface(_pricefeed).decimals(),
                uint256(price)
            );
        }

        // audit fix
        tokenAmount = tokenAmount * 10 ** (18 - _decimals);
    }

    /**
     * @dev chainlink call to a pricefeed with any amount
     */
    function ethToTokenRoundUp(
        uint256 _ethAmount,
        address _pricefeed,
        uint128 _chainlink_heartbeat,
        uint256 _decimals
    ) public view checkSequencerActive returns (uint256 tokenAmount) {
        (
            uint80 roundID,
            int256 price,
            ,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = AggregatorV3Interface(_pricefeed).latestRoundData();

        // heartbeat check
        require(
            timeStamp >= block.timestamp - _chainlink_heartbeat,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator = IChainlinkAggregator(
            IChainlinkPriceFeed(_pricefeed).aggregator()
        );
        require(
            ((price > int256(aggregator.minAnswer())) &&
                (price < int256(aggregator.maxAnswer()))),
            "min/max reached"
        );

        require(answeredInRound >= roundID, "Answer given before round");

        //if ETH is on the left side of the fraction in the price feed
        if (ethLeftSide(_pricefeed)) {
            tokenAmount = FullMath.mulDivRoundingUp(
                _ethAmount,
                uint256(price),
                10 ** AggregatorV3Interface(_pricefeed).decimals()
            );
        } else {
            tokenAmount = FullMath.mulDivRoundingUp(
                _ethAmount,
                10 ** AggregatorV3Interface(_pricefeed).decimals(),
                uint256(price)
            );
        }
        // audit fix
        tokenAmount = tokenAmount * 10 ** (18 - _decimals);
    }

    /**
     * @dev chainlink call to a pricefeed with any amount
     */
    function tokenToEth(
        uint256 _amount,
        address _pricefeed,
        uint128 _chainlink_heartbeat,
        uint256 _decimals
    ) public view checkSequencerActive returns (uint256 EthValue) {
        (
            uint80 roundID,
            int256 price,
            ,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = AggregatorV3Interface(_pricefeed).latestRoundData();

        // heartbeat check
        require(
            timeStamp >= block.timestamp - _chainlink_heartbeat,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator = IChainlinkAggregator(
            IChainlinkPriceFeed(_pricefeed).aggregator()
        );
        require(
            ((price > int256(aggregator.minAnswer())) &&
                (price < int256(aggregator.maxAnswer()))),
            "min/max reached"
        );

        require(answeredInRound >= roundID, "Answer given before round");

        //if ETH is on the left side of the fraction in the price feed
        if (ethLeftSide(_pricefeed)) {
            EthValue = FullMath.mulDiv(
                _amount,
                10 ** AggregatorV3Interface(_pricefeed).decimals(),
                uint256(price)
            );
        } else {
            EthValue = FullMath.mulDiv(
                _amount,
                uint256(price),
                10 ** AggregatorV3Interface(_pricefeed).decimals()
            );
        }

        // audit fix
        EthValue = EthValue * 10 ** (18 - _decimals);
    }

    /**
     * @dev chainlink call to a pricefeed with any amount
     */
    function tokenToEthRoundUp(
        uint256 _amount,
        address _pricefeed,
        uint128 _chainlink_heartbeat,
        uint256 _decimals
    ) public view checkSequencerActive returns (uint256 EthValue) {
        (
            uint80 roundID,
            int256 price,
            ,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = AggregatorV3Interface(_pricefeed).latestRoundData();

        // heartbeat check
        require(
            timeStamp >= block.timestamp - _chainlink_heartbeat,
            "Stale pricefeed"
        );

        // minAnswer/maxAnswer check
        IChainlinkAggregator aggregator = IChainlinkAggregator(
            IChainlinkPriceFeed(_pricefeed).aggregator()
        );
        require(
            ((price > int256(aggregator.minAnswer())) &&
                (price < int256(aggregator.maxAnswer()))),
            "min/max reached"
        );

        require(answeredInRound >= roundID, "Answer given before round");

        //if ETH is on the left side of the fraction in the price feed
        if (ethLeftSide(_pricefeed)) {
            EthValue = FullMath.mulDivRoundingUp(
                _amount,
                10 ** AggregatorV3Interface(_pricefeed).decimals(),
                uint256(price)
            );
        } else {
            EthValue = FullMath.mulDivRoundingUp(
                _amount,
                uint256(price),
                10 ** AggregatorV3Interface(_pricefeed).decimals()
            );
        }
        // audit fix
        EthValue = EthValue * 10 ** (18 - _decimals);
    }

    function ethLeftSide(address _chainlinkFeed) internal view returns (bool) {
        string memory description = AggregatorV3Interface(_chainlinkFeed)
            .description();
        bytes memory descriptionBytes = bytes(description);
        bytes memory ethBytes = bytes("ETH");
        for (uint i = 0; i < 3; i++)
            if (descriptionBytes[i] != ethBytes[i]) return false;
        return true;
    }
}

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

import "./AggregatorInterface.sol";
import "./AggregatorV3Interface.sol";

interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

interface IChainlinkAggregator {
    function minAnswer() external view returns (int192);
    function maxAnswer() external view returns (int192);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
interface IChainlinkPriceFeed {
    function decimals() external view returns (uint8);
    function description() external view returns (string memory);
    function version() external view returns (uint256);

    function latestAnswer() external view returns (int256);

    function latestTimestamp() external view returns (uint256);

    function latestRound() external view returns (uint256);

    function getAnswer(uint256 roundId) external view returns (int256);

    function getTimestamp(uint256 roundId) external view returns (uint256);

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function aggregator() external view returns (address);

    event AnswerUpdated(
        int256 indexed current,
        uint256 indexed roundId,
        uint256 timestamp
    );
    event NewRound(uint256 indexed roundId, address indexed startedBy);
}

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

/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
    /// @param a The multiplicand
    /// @param b The multiplier
    /// @param denominator The divisor
    /// @return result The 256-bit result
    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
    function mulDiv(
        uint256 a,
        uint256 b,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = a * b
            // Compute the product mod 2**256 and mod 2**256 - 1
            // then use the Chinese Remainder Theorem to reconstruct
            // the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2**256 + prod0
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(a, b, not(0))
                prod0 := mul(a, b)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division
            if (prod1 == 0) {
                require(denominator > 0);
                assembly {
                    result := div(prod0, denominator)
                }
                return result;
            }

            // Make sure the result is less than 2**256.
            // Also prevents denominator == 0
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0]
            // Compute remainder using mulmod
            uint256 remainder;
            assembly {
                remainder := mulmod(a, b, denominator)
            }
            // Subtract 256 bit number from 512 bit number
            assembly {
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator
            // Compute largest power of two divisor of denominator.
            // Always >= 1.
            uint256 twos = (0 - denominator) & denominator;
            // Divide denominator by power of two
            assembly {
                denominator := div(denominator, twos)
            }

            // Divide [prod1 prod0] by the factors of two
            assembly {
                prod0 := div(prod0, twos)
            }
            // Shift in bits from prod1 into prod0. For this we need
            // to flip `twos` such that it is 2**256 / twos.
            // If twos is zero, then it becomes one
            assembly {
                twos := add(div(sub(0, twos), twos), 1)
            }
            prod0 |= prod1 * twos;

            // Invert denominator mod 2**256
            // Now that denominator is an odd number, it has an inverse
            // modulo 2**256 such that denominator * inv = 1 mod 2**256.
            // Compute the inverse by starting with a seed that is correct
            // correct for four bits. That is, denominator * inv = 1 mod 2**4
            uint256 inv = (3 * denominator) ^ 2;
            // Now use Newton-Raphson iteration to improve the precision.
            // Thanks to Hensel's lifting lemma, this also works in modular
            // arithmetic, doubling the correct bits in each step.
            inv *= 2 - denominator * inv; // inverse mod 2**8
            inv *= 2 - denominator * inv; // inverse mod 2**16
            inv *= 2 - denominator * inv; // inverse mod 2**32
            inv *= 2 - denominator * inv; // inverse mod 2**64
            inv *= 2 - denominator * inv; // inverse mod 2**128
            inv *= 2 - denominator * inv; // inverse mod 2**256

            // Because the division is now exact we can divide by multiplying
            // with the modular inverse of denominator. This will give us the
            // correct result modulo 2**256. Since the precoditions guarantee
            // that the outcome is less than 2**256, this is the final result.
            // We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inv;
            return result;
        }
    }

    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
    /// @param a The multiplicand
    /// @param b The multiplier
    /// @param denominator The divisor
    /// @return result The 256-bit result
    function mulDivRoundingUp(
        uint256 a,
        uint256 b,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            result = mulDiv(a, b, denominator);
            if (mulmod(a, b, denominator) > 0) {
                require(result < type(uint256).max);
                result++;
            }
        }
    }
}

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

interface AggregatorInterface {
  function latestAnswer() external view returns (int256);

  function latestTimestamp() external view returns (uint256);

  function latestRound() external view returns (uint256);

  function getAnswer(uint256 roundId) external view returns (int256);

  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);

  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}

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

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

Settings
{
  "remappings": [
    "@chainlink/=node_modules/@chainlink/",
    "@eth-optimism/=node_modules/@chainlink/contracts/node_modules/@eth-optimism/",
    "@layerzerolabs/=node_modules/@layerzerolabs/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@uniswap/=node_modules/@uniswap/",
    "base64-sol/=node_modules/base64-sol/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "uniV3periphery/=node_modules/uniV3periphery/",
    "uniswap-v3-periphery-0.8/=node_modules/uniswap-v3-periphery-0.8/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_pricefeedETH_USD","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeatETH_USD","type":"uint128"},{"internalType":"address","name":"_uptimeFeedAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GracePeriodNotOver","type":"error"},{"inputs":[],"name":"SequencerDown","type":"error"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"convertEthToToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"convertTokenToEth","outputs":[{"internalType":"uint256","name":"ethValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"ethToToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"ethToTokenRoundUp","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricefeedETH_USD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"tokenToEth","outputs":[{"internalType":"uint256","name":"EthValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_pricefeed","type":"address"},{"internalType":"uint128","name":"_chainlink_heartbeat","type":"uint128"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"tokenToEthRoundUp","outputs":[{"internalType":"uint256","name":"EthValue","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c0346100bd57601f61177d38819003918201601f19168301916001600160401b038311848410176100c1578084926060946040528339810103126100bd57610047816100d5565b6020820151916001600160801b03831683036100bd576001600160a01b0390610072906040016100d5565b1660018060a01b03195f5416175f5560805260a05260405161169390816100ea82396080518181816106ec015281816109970152610f1e015260a0518181816107390152610f6a0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100bd5756fe60806040818152600480361015610014575f80fd5b5f92833560e01c90816339fc721114610eda575080633ac2ba2614610c515780637375416f146109c65780639b0a897614610982578063e0d380e5146106b1578063e47476411461041a5763f3aee97d1461006d575f80fd5b346104165761007b366111a9565b93929060018060a09894981b0396848885541680610385575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879588918994610336575b506100e391906100dc906001600160801b03164261126d565b111561128e565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610309575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b916102e2575b5060170b8813908161025f575b509161016b916101546101709594611304565b69ffffffffffffffffffff80911691161015611342565b6113fa565b1561022057885163313ce56760e01b815292839182905afa908115610216576101ac9392916101a69186916101e9575b506113b6565b9161161d565b925b60120391601283116101d6575050906101c96101cf926113c7565b9061138a565b9051908152f35b634e487b7160e01b825260119052602490fd5b61020991508a3d8c1161020f575b61020181836111eb565b81019061139d565b5f6101a0565b503d6101f7565b87513d86823e3d90fd5b885163313ce56760e01b815293949392839182905afa908115610216576102599392916102539186916101e957506113b6565b9061161d565b926101ae565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610170936101548f979461016b948d916102ab575b5060170b8a12929495505091610141565b6102cb9150893d8b116102d1575b6102c381836111eb565b8101906112eb565b5f61029a565b503d6102b9565b8b513d8a823e3d90fd5b6102f99150873d89116102d1576102c381836111eb565b5f610134565b8c513d8b823e3d90fd5b61032991508d803d1061032f575b61032181836111eb565b8101906112cc565b5f610108565b503d610317565b9093506100dc96506100e39250610364915060a03d8111610374575b61035c81836111eb565b810190611238565b92989295939450929190506100c3565b503d610352565b89513d88823e3d90fd5b60a090895192838092633fabe5a360e21b82525afa90811561040c57859086926103e8575b506103d9576103bc610e10914261126d565b11156103c957845f610094565b865163d15f73b560e01b81528590fd5b875162032b3d60e81b81528690fd5b9050610402915060a03d81116103745761035c81836111eb565b505091505f6103aa565b88513d87823e3d90fd5b8280fd5b503461041657610429366111a9565b86546001600160a01b03979195949193908590891680610649575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879688918994610614575b5061048c91906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff5789916105f7575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b916105da575b5060170b89139081610571575b509161016b916101546104fd9594611304565b1561053857885163313ce56760e01b815292839182905afa908115610216576101ac9392916105329186916101e957506113b6565b9061159d565b885163313ce56760e01b815293949392839182905afa9081156102165761025993929161056b9186916101e957506113b6565b9161159d565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d8578995936104fd936101548f979461016b948d916105bd575b5060170b8b129294955050916104ea565b6105d49150893d8b116102d1576102c381836111eb565b5f6105ac565b6105f19150873d89116102d1576102c381836111eb565b5f6104dd565b61060e91508d803d1061032f5761032181836111eb565b5f6104b1565b9093506100dc975061048c9250610639915060a03d81116103745761035c81836111eb565b9299929593945092919050610473565b60a090895192838092633fabe5a360e21b82525afa90811561040c578590869261068d575b506103d957610680610e10914261126d565b11156103c957845f610444565b90506106a7915060a03d81116103745761035c81836111eb565b505091505f61066e565b50913461097f576020928360031936011261097b5781546001600160a01b039082908216806108eb575b50508351633fabe5a360e21b8152927f000000000000000000000000000000000000000000000000000000000000000082169060a0858581855afa9283156108df578782938397849085976108a9575b5087929190610767906100dc7f00000000000000000000000000000000000000000000000000000000000000006001600160801b03164261126d565b89516309169eff60e21b815292839182905afa90811561089f578391610882575b5016908651630455b78f60e31b815288818781865afa90811561087857908991839161085b575b5060170b871392836107e4575b50876305f5e1006107dc89896107d68a8a6101548b611304565b3561138a565b049051908152f35b88516370da2f6760e01b81529293508290879082905afa91821561085057926101546107d6936305f5e1009896936107dc989691610833575b5060170b861293508295975089919496506107bc565b61084a91508b3d8d116102d1576102c381836111eb565b5f61081d565b8751903d90823e3d90fd5b6108729150823d84116102d1576102c381836111eb565b5f6107af565b88513d84823e3d90fd5b6108999150893d8b1161032f5761032181836111eb565b5f610788565b88513d85823e3d90fd5b90506108cd91985087929650610767955060a03d81116103745761035c81836111eb565b929a929893979394509192905061072b565b508551903d90823e3d90fd5b60a090865192838092633fabe5a360e21b82525afa908115610971578490859261094d575b5061093e57610922610e10914261126d565b111561092f57815f6106db565b50825163d15f73b560e01b8152fd5b845162032b3d60e81b81528390fd5b9050610967915060a03d81116103745761035c81836111eb565b505091505f610910565b85513d86823e3d90fd5b5080fd5b80fd5b50503461097b578160031936011261097b57517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610416576109d5366111a9565b86546001600160a01b03979195949193908590891680610be9575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879688918994610bb4575b50610a3891906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610b97575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b91610b7a575b5060170b89139081610b11575b509161016b91610154610aa99594611304565b15610ade57885163313ce56760e01b815292839182905afa908115610216576101ac9392916102539186916101e957506113b6565b885163313ce56760e01b815293949392839182905afa908115610216576102599392916101a69186916101e957506113b6565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610aa9936101548f979461016b948d91610b5d575b5060170b8b12929495505091610a96565b610b749150893d8b116102d1576102c381836111eb565b5f610b4c565b610b919150873d89116102d1576102c381836111eb565b5f610a89565b610bae91508d803d1061032f5761032181836111eb565b5f610a5d565b9093506100dc9750610a389250610bd9915060a03d81116103745761035c81836111eb565b9299929593945092919050610a1f565b60a090895192838092633fabe5a360e21b82525afa90811561040c5785908692610c2d575b506103d957610c20610e10914261126d565b11156103c957845f6109f0565b9050610c47915060a03d81116103745761035c81836111eb565b505091505f610c0e565b503461041657610c60366111a9565b93929060018060a09894981b0396848885541680610e72575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879588918994610e3d575b50610cc191906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610e20575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b91610e03575b5060170b88139081610d9a575b509161016b91610154610d329594611304565b15610d6757885163313ce56760e01b815292839182905afa908115610216576101ac93929161056b9186916101e957506113b6565b885163313ce56760e01b815293949392839182905afa908115610216576102599392916105329186916101e957506113b6565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610d32936101548f979461016b948d91610de6575b5060170b8a12929495505091610d1f565b610dfd9150893d8b116102d1576102c381836111eb565b5f610dd5565b610e1a9150873d89116102d1576102c381836111eb565b5f610d12565b610e3791508d803d1061032f5761032181836111eb565b5f610ce6565b9093506100dc9650610cc19250610e62915060a03d81116103745761035c81836111eb565b9298929593945092919050610ca8565b60a090895192838092633fabe5a360e21b82525afa90811561040c5785908692610eb6575b506103d957610ea9610e10914261126d565b11156103c957845f610c79565b9050610ed0915060a03d81116103745761035c81836111eb565b505091505f610e97565b91929050346111a5576020938460031936011261097f5780548435946001600160a01b039490918290861680611118575b50508351633fabe5a360e21b81529490507f0000000000000000000000000000000000000000000000000000000000000000811660a0868481845afa918215610971578885928698879088966110e2575b5086929190610f98906100dc7f00000000000000000000000000000000000000000000000000000000000000006001600160801b03164261126d565b88516309169eff60e21b815292839182905afa9081156110bb5786916110c5575b50168551630455b78f60e31b815289818681855afa9081156110bb5785918b91889161109e575b5060170b89139283611036575b50505090610154610ffe9392611304565b6305f5e100948581029581870414901517156101d65783156110235750505191048152f35b634e487b7160e01b825260129052602490fd5b88516370da2f6760e01b815293509091839182905afa90811561109457610ffe939291610154918791611077575b5060170b8812919293505083895f610fed565b61108e91508b3d8d116102d1576102c381836111eb565b5f611064565b86513d87823e3d90fd5b6110b59150823d84116102d1576102c381836111eb565b5f610fe0565b87513d88823e3d90fd5b6110dc91508a3d8c1161032f5761032181836111eb565b5f610fb9565b905061110691995086929550610f98945060a03d81116103745761035c81836111eb565b929b9297939693945091929050610f5c565b633fabe5a360e21b835260a091839182905afa90811561119b5783908492611177575b506111695761114d610e10914261126d565b111561115b575f8181610f0b565b825163d15f73b560e01b8152fd5b50825162032b3d60e81b8152fd5b9050611191915060a03d81116103745761035c81836111eb565b505091505f61113b565b84513d85823e3d90fd5b8380fd5b60809060031901126111e757600435906024356001600160a01b03811681036111e757906044356001600160801b03811681036111e7579060643590565b5f80fd5b90601f8019910116810190811067ffffffffffffffff82111761120d57604052565b634e487b7160e01b5f52604160045260245ffd5b519069ffffffffffffffffffff821682036111e757565b908160a09103126111e75761124c81611221565b9160208201519160408101519161126a608060608401519301611221565b90565b9190820391821161127a57565b634e487b7160e01b5f52601160045260245ffd5b1561129557565b60405162461bcd60e51b815260206004820152600f60248201526e14dd185b19481c1c9a58d959995959608a1b6044820152606490fd5b908160209103126111e757516001600160a01b03811681036111e75790565b908160209103126111e757518060170b81036111e75790565b1561130b57565b60405162461bcd60e51b815260206004820152600f60248201526e1b5a5b8bdb585e081c995858da1959608a1b6044820152606490fd5b1561134957565b60405162461bcd60e51b8152602060048201526019602482015278105b9cddd95c8819da5d995b881899599bdc99481c9bdd5b99603a1b6044820152606490fd5b8181029291811591840414171561127a57565b908160209103126111e7575160ff811681036111e75790565b60ff16604d811161127a57600a0a90565b604d811161127a57600a0a90565b9081518110156113e6570160200190565b634e487b7160e01b5f52603260045260245ffd5b60408051633942720b60e11b8152915f9160049183908590849082906001600160a01b03165afa9384156115935783946114d8575b508051908082019082821067ffffffffffffffff8311176114c557526003938482526208aa8960eb1b6020830152835b85811061147157505050505050600190565b6001600160f81b03198061148583856113d5565b51169061149283866113d5565b5116036114bc575f1981146114a95760010161145f565b634e487b7160e01b855260118452602485fd5b50505050905090565b634e487b7160e01b855260418452602485fd5b9093503d8084833e6114ea81836111eb565b810190602090818184031261158f57805167ffffffffffffffff9182821161158b570183601f8201121561157457805191821161157857865193611537601f8401601f19168501866111eb565b8285528383830101116115745790859291835b82811061155e57505083010152925f61142f565b818101840151868201850152879450830161154a565b8580fd5b634e487b7160e01b865260418552602486fd5b8680fd5b8480fd5b81513d85823e3d90fd5b915f19828409928281029283808610950394808603951461160f57848311156111e75782910981805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b5050809250156111e7570490565b92919061162b82828661159d565b938215611649570961163957565b905f198110156111e75760010190565b634e487b7160e01b5f52601260045260245ffdfea2646970667358221220d6c87daf20ce2494d50abd36a9e3b7f4c697071e5ea7cb1fee860f8897e2b86664736f6c63430008140033000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040818152600480361015610014575f80fd5b5f92833560e01c90816339fc721114610eda575080633ac2ba2614610c515780637375416f146109c65780639b0a897614610982578063e0d380e5146106b1578063e47476411461041a5763f3aee97d1461006d575f80fd5b346104165761007b366111a9565b93929060018060a09894981b0396848885541680610385575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879588918994610336575b506100e391906100dc906001600160801b03164261126d565b111561128e565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610309575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b916102e2575b5060170b8813908161025f575b509161016b916101546101709594611304565b69ffffffffffffffffffff80911691161015611342565b6113fa565b1561022057885163313ce56760e01b815292839182905afa908115610216576101ac9392916101a69186916101e9575b506113b6565b9161161d565b925b60120391601283116101d6575050906101c96101cf926113c7565b9061138a565b9051908152f35b634e487b7160e01b825260119052602490fd5b61020991508a3d8c1161020f575b61020181836111eb565b81019061139d565b5f6101a0565b503d6101f7565b87513d86823e3d90fd5b885163313ce56760e01b815293949392839182905afa908115610216576102599392916102539186916101e957506113b6565b9061161d565b926101ae565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610170936101548f979461016b948d916102ab575b5060170b8a12929495505091610141565b6102cb9150893d8b116102d1575b6102c381836111eb565b8101906112eb565b5f61029a565b503d6102b9565b8b513d8a823e3d90fd5b6102f99150873d89116102d1576102c381836111eb565b5f610134565b8c513d8b823e3d90fd5b61032991508d803d1061032f575b61032181836111eb565b8101906112cc565b5f610108565b503d610317565b9093506100dc96506100e39250610364915060a03d8111610374575b61035c81836111eb565b810190611238565b92989295939450929190506100c3565b503d610352565b89513d88823e3d90fd5b60a090895192838092633fabe5a360e21b82525afa90811561040c57859086926103e8575b506103d9576103bc610e10914261126d565b11156103c957845f610094565b865163d15f73b560e01b81528590fd5b875162032b3d60e81b81528690fd5b9050610402915060a03d81116103745761035c81836111eb565b505091505f6103aa565b88513d87823e3d90fd5b8280fd5b503461041657610429366111a9565b86546001600160a01b03979195949193908590891680610649575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879688918994610614575b5061048c91906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff5789916105f7575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b916105da575b5060170b89139081610571575b509161016b916101546104fd9594611304565b1561053857885163313ce56760e01b815292839182905afa908115610216576101ac9392916105329186916101e957506113b6565b9061159d565b885163313ce56760e01b815293949392839182905afa9081156102165761025993929161056b9186916101e957506113b6565b9161159d565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d8578995936104fd936101548f979461016b948d916105bd575b5060170b8b129294955050916104ea565b6105d49150893d8b116102d1576102c381836111eb565b5f6105ac565b6105f19150873d89116102d1576102c381836111eb565b5f6104dd565b61060e91508d803d1061032f5761032181836111eb565b5f6104b1565b9093506100dc975061048c9250610639915060a03d81116103745761035c81836111eb565b9299929593945092919050610473565b60a090895192838092633fabe5a360e21b82525afa90811561040c578590869261068d575b506103d957610680610e10914261126d565b11156103c957845f610444565b90506106a7915060a03d81116103745761035c81836111eb565b505091505f61066e565b50913461097f576020928360031936011261097b5781546001600160a01b039082908216806108eb575b50508351633fabe5a360e21b8152927f000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d82169060a0858581855afa9283156108df578782938397849085976108a9575b5087929190610767906100dc7f00000000000000000000000000000000000000000000000000000000000151806001600160801b03164261126d565b89516309169eff60e21b815292839182905afa90811561089f578391610882575b5016908651630455b78f60e31b815288818781865afa90811561087857908991839161085b575b5060170b871392836107e4575b50876305f5e1006107dc89896107d68a8a6101548b611304565b3561138a565b049051908152f35b88516370da2f6760e01b81529293508290879082905afa91821561085057926101546107d6936305f5e1009896936107dc989691610833575b5060170b861293508295975089919496506107bc565b61084a91508b3d8d116102d1576102c381836111eb565b5f61081d565b8751903d90823e3d90fd5b6108729150823d84116102d1576102c381836111eb565b5f6107af565b88513d84823e3d90fd5b6108999150893d8b1161032f5761032181836111eb565b5f610788565b88513d85823e3d90fd5b90506108cd91985087929650610767955060a03d81116103745761035c81836111eb565b929a929893979394509192905061072b565b508551903d90823e3d90fd5b60a090865192838092633fabe5a360e21b82525afa908115610971578490859261094d575b5061093e57610922610e10914261126d565b111561092f57815f6106db565b50825163d15f73b560e01b8152fd5b845162032b3d60e81b81528390fd5b9050610967915060a03d81116103745761035c81836111eb565b505091505f610910565b85513d86823e3d90fd5b5080fd5b80fd5b50503461097b578160031936011261097b57517f000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d6001600160a01b03168152602090f35b5034610416576109d5366111a9565b86546001600160a01b03979195949193908590891680610be9575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879688918994610bb4575b50610a3891906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610b97575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b91610b7a575b5060170b89139081610b11575b509161016b91610154610aa99594611304565b15610ade57885163313ce56760e01b815292839182905afa908115610216576101ac9392916102539186916101e957506113b6565b885163313ce56760e01b815293949392839182905afa908115610216576102599392916101a69186916101e957506113b6565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610aa9936101548f979461016b948d91610b5d575b5060170b8b12929495505091610a96565b610b749150893d8b116102d1576102c381836111eb565b5f610b4c565b610b919150873d89116102d1576102c381836111eb565b5f610a89565b610bae91508d803d1061032f5761032181836111eb565b5f610a5d565b9093506100dc9750610a389250610bd9915060a03d81116103745761035c81836111eb565b9299929593945092919050610a1f565b60a090895192838092633fabe5a360e21b82525afa90811561040c5785908692610c2d575b506103d957610c20610e10914261126d565b11156103c957845f6109f0565b9050610c47915060a03d81116103745761035c81836111eb565b505091505f610c0e565b503461041657610c60366111a9565b93929060018060a09894981b0396848885541680610e72575b50508651633fabe5a360e21b8152818916919060a0818881865afa90811561037b578690879588918994610e3d575b50610cc191906100dc906001600160801b03164261126d565b89516309169eff60e21b815260209b908c818b81895afa9081156102ff578991610e20575b50168a51630455b78f60e31b81528c818b81855afa9081156102ff57918d9593918b9795938b91610e03575b5060170b88139081610d9a575b509161016b91610154610d329594611304565b15610d6757885163313ce56760e01b815292839182905afa908115610216576101ac93929161056b9186916101e957506113b6565b885163313ce56760e01b815293949392839182905afa908115610216576102599392916105329186916101e957506113b6565b90508c969294969591939551928380926370da2f6760e01b82525afa9081156102d857899593610d32936101548f979461016b948d91610de6575b5060170b8a12929495505091610d1f565b610dfd9150893d8b116102d1576102c381836111eb565b5f610dd5565b610e1a9150873d89116102d1576102c381836111eb565b5f610d12565b610e3791508d803d1061032f5761032181836111eb565b5f610ce6565b9093506100dc9650610cc19250610e62915060a03d81116103745761035c81836111eb565b9298929593945092919050610ca8565b60a090895192838092633fabe5a360e21b82525afa90811561040c5785908692610eb6575b506103d957610ea9610e10914261126d565b11156103c957845f610c79565b9050610ed0915060a03d81116103745761035c81836111eb565b505091505f610e97565b91929050346111a5576020938460031936011261097f5780548435946001600160a01b039490918290861680611118575b50508351633fabe5a360e21b81529490507f000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d811660a0868481845afa918215610971578885928698879088966110e2575b5086929190610f98906100dc7f00000000000000000000000000000000000000000000000000000000000151806001600160801b03164261126d565b88516309169eff60e21b815292839182905afa9081156110bb5786916110c5575b50168551630455b78f60e31b815289818681855afa9081156110bb5785918b91889161109e575b5060170b89139283611036575b50505090610154610ffe9392611304565b6305f5e100948581029581870414901517156101d65783156110235750505191048152f35b634e487b7160e01b825260129052602490fd5b88516370da2f6760e01b815293509091839182905afa90811561109457610ffe939291610154918791611077575b5060170b8812919293505083895f610fed565b61108e91508b3d8d116102d1576102c381836111eb565b5f611064565b86513d87823e3d90fd5b6110b59150823d84116102d1576102c381836111eb565b5f610fe0565b87513d88823e3d90fd5b6110dc91508a3d8c1161032f5761032181836111eb565b5f610fb9565b905061110691995086929550610f98945060a03d81116103745761035c81836111eb565b929b9297939693945091929050610f5c565b633fabe5a360e21b835260a091839182905afa90811561119b5783908492611177575b506111695761114d610e10914261126d565b111561115b575f8181610f0b565b825163d15f73b560e01b8152fd5b50825162032b3d60e81b8152fd5b9050611191915060a03d81116103745761035c81836111eb565b505091505f61113b565b84513d85823e3d90fd5b8380fd5b60809060031901126111e757600435906024356001600160a01b03811681036111e757906044356001600160801b03811681036111e7579060643590565b5f80fd5b90601f8019910116810190811067ffffffffffffffff82111761120d57604052565b634e487b7160e01b5f52604160045260245ffd5b519069ffffffffffffffffffff821682036111e757565b908160a09103126111e75761124c81611221565b9160208201519160408101519161126a608060608401519301611221565b90565b9190820391821161127a57565b634e487b7160e01b5f52601160045260245ffd5b1561129557565b60405162461bcd60e51b815260206004820152600f60248201526e14dd185b19481c1c9a58d959995959608a1b6044820152606490fd5b908160209103126111e757516001600160a01b03811681036111e75790565b908160209103126111e757518060170b81036111e75790565b1561130b57565b60405162461bcd60e51b815260206004820152600f60248201526e1b5a5b8bdb585e081c995858da1959608a1b6044820152606490fd5b1561134957565b60405162461bcd60e51b8152602060048201526019602482015278105b9cddd95c8819da5d995b881899599bdc99481c9bdd5b99603a1b6044820152606490fd5b8181029291811591840414171561127a57565b908160209103126111e7575160ff811681036111e75790565b60ff16604d811161127a57600a0a90565b604d811161127a57600a0a90565b9081518110156113e6570160200190565b634e487b7160e01b5f52603260045260245ffd5b60408051633942720b60e11b8152915f9160049183908590849082906001600160a01b03165afa9384156115935783946114d8575b508051908082019082821067ffffffffffffffff8311176114c557526003938482526208aa8960eb1b6020830152835b85811061147157505050505050600190565b6001600160f81b03198061148583856113d5565b51169061149283866113d5565b5116036114bc575f1981146114a95760010161145f565b634e487b7160e01b855260118452602485fd5b50505050905090565b634e487b7160e01b855260418452602485fd5b9093503d8084833e6114ea81836111eb565b810190602090818184031261158f57805167ffffffffffffffff9182821161158b570183601f8201121561157457805191821161157857865193611537601f8401601f19168501866111eb565b8285528383830101116115745790859291835b82811061155e57505083010152925f61142f565b818101840151868201850152879450830161154a565b8580fd5b634e487b7160e01b865260418552602486fd5b8680fd5b8480fd5b81513d85823e3d90fd5b915f19828409928281029283808610950394808603951461160f57848311156111e75782910981805f0316809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b5050809250156111e7570490565b92919061162b82828661159d565b938215611649570961163957565b905f198110156111e75760010190565b634e487b7160e01b5f52601260045260245ffdfea2646970667358221220d6c87daf20ce2494d50abd36a9e3b7f4c697071e5ea7cb1fee860f8897e2b86664736f6c63430008140033

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

000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _pricefeedETH_USD (address): 0xc76dFb89fF298145b417d221B2c747d84952e01d
Arg [1] : _chainlink_heartbeatETH_USD (uint128): 86400
Arg [2] : _uptimeFeedAddress (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c76dfb89ff298145b417d221b2c747d84952e01d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


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.