S Price: $0.554422 (+0.96%)

Contract

0x19b6e78771305876F5FDA5B52a3F60820a109139

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update75674662025-02-12 17:57:122 days ago1739383032IN
0x19b6e787...20a109139
0 S0.0049373266
Update69340342025-02-07 19:10:197 days ago1738955419IN
0x19b6e787...20a109139
0 S0.0081622755.01
Update68391282025-02-06 22:18:338 days ago1738880313IN
0x19b6e787...20a109139
0 S0.0081622755.01
Update68088062025-02-06 16:48:008 days ago1738860480IN
0x19b6e787...20a109139
0 S0.0049373266

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

Contract Source Code Verified (Exact Match)

Contract Name:
Oracle

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 6 : Oracle.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./shadow/interfaces/IPool.sol";
import "./owner/Operator.sol";

contract Oracle is Operator {
    using SafeMath for uint256;

    address public token0;
    address public token1;
    IPool public pair;

    constructor(IPool _pair) public {
        pair = _pair;
        token0 = pair.token0();
        token1 = pair.token1();
        uint256 reserve0;
        uint256 reserve1;
        (reserve0, reserve1, ) = pair.getReserves();
        require(reserve0 != 0 && reserve1 != 0, "Oracle: No reserves");
    }

    function update() external {
        pair.sync();
    }

    function consult(
        address _token,
        uint256 _amountIn
    ) external view returns (uint256 amountOut) {
        if (_token == token0) {
            amountOut = _quote(_token, _amountIn, 12, 1);
        } else {
            require(_token == token1, "Oracle: Invalid token");
            amountOut = _quote(_token, _amountIn, 12, 1);
        }
    }

    function twap(
        address _token,
        uint256 _amountIn
    ) external view returns (uint256 amountOut) {
        if (_token == token0) {
            amountOut = _quote(_token, _amountIn, 2, 1);
        } else if (_token == token1) {
            amountOut = _quote(_token, _amountIn, 2, 1);
        }
    }

    function _quote(
        address tokenIn,
        uint256 amountIn,
        uint256 granularity,
        uint256 window
    ) internal view returns (uint256 amountOut) {
        uint256 observationLength = IPool(pair).observationLength();
        require(
            granularity <= observationLength,
            "Oracle: Not enough observations"
        );

        uint256 totalRatio = 0;
        address tkn = tokenIn;

        for (uint256 i = 1; i <= granularity; i++) {
            (
                uint256 timestamp,
                uint256 cumulative0,
                uint256 cumulative1
            ) = IPool(pair).observations(observationLength - i);

            (
                uint256 prevTimestamp,
                uint256 prevCumulative0,
                uint256 prevCumulative1
            ) = IPool(pair).observations(observationLength - i - 1);

            uint256 timeElapsed = timestamp - prevTimestamp;

            uint256 reserve0 = (cumulative0 - prevCumulative0) / timeElapsed;
            uint256 reserve1 = (cumulative1 - prevCumulative1) / timeElapsed;

            uint256 ratio = tkn == token0
                ? (reserve1 * 10 ** 18) / reserve0
                : (reserve0 * 10 ** 18) / reserve1;

            totalRatio += ratio;
        }

        // Calculate the average ratio
        uint256 averageRatio = totalRatio / granularity;

        // Set the output amount based on the average ratio
        amountOut = averageRatio;
    }
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 6 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 5 of 6 : Operator.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);

    constructor() {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(newOperator_ != address(0), "operator: zero address given for new operator");
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }

    function _renounceOperator() public onlyOwner {
        emit OperatorTransferred(_operator, address(0));
        _operator = address(0);
    }
}

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

interface IPool {
    error DepositsNotEqual();
    error BelowMinimumK();
    error FactoryAlreadySet();
    error InsufficientLiquidity();
    error InsufficientLiquidityMinted();
    error InsufficientLiquidityBurned();
    error InsufficientOutputAmount();
    error InsufficientInputAmount();
    error IsPaused();
    error InvalidTo();
    error K();
    error NotEmergencyCouncil();

    event Fees(address indexed sender, uint256 amount0, uint256 amount1);
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, address indexed to, uint256 amount0, uint256 amount1);
    event Swap(
        address indexed sender,
        address indexed to,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out
    );
    event Sync(uint256 reserve0, uint256 reserve1);
    event Claim(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1);

    // Struct to capture time period obervations every 30 minutes, used for local oracles
    struct Observation {
        uint256 timestamp;
        uint256 reserve0Cumulative;
        uint256 reserve1Cumulative;
    }

    /// @notice Returns the decimal (dec), reserves (r), stable (st), and tokens (t) of token0 and token1
    function metadata()
        external
        view
        returns (uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1);

    /// @notice Claim accumulated but unclaimed fees (claimable0 and claimable1)
    function claimFees() external returns (uint256, uint256);

    /// @notice Returns [token0, token1]
    function tokens() external view returns (address, address);

    /// @notice Address of token in the pool with the lower address value
    function token0() external view returns (address);

    /// @notice Address of token in the poool with the higher address value
    function token1() external view returns (address);

    /// @notice Address of linked PoolFees.sol
    function poolFees() external view returns (address);

    /// @notice Address of PoolFactory that created this contract
    function factory() external view returns (address);

    /// @notice Capture oracle reading every 30 minutes (1800 seconds)
    function periodSize() external view returns (uint256);

    /// @notice Amount of token0 in pool
    function reserve0() external view returns (uint256);

    /// @notice Amount of token1 in pool
    function reserve1() external view returns (uint256);

    /// @notice Timestamp of last update to pool
    function blockTimestampLast() external view returns (uint256);

    /// @notice Cumulative of reserve0 factoring in time elapsed
    function reserve0CumulativeLast() external view returns (uint256);

    /// @notice Cumulative of reserve1 factoring in time elapsed
    function reserve1CumulativeLast() external view returns (uint256);

    /// @notice Accumulated fees of token0 (global)
    function index0() external view returns (uint256);

    /// @notice Accumulated fees of token1 (global)
    function index1() external view returns (uint256);

    /// @notice Get an LP's relative index0 to index0
    function supplyIndex0(address) external view returns (uint256);

    /// @notice Get an LP's relative index1 to index1
    function supplyIndex1(address) external view returns (uint256);

    /// @notice Amount of unclaimed, but claimable tokens from fees of token0 for an LP
    function claimable0(address) external view returns (uint256);

    /// @notice Amount of unclaimed, but claimable tokens from fees of token1 for an LP
    function claimable1(address) external view returns (uint256);

    /// @notice Returns the value of K in the Pool, based on its reserves.
    function getK() external returns (uint256);

    /// @notice Set pool name
    ///         Only callable by Voter.emergencyCouncil()
    /// @param __name String of new name
    function setName(string calldata __name) external;

    /// @notice Set pool symbol
    ///         Only callable by Voter.emergencyCouncil()
    /// @param __symbol String of new symbol
    function setSymbol(string calldata __symbol) external;

    /// @notice Get the number of observations recorded
    function observationLength() external view returns (uint256);

    /// @notice Get the value of the most recent observation
    function lastObservation() external view returns (Observation memory);

    /// @notice True if pool is stable, false if volatile
    function stable() external view returns (bool);

    /// @notice Produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices()
        external
        view
        returns (uint256 reserve0Cumulative, uint256 reserve1Cumulative, uint256 blockTimestamp);

    /// @notice Provides twap price with user configured granularity, up to the full window size
    /// @param tokenIn .
    /// @param amountIn .
    /// @param granularity .
    /// @return amountOut .
    function quote(address tokenIn, uint256 amountIn, uint256 granularity) external view returns (uint256 amountOut);

    /// @notice Returns a memory set of TWAP prices
    ///         Same as calling sample(tokenIn, amountIn, points, 1)
    /// @param tokenIn .
    /// @param amountIn .
    /// @param points Number of points to return
    /// @return Array of TWAP prices
    function prices(address tokenIn, uint256 amountIn, uint256 points) external view returns (uint256[] memory);

    /// @notice Same as prices with with an additional window argument.
    ///         Window = 2 means 2 * 30min (or 1 hr) between observations
    /// @param tokenIn .
    /// @param amountIn .
    /// @param points .
    /// @param window .
    /// @return Array of TWAP prices
    function sample(
        address tokenIn,
        uint256 amountIn,
        uint256 points,
        uint256 window
    ) external view returns (uint256[] memory);

    /// @notice This low-level function should be called from a contract which performs important safety checks
    /// @param amount0Out   Amount of token0 to send to `to`
    /// @param amount1Out   Amount of token1 to send to `to`
    /// @param to           Address to recieve the swapped output
    /// @param data         Additional calldata for flashloans
    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;

    /// @notice This low-level function should be called from a contract which performs important safety checks
    ///         standard uniswap v2 implementation
    /// @param to Address to receive token0 and token1 from burning the pool token
    /// @return amount0 Amount of token0 returned
    /// @return amount1 Amount of token1 returned
    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    /// @notice This low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks
    ///         standard uniswap v2 implementation
    /// @param to           Address to receive the minted LP token
    /// @return liquidity   Amount of LP token minted
    function mint(address to) external returns (uint256 liquidity);

    /// @notice Update reserves and, on the first call per block, price accumulators
    /// @return _reserve0 .
    /// @return _reserve1 .
    /// @return _blockTimestampLast .
    function getReserves() external view returns (uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast);

    /// @notice Get the amount of tokenOut given the amount of tokenIn
    /// @param amountIn Amount of token in
    /// @param tokenIn  Address of token
    /// @return Amount out
    function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256);

    /// @notice Force balances to match reserves
    /// @param to Address to receive any skimmed rewards
    function skim(address to) external;

    /// @notice Force reserves to match balances
    function sync() external;

    /// @notice Called on pool creation by PoolFactory
    /// @param _token0 Address of token0
    /// @param _token1 Address of token1
    /// @param _stable True if stable, false if volatile
    function initialize(address _token0, address _token1, bool _stable) external;

    function observations(uint256 index) external view returns (uint256 timestamp, uint256 reserve0Cumulative, uint256 reserve1Cumulative);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IPool","name":"_pair","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"_renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"consult","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"twap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051610ce5380380610ce583398101604081905261002f916102cc565b61003833610264565b600180546001600160a01b031916339081179091556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600480546001600160a01b0319166001600160a01b038316908117825560408051630dfe168160e01b815290519192630dfe16819282820192602092908290030181865afa1580156100ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f291906102cc565b600280546001600160a01b0319166001600160a01b03928316179055600480546040805163d21220a760e01b81529051919093169263d21220a792818101926020929091908290030181865afa158015610150573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017491906102cc565b600380546001600160a01b0319166001600160a01b039283161790556004805460408051630240bc6b60e21b815290516000948594931692630902f1ac928082019260609290918290030181865afa1580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f891906102f0565b509092509050811580159061020c57508015155b61025c5760405162461bcd60e51b815260206004820152601360248201527f4f7261636c653a204e6f20726573657276657300000000000000000000000000604482015260640160405180910390fd5b50505061031e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146102c957600080fd5b50565b6000602082840312156102de57600080fd5b81516102e9816102b4565b9392505050565b60008060006060848603121561030557600080fd5b5050815160208301516040909301519094929350919050565b6109b88061032d6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063715018a61161008c578063a2e6204511610066578063a2e620451461019d578063a8aa1b31146101a5578063d21220a7146101b8578063f2fde38b146101cb57600080fd5b8063715018a61461017c5780638a27f103146101845780638da5cb5b1461018c57600080fd5b80630dfe1681146100d457806329605e77146101045780633ddac953146101195780634456eda21461013a578063570ca735146101585780636808a12814610169575b600080fd5b6002546100e7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610117610112366004610868565b6101de565b005b61012c610127366004610883565b6101f2565b6040519081526020016100fb565b6001546001600160a01b0316331460405190151581526020016100fb565b6001546001600160a01b03166100e7565b61012c610177366004610883565b610291565b6101176102dc565b6101176102f0565b6000546001600160a01b03166100e7565b610117610342565b6004546100e7906001600160a01b031681565b6003546100e7906001600160a01b031681565b6101176101d9366004610868565b6103a2565b6101e6610418565b6101ef81610472565b50565b6002546000906001600160a01b0390811690841603610220576102198383600c6001610536565b905061028b565b6003546001600160a01b0384811691161461027a5760405162461bcd60e51b815260206004820152601560248201527427b930b1b6329d1024b73b30b634b2103a37b5b2b760591b60448201526064015b60405180910390fd5b6102888383600c6001610536565b90505b92915050565b6002546000906001600160a01b03908116908416036102b857610219838360026001610536565b6003546001600160a01b039081169084160361028b57610288838360026001610536565b6102e4610418565b6102ee60006107fc565b565b6102f8610418565b6001546040516000916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600180546001600160a01b0319169055565b600480546040805160016209351760e01b0319815290516001600160a01b039092169263fff6cae992828201926000929082900301818387803b15801561038857600080fd5b505af115801561039c573d6000803e3d6000fd5b50505050565b6103aa610418565b6001600160a01b03811661040f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610271565b6101ef816107fc565b6000546001600160a01b031633146102ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610271565b6001600160a01b0381166104de5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610271565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600480546040805163ebeb31db60e01b8152905160009384936001600160a01b03169263ebeb31db92818301926020928290030181865afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a391906108ad565b9050808411156105f55760405162461bcd60e51b815260206004820152601f60248201527f4f7261636c653a204e6f7420656e6f756768206f62736572766174696f6e73006044820152606401610271565b60008660015b8681116107e257600454600090819081906001600160a01b031663252c09d7610624868a6108dc565b6040518263ffffffff1660e01b815260040161064291815260200190565b606060405180830381865afa15801561065f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068391906108ef565b6004549295509093509150600090819081906001600160a01b031663252c09d760016106af8a8e6108dc565b6106b991906108dc565b6040518263ffffffff1660e01b81526004016106d791815260200190565b606060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071891906108ef565b91945092509050600061072b84886108dc565b905060008161073a85896108dc565b610744919061091d565b905060008261075385896108dc565b61075d919061091d565b6002549091506000906001600160a01b038d811691161461079a578161078b84670de0b6b3a764000061093f565b610795919061091d565b6107b7565b826107ad83670de0b6b3a764000061093f565b6107b7919061091d565b90506107c3818e610956565b9c505050505050505050505080806107da90610969565b9150506105fb565b5060006107ef878461091d565b9998505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461086357600080fd5b919050565b60006020828403121561087a57600080fd5b6102888261084c565b6000806040838503121561089657600080fd5b61089f8361084c565b946020939093013593505050565b6000602082840312156108bf57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561028b5761028b6108c6565b60008060006060848603121561090457600080fd5b5050815160208301516040909301519094929350919050565b60008261093a57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761028b5761028b6108c6565b8082018082111561028b5761028b6108c6565b60006001820161097b5761097b6108c6565b506001019056fea2646970667358221220669c952d2f2e21e36c58a90c4042ace091dd5239e6cf1256d8a248332e7db6e964736f6c634300081a0033000000000000000000000000287c6882de298665977787e268f3dba052a6e251

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063715018a61161008c578063a2e6204511610066578063a2e620451461019d578063a8aa1b31146101a5578063d21220a7146101b8578063f2fde38b146101cb57600080fd5b8063715018a61461017c5780638a27f103146101845780638da5cb5b1461018c57600080fd5b80630dfe1681146100d457806329605e77146101045780633ddac953146101195780634456eda21461013a578063570ca735146101585780636808a12814610169575b600080fd5b6002546100e7906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610117610112366004610868565b6101de565b005b61012c610127366004610883565b6101f2565b6040519081526020016100fb565b6001546001600160a01b0316331460405190151581526020016100fb565b6001546001600160a01b03166100e7565b61012c610177366004610883565b610291565b6101176102dc565b6101176102f0565b6000546001600160a01b03166100e7565b610117610342565b6004546100e7906001600160a01b031681565b6003546100e7906001600160a01b031681565b6101176101d9366004610868565b6103a2565b6101e6610418565b6101ef81610472565b50565b6002546000906001600160a01b0390811690841603610220576102198383600c6001610536565b905061028b565b6003546001600160a01b0384811691161461027a5760405162461bcd60e51b815260206004820152601560248201527427b930b1b6329d1024b73b30b634b2103a37b5b2b760591b60448201526064015b60405180910390fd5b6102888383600c6001610536565b90505b92915050565b6002546000906001600160a01b03908116908416036102b857610219838360026001610536565b6003546001600160a01b039081169084160361028b57610288838360026001610536565b6102e4610418565b6102ee60006107fc565b565b6102f8610418565b6001546040516000916001600160a01b0316907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600180546001600160a01b0319169055565b600480546040805160016209351760e01b0319815290516001600160a01b039092169263fff6cae992828201926000929082900301818387803b15801561038857600080fd5b505af115801561039c573d6000803e3d6000fd5b50505050565b6103aa610418565b6001600160a01b03811661040f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610271565b6101ef816107fc565b6000546001600160a01b031633146102ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610271565b6001600160a01b0381166104de5760405162461bcd60e51b815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201526c103732bb9037b832b930ba37b960991b6064820152608401610271565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600480546040805163ebeb31db60e01b8152905160009384936001600160a01b03169263ebeb31db92818301926020928290030181865afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a391906108ad565b9050808411156105f55760405162461bcd60e51b815260206004820152601f60248201527f4f7261636c653a204e6f7420656e6f756768206f62736572766174696f6e73006044820152606401610271565b60008660015b8681116107e257600454600090819081906001600160a01b031663252c09d7610624868a6108dc565b6040518263ffffffff1660e01b815260040161064291815260200190565b606060405180830381865afa15801561065f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068391906108ef565b6004549295509093509150600090819081906001600160a01b031663252c09d760016106af8a8e6108dc565b6106b991906108dc565b6040518263ffffffff1660e01b81526004016106d791815260200190565b606060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071891906108ef565b91945092509050600061072b84886108dc565b905060008161073a85896108dc565b610744919061091d565b905060008261075385896108dc565b61075d919061091d565b6002549091506000906001600160a01b038d811691161461079a578161078b84670de0b6b3a764000061093f565b610795919061091d565b6107b7565b826107ad83670de0b6b3a764000061093f565b6107b7919061091d565b90506107c3818e610956565b9c505050505050505050505080806107da90610969565b9150506105fb565b5060006107ef878461091d565b9998505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461086357600080fd5b919050565b60006020828403121561087a57600080fd5b6102888261084c565b6000806040838503121561089657600080fd5b61089f8361084c565b946020939093013593505050565b6000602082840312156108bf57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561028b5761028b6108c6565b60008060006060848603121561090457600080fd5b5050815160208301516040909301519094929350919050565b60008261093a57634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761028b5761028b6108c6565b8082018082111561028b5761028b6108c6565b60006001820161097b5761097b6108c6565b506001019056fea2646970667358221220669c952d2f2e21e36c58a90c4042ace091dd5239e6cf1256d8a248332e7db6e964736f6c634300081a0033

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

000000000000000000000000287c6882de298665977787e268f3dba052a6e251

-----Decoded View---------------
Arg [0] : _pair (address): 0x287c6882dE298665977787e268f3dba052A6e251

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000287c6882de298665977787e268f3dba052a6e251


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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.