ETH Price: $3,245.50 (-0.41%)
Gas: 1 Gwei

Contract

0x6A81BE7f5C868f34F109D5b5f38Ed67f3395f7B0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Force Update Vad...152939312022-08-07 7:52:13720 days ago1659858733IN
0x6A81BE7f...f3395f7B0
0 ETH0.000182013
Force Update Vad...152304852022-07-28 10:28:28730 days ago1659004108IN
0x6A81BE7f...f3395f7B0
0 ETH0.000424697
Force Update Vad...149993952022-06-21 0:00:20768 days ago1655769620IN
0x6A81BE7f...f3395f7B0
0 ETH0.0006673811
Force Update Vad...149631442022-06-14 18:21:21774 days ago1655230881IN
0x6A81BE7f...f3395f7B0
0 ETH0.0020628134
Force Update Vad...149572642022-06-13 17:43:23775 days ago1655142203IN
0x6A81BE7f...f3395f7B0
0 ETH0.0032155653
Force Update Vad...149559322022-06-13 12:11:37775 days ago1655122297IN
0x6A81BE7f...f3395f7B0
0 ETH0.0053997189
Force Update Vad...149557252022-06-13 11:20:47775 days ago1655119247IN
0x6A81BE7f...f3395f7B0
0 ETH0.00612777101
Force Update Vad...149521732022-06-12 20:43:28776 days ago1655066608IN
0x6A81BE7f...f3395f7B0
0 ETH0.001880831
Force Update Vad...149515672022-06-12 18:11:00776 days ago1655057460IN
0x6A81BE7f...f3395f7B0
0 ETH0.0020021433
Force Update Vad...149514732022-06-12 17:48:05776 days ago1655056085IN
0x6A81BE7f...f3395f7B0
0 ETH0.0013347622
Force Update Vad...149513732022-06-12 17:26:38776 days ago1655054798IN
0x6A81BE7f...f3395f7B0
0 ETH0.001880831
Force Update Vad...149513092022-06-12 17:11:34776 days ago1655053894IN
0x6A81BE7f...f3395f7B0
0 ETH0.0022448237
Force Update Vad...149512112022-06-12 16:45:22776 days ago1655052322IN
0x6A81BE7f...f3395f7B0
0 ETH0.0032155653
Force Update Vad...149511412022-06-12 16:28:52776 days ago1655051332IN
0x6A81BE7f...f3395f7B0
0 ETH0.0028515347
Force Update Vad...149508682022-06-12 15:22:02776 days ago1655047322IN
0x6A81BE7f...f3395f7B0
0 ETH0.0036402660
Force Update Vad...149507902022-06-12 15:02:47776 days ago1655046167IN
0x6A81BE7f...f3395f7B0
0 ETH0.0044289873
Force Update Vad...149498682022-06-12 11:19:55776 days ago1655032795IN
0x6A81BE7f...f3395f7B0
0 ETH0.0015167725
Force Update Vad...149496302022-06-12 10:22:27776 days ago1655029347IN
0x6A81BE7f...f3395f7B0
0 ETH0.0013347622
Force Update Vad...149495692022-06-12 10:07:13776 days ago1655028433IN
0x6A81BE7f...f3395f7B0
0 ETH0.0012134220
Force Update Vad...149452462022-06-11 16:24:47777 days ago1654964687IN
0x6A81BE7f...f3395f7B0
0 ETH0.0038829464
Force Update Vad...149451892022-06-11 16:09:30777 days ago1654963770IN
0x6A81BE7f...f3395f7B0
0 ETH0.001907759
Force Update Vad...149451232022-06-11 15:54:36777 days ago1654962876IN
0x6A81BE7f...f3395f7B0
0 ETH0.005642493
Force Update Vad...149440452022-06-11 11:36:21777 days ago1654947381IN
0x6A81BE7f...f3395f7B0
0 ETH0.0023054938
Force Update Vad...149439812022-06-11 11:21:06777 days ago1654946466IN
0x6A81BE7f...f3395f7B0
0 ETH0.0012933640
Force Update Vad...149439312022-06-11 11:06:10777 days ago1654945570IN
0x6A81BE7f...f3395f7B0
0 ETH0.0018201330
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
160037512022-11-19 11:25:59616 days ago1668857159
0x6A81BE7f...f3395f7B0
0 ETH
160037512022-11-19 11:25:59616 days ago1668857159
0x6A81BE7f...f3395f7B0
0 ETH
160037512022-11-19 11:25:59616 days ago1668857159
0x6A81BE7f...f3395f7B0
0 ETH
160037512022-11-19 11:25:59616 days ago1668857159
0x6A81BE7f...f3395f7B0
0 ETH
160037512022-11-19 11:25:59616 days ago1668857159
0x6A81BE7f...f3395f7B0
0 ETH
160032942022-11-19 9:54:11616 days ago1668851651
0x6A81BE7f...f3395f7B0
0 ETH
160032942022-11-19 9:54:11616 days ago1668851651
0x6A81BE7f...f3395f7B0
0 ETH
160032942022-11-19 9:54:11616 days ago1668851651
0x6A81BE7f...f3395f7B0
0 ETH
160032942022-11-19 9:54:11616 days ago1668851651
0x6A81BE7f...f3395f7B0
0 ETH
160032942022-11-19 9:54:11616 days ago1668851651
0x6A81BE7f...f3395f7B0
0 ETH
152939312022-08-07 7:52:13720 days ago1659858733
0x6A81BE7f...f3395f7B0
0 ETH
152939312022-08-07 7:52:13720 days ago1659858733
0x6A81BE7f...f3395f7B0
0 ETH
152939312022-08-07 7:52:13720 days ago1659858733
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152471192022-07-31 0:50:11728 days ago1659228611
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
152404792022-07-29 23:58:57729 days ago1659139137
0x6A81BE7f...f3395f7B0
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapTwap

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-14
*/

// hevm: flattened sources of src/UniswapTwap.sol
// SPDX-License-Identifier: MIT AND GPL-3.0-or-later AND CC-BY-4.0
pragma solidity 0.8.9;

////// node_modules/@openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

////// node_modules/@openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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);
    }
}

////// src/interfaces/IUniswapTWAP.sol

/* pragma solidity 0.8.9; */

interface IUniswapTWAP {
    function maxUpdateWindow() external view returns (uint);

    function getVaderPrice() external returns (uint);

    function syncVaderPrice() external;
}

////// src/interfaces/chainlink/IAggregatorV3.sol

/* pragma solidity 0.8.9; */

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

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

////// src/interfaces/uniswap/IUniswapV2Pair.sol
/* pragma solidity 0.8.9; */

interface IUniswapV2Pair {
    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);
}

////// src/libraries/Babylonian.sol
/* pragma solidity 0.8.9; */

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint x) internal pure returns (uint) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint xx = x;
        uint r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint r1 = x / r;
        return (r < r1 ? r : r1);
    }
}

////// src/libraries/BitMath.sol
/* pragma solidity 0.8.9; */

library BitMath {
    // returns the 0 indexed position of the most significant bit of the input x
    // s.t. x >= 2**msb and x < 2**(msb+1)
    function mostSignificantBit(uint x) internal pure returns (uint8 r) {
        require(x > 0, "BitMath::mostSignificantBit: zero");

        if (x >= 0x100000000000000000000000000000000) {
            x >>= 128;
            r += 128;
        }
        if (x >= 0x10000000000000000) {
            x >>= 64;
            r += 64;
        }
        if (x >= 0x100000000) {
            x >>= 32;
            r += 32;
        }
        if (x >= 0x10000) {
            x >>= 16;
            r += 16;
        }
        if (x >= 0x100) {
            x >>= 8;
            r += 8;
        }
        if (x >= 0x10) {
            x >>= 4;
            r += 4;
        }
        if (x >= 0x4) {
            x >>= 2;
            r += 2;
        }
        if (x >= 0x2) r += 1;
    }

    // returns the 0 indexed position of the least significant bit of the input x
    // s.t. (x & 2**lsb) != 0 and (x & (2**(lsb) - 1)) == 0)
    // i.e. the bit at the index is set and the mask of all lower bits is 0
    function leastSignificantBit(uint x) internal pure returns (uint8 r) {
        require(x > 0, "BitMath::leastSignificantBit: zero");

        r = 255;
        if (x & type(uint128).max > 0) {
            r -= 128;
        } else {
            x >>= 128;
        }
        if (x & type(uint64).max > 0) {
            r -= 64;
        } else {
            x >>= 64;
        }
        if (x & type(uint32).max > 0) {
            r -= 32;
        } else {
            x >>= 32;
        }
        if (x & type(uint16).max > 0) {
            r -= 16;
        } else {
            x >>= 16;
        }
        if (x & type(uint8).max > 0) {
            r -= 8;
        } else {
            x >>= 8;
        }
        if (x & 0xf > 0) {
            r -= 4;
        } else {
            x >>= 4;
        }
        if (x & 0x3 > 0) {
            r -= 2;
        } else {
            x >>= 2;
        }
        if (x & 0x1 > 0) r -= 1;
    }
}

////// src/libraries/FullMath.sol
/* pragma solidity 0.8.9; */

// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1
// license is CC-BY-4.0
library FullMath {
    function fullMul(uint x, uint y) internal pure returns (uint l, uint h) {
        uint mm = mulmod(x, y, type(uint).max);
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint l,
        uint h,
        uint d
    ) private pure returns (uint) {
        uint pow2 = d & uint(-int(d));
        d /= pow2;
        l /= pow2;
        l += h * (uint(-int(pow2)) / pow2 + 1);
        uint r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint x,
        uint y,
        uint d
    ) internal pure returns (uint) {
        (uint l, uint h) = fullMul(x, y);

        uint mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, "FullMath: FULLDIV_OVERFLOW");
        return fullDiv(l, h, d);
    }
}

////// src/libraries/FixedPoint.sol
/* pragma solidity 0.8.9; */

/* import "./FullMath.sol"; */
/* import "./Babylonian.sol"; */
/* import "./BitMath.sol"; */

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
library FixedPoint {
    // range: [0, 2**112 - 1]
    // resolution: 1 / 2**112
    struct uq112x112 {
        uint224 _x;
    }

    // range: [0, 2**144 - 1]
    // resolution: 1 / 2**112
    struct uq144x112 {
        uint _x;
    }

    uint8 public constant RESOLUTION = 112;
    uint public constant Q112 = 0x10000000000000000000000000000; // 2**112
    uint private constant Q224 =
        0x100000000000000000000000000000000000000000000000000000000; // 2**224
    uint private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)

    // encode a uint112 as a UQ112x112
    function encode(uint112 x) internal pure returns (uq112x112 memory) {
        return uq112x112(uint224(x) << RESOLUTION);
    }

    // encodes a uint144 as a UQ144x112
    function encode144(uint144 x) internal pure returns (uq144x112 memory) {
        return uq144x112(uint(x) << RESOLUTION);
    }

    // decode a UQ112x112 into a uint112 by truncating after the radix point
    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    // decode a UQ144x112 into a uint144 by truncating after the radix point
    function decode144(uq144x112 memory self) internal pure returns (uint144) {
        return uint144(self._x >> RESOLUTION);
    }

    // multiply a UQ112x112 by a uint, returning a UQ144x112
    // reverts on overflow
    function mul(uq112x112 memory self, uint y)
        internal
        pure
        returns (uq144x112 memory)
    {
        uint z = 0;
        require(
            y == 0 || (z = self._x * y) / y == self._x,
            "FixedPoint::mul: overflow"
        );
        return uq144x112(z);
    }

    // multiply a UQ112x112 by an int and decode, returning an int
    // reverts on overflow
    function muli(uq112x112 memory self, int y) internal pure returns (int) {
        uint z = FullMath.mulDiv(self._x, uint(y < 0 ? -y : y), Q112);
        require(z < 2**255, "FixedPoint::muli: overflow");
        return y < 0 ? -int(z) : int(z);
    }

    // multiply a UQ112x112 by a UQ112x112, returning a UQ112x112
    // lossy
    function muluq(uq112x112 memory self, uq112x112 memory other)
        internal
        pure
        returns (uq112x112 memory)
    {
        if (self._x == 0 || other._x == 0) {
            return uq112x112(0);
        }
        uint112 upper_self = uint112(self._x >> RESOLUTION); // * 2^0
        uint112 lower_self = uint112(self._x & LOWER_MASK); // * 2^-112
        uint112 upper_other = uint112(other._x >> RESOLUTION); // * 2^0
        uint112 lower_other = uint112(other._x & LOWER_MASK); // * 2^-112

        // partial products
        uint224 upper = uint224(upper_self) * upper_other; // * 2^0
        uint224 lower = uint224(lower_self) * lower_other; // * 2^-224
        uint224 uppers_lowero = uint224(upper_self) * lower_other; // * 2^-112
        uint224 uppero_lowers = uint224(upper_other) * lower_self; // * 2^-112

        // so the bit shift does not overflow
        require(
            upper <= type(uint112).max,
            "FixedPoint::muluq: upper overflow"
        );

        // this cannot exceed 256 bits, all values are 224 bits
        uint sum = uint(upper << RESOLUTION) +
            uppers_lowero +
            uppero_lowers +
            (lower >> RESOLUTION);

        // so the cast does not overflow
        require(sum <= type(uint224).max, "FixedPoint::muluq: sum overflow");

        return uq112x112(uint224(sum));
    }

    // divide a UQ112x112 by a UQ112x112, returning a UQ112x112
    function divuq(uq112x112 memory self, uq112x112 memory other)
        internal
        pure
        returns (uq112x112 memory)
    {
        require(other._x > 0, "FixedPoint::divuq: division by zero");
        if (self._x == other._x) {
            return uq112x112(uint224(Q112));
        }
        if (self._x <= type(uint144).max) {
            uint value = (uint(self._x) << RESOLUTION) / other._x;
            require(value <= type(uint224).max, "FixedPoint::divuq: overflow");
            return uq112x112(uint224(value));
        }

        uint result = FullMath.mulDiv(Q112, self._x, other._x);
        require(result <= type(uint224).max, "FixedPoint::divuq: overflow");
        return uq112x112(uint224(result));
    }

    // returns a UQ112x112 which represents the ratio of the numerator to the denominator
    // can be lossy
    function fraction(uint numerator, uint denominator)
        internal
        pure
        returns (uq112x112 memory)
    {
        require(denominator > 0, "FixedPoint::fraction: division by zero");
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= type(uint144).max) {
            uint result = (numerator << RESOLUTION) / denominator;
            require(
                result <= type(uint224).max,
                "FixedPoint::fraction: overflow"
            );
            return uq112x112(uint224(result));
        } else {
            uint result = FullMath.mulDiv(numerator, Q112, denominator);
            require(
                result <= type(uint224).max,
                "FixedPoint::fraction: overflow"
            );
            return uq112x112(uint224(result));
        }
    }

    // take the reciprocal of a UQ112x112
    // reverts on overflow
    // lossy
    function reciprocal(uq112x112 memory self)
        internal
        pure
        returns (uq112x112 memory)
    {
        require(self._x != 0, "FixedPoint::reciprocal: reciprocal of zero");
        require(self._x != 1, "FixedPoint::reciprocal: overflow");
        return uq112x112(uint224(Q224 / self._x));
    }

    // square root of a UQ112x112
    // lossy between 0/1 and 40 bits
    function sqrt(uq112x112 memory self)
        internal
        pure
        returns (uq112x112 memory)
    {
        if (self._x <= type(uint144).max) {
            return uq112x112(uint224(Babylonian.sqrt(uint(self._x) << 112)));
        }

        uint8 safeShiftBits = 255 - BitMath.mostSignificantBit(self._x);
        safeShiftBits -= safeShiftBits % 2;
        return
            uq112x112(
                uint224(
                    Babylonian.sqrt(uint(self._x) << safeShiftBits) <<
                        ((112 - safeShiftBits) / 2)
                )
            );
    }
}

////// src/libraries/UniswapV2OracleLibrary.sol
/* pragma solidity 0.8.9; */

/* import "../interfaces/uniswap/IUniswapV2Pair.sol"; */
/* import "./FixedPoint.sol"; */

// library with helper methods for oracles that are concerned with computing average prices
library UniswapV2OracleLibrary {
    using FixedPoint for *;

    // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1]
    function currentBlockTimestamp() internal view returns (uint32) {
        return uint32(block.timestamp % 2**32);
    }

    // produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices(address pair)
        internal
        view
        returns (
            uint price0Cumulative,
            uint price1Cumulative,
            uint32 blockTimestamp
        )
    {
        blockTimestamp = currentBlockTimestamp();
        price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast();
        price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast();

        // if time has elapsed since the last update on the pair, mock the accumulated price values
        (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        ) = IUniswapV2Pair(pair).getReserves();
        if (blockTimestampLast != blockTimestamp) {
            // subtraction overflow is desired
            uint32 timeElapsed = blockTimestamp - blockTimestampLast;
            // addition overflow is desired
            // counterfactual
            price0Cumulative +=
                uint(FixedPoint.fraction(reserve1, reserve0)._x) *
                timeElapsed;
            // counterfactual
            price1Cumulative +=
                uint(FixedPoint.fraction(reserve0, reserve1)._x) *
                timeElapsed;
        }
    }
}

////// src/UniswapTwap.sol

/* pragma solidity 0.8.9; */

/* import "@openzeppelin/contracts/access/Ownable.sol"; */
/* import "./interfaces/chainlink/IAggregatorV3.sol"; */
/* import "./interfaces/uniswap/IUniswapV2Pair.sol"; */
/* import "./interfaces/IUniswapTWAP.sol"; */
/* import "./libraries/UniswapV2OracleLibrary.sol"; */
/* import "./libraries/FixedPoint.sol"; */

/**
 * @notice Return absolute value of |x - y|
 */
function abs(uint x, uint y) pure returns (uint) {
    if (x >= y) {
        return x - y;
    }
    return y - x;
}

contract UniswapTwap is IUniswapTWAP, Ownable {
    using FixedPoint for FixedPoint.uq112x112;
    using FixedPoint for FixedPoint.uq144x112;

    struct ExchangePair {
        uint nativeTokenPriceCumulative;
        FixedPoint.uq112x112 nativeTokenPriceAverage;
        uint lastMeasurement;
        uint updatePeriod;
        // true if token0 = vader
        bool isFirst;
    }

    event SetOracle(address oracle);

    // 1 Vader = 1e18
    uint private constant ONE_VADER = 1e18;
    // Denominator to calculate difference in Vader / ETH TWAP and spot price.
    uint private constant MAX_PRICE_DIFF_DENOMINATOR = 1e5;
    // max for maxUpdateWindow
    uint private constant MAX_UPDATE_WINDOW = 30 days;

    /* ========== STATE VARIABLES ========== */
    address public immutable vader;
    // Vader ETH pair
    IUniswapV2Pair public immutable pair;
    // Set to pairData.updatePeriod.
    // maxUpdateWindow is called by other contracts.
    uint public maxUpdateWindow;
    ExchangePair public pairData;
    IAggregatorV3 public oracle;
    // Numberator to calculate max allowed difference between Vader / ETH TWAP
    // and spot price.
    // maxPriceDiff must be initialized to MAX_PRICE_DIFF_DENOMINATOR and kept
    // until TWAP price is close to spot price for _updateVaderPrice to not fail.
    uint public maxPriceDiff = MAX_PRICE_DIFF_DENOMINATOR;

    address public keeper;

    modifier onlyAuthorized() {
        require(
            msg.sender == owner() || msg.sender == keeper,
            "not authorized"
        );
        _;
    }

    constructor(
        address _vader,
        IUniswapV2Pair _pair,
        IAggregatorV3 _oracle,
        uint _updatePeriod
    ) {
        require(_vader != address(0), "vader = 0 address");
        vader = _vader;
        require(_oracle.decimals() == 8, "oracle decimals != 8");
        oracle = _oracle;
        pair = _pair;
        _addVaderPair(_vader, _pair, _updatePeriod);
    }

    /* ========== VIEWS ========== */
    /**
     * @notice Get Vader USD price calculated from Vader / ETH price from
     *         last update.
     **/
    function getStaleVaderPrice() external view returns (uint) {
        return _calculateVaderPrice();
    }

    /**
     * @notice Get ETH / USD price from Chainlink. 1 USD = 1e8.
     **/
    function getChainlinkPrice() public view returns (uint) {
        (uint80 roundID, int price, , , uint80 answeredInRound) = oracle
            .latestRoundData();
        require(answeredInRound >= roundID, "stale Chainlink price");
        require(price > 0, "chainlink price = 0");
        return uint(price);
    }

    /**
     * @notice Helper function to decode and return Vader / ETH TWAP price
     **/
    function getVaderEthPriceAverage() public view returns (uint) {
        return pairData.nativeTokenPriceAverage.mul(ONE_VADER).decode144();
    }

    /**
     * @notice Helper function to decode and return Vader / ETH spot price
     **/
    function getVaderEthSpotPrice() public view returns (uint) {
        (uint reserve0, uint reserve1, ) = pair.getReserves();
        (uint vaderReserve, uint ethReserve) = pairData.isFirst
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
        return
            FixedPoint
                .fraction(ethReserve, vaderReserve)
                .mul(ONE_VADER)
                .decode144();
    }

    /* ========== MUTATIVE FUNCTIONS ========== */
    /**
    * @notice Update Vader / ETH price and return Vader / USD price.
              This function will need to be executed at least twice to return
              sensible Vader / USD price.
    **/
    // NOTE: Fails until _updateVaderPrice is called atlease twice for
    // nativeTokenPriceAverage to be > 0
    function getVaderPrice() external returns (uint) {
        _updateVaderPrice();
        return _calculateVaderPrice();
    }

    /**
     * @notice Update Vader / ETH price.
     **/
    function syncVaderPrice() external {
        _updateVaderPrice();
    }

    /**
     * @notice Update Vader / ETH price.
     **/
    function _updateVaderPrice() private {
        uint timeElapsed = block.timestamp - pairData.lastMeasurement;
        // NOTE: save gas and re-entrancy protection.
        if (timeElapsed < pairData.updatePeriod) return;
        bool isFirst = pairData.isFirst;
        (
            uint price0Cumulative,
            uint price1Cumulative,
            uint currentMeasurement
        ) = UniswapV2OracleLibrary.currentCumulativePrices(address(pair));
        uint priceCumulativeEnd = isFirst ? price0Cumulative : price1Cumulative;
        uint priceCumulativeStart = pairData.nativeTokenPriceCumulative;
        // NOTE: Overflow is desired
        // Difference between 2 cumulative prices will be correct even if the
        // latest price cumulative overflowed.
        unchecked {
            pairData.nativeTokenPriceAverage = FixedPoint.uq112x112(
                uint224(
                    (priceCumulativeEnd - priceCumulativeStart) / timeElapsed
                )
            );
        }
        pairData.nativeTokenPriceCumulative = priceCumulativeEnd;
        pairData.lastMeasurement = currentMeasurement;

        // check TWAP and spot price difference is not too big
        if (maxPriceDiff < MAX_PRICE_DIFF_DENOMINATOR) {
            // p = TWAP price
            // s = spot price
            // d = max price diff
            // D = MAX_PRICE_DIFF_DENOMINATOR
            // |p - s| / p <= d / D
            uint twapPrice = getVaderEthPriceAverage();
            uint spotPrice = getVaderEthSpotPrice();
            require(twapPrice > 0, "TWAP = 0");
            require(spotPrice > 0, "spot price = 0");
            // NOTE: if maxPriceDiff = 0, then this check will most likely fail
            require(
                (abs(twapPrice, spotPrice) * MAX_PRICE_DIFF_DENOMINATOR) /
                    twapPrice <=
                    maxPriceDiff,
                "price diff > max"
            );
        }
    }

    /**
     * @notice Calculates Vader price in USD, 1 USD = 1e18.
     **/
    function _calculateVaderPrice() private view returns (uint vaderUsdPrice) {
        // USD / ETH, 8 decimals
        uint usdPerEth = getChainlinkPrice();
        // ETH / Vader, 18 decimals
        uint ethPerVader = pairData
            .nativeTokenPriceAverage
            .mul(ONE_VADER)
            .decode144();
        // divide by 1e8 from Chainlink price
        vaderUsdPrice = (usdPerEth * ethPerVader) / 1e8;
        require(vaderUsdPrice > 0, "vader usd price = 0");
    }

    /**
     * @notice Initialize pairData.
     * @param _vader Address of Vader.
     * @param _pair Address of Vader / ETH Uniswap V2 pair.
     * @param _updatePeriod Amout of time that has to elapse before Vader / ETH
     *       TWAP can be updated.
     **/
    function _addVaderPair(
        address _vader,
        IUniswapV2Pair _pair,
        uint _updatePeriod
    ) private {
        require(_updatePeriod != 0, "update period = 0");
        bool isFirst = _pair.token0() == _vader;
        address nativeAsset = isFirst ? _pair.token0() : _pair.token1();
        require(nativeAsset == _vader, "unsupported pair");
        pairData.isFirst = isFirst;
        pairData.lastMeasurement = block.timestamp;
        _setUpdatePeriod(_updatePeriod);
        pairData.nativeTokenPriceCumulative = isFirst
            ? _pair.price0CumulativeLast()
            : _pair.price1CumulativeLast();
        // NOTE: pairData.nativeTokenPriceAverage = 0
    }

    /**
     * @notice Set keeper address.
     * @param _keeper Address of keeper.
     */
    function setKeeper(address _keeper) external onlyOwner {
        // NOTE: allow _keeper to be 0 address
        keeper = _keeper;
    }

    /**
     * @notice Set Chainlink oracle.
     * @param _oracle Address of Chainlink price oracle.
     **/
    function setOracle(IAggregatorV3 _oracle) external onlyOwner {
        require(_oracle.decimals() == 8, "oracle decimals != 8");
        oracle = _oracle;
        emit SetOracle(address(_oracle));
    }

    /**
     * @notice Set updatePeriod.
     * @param _updatePeriod New update period for Vader / ETH TWAP
     **/
    function _setUpdatePeriod(uint _updatePeriod) private {
        require(_updatePeriod <= MAX_UPDATE_WINDOW, "update period > max");
        pairData.updatePeriod = _updatePeriod;
        maxUpdateWindow = _updatePeriod;
    }

    function setUpdatePeriod(uint _updatePeriod) external onlyOwner {
        _setUpdatePeriod(_updatePeriod);
    }

    /**
     * @notice Set maxPriceDiff.
     * @param _maxPriceDiff Numberator to calculate max allowed difference
     *        between Vader / ETH TWAP and spot price.
     **/
    function _setMaxPriceDiff(uint _maxPriceDiff) private {
        require(
            _maxPriceDiff <= MAX_PRICE_DIFF_DENOMINATOR,
            "price diff > max"
        );
        maxPriceDiff = _maxPriceDiff;
    }

    function setMaxPriceDiff(uint _maxPriceDiff) external onlyOwner {
        _setMaxPriceDiff(_maxPriceDiff);
    }

    /**
     * @notice Force update Vader TWAP price even if has deviated significantly
     *         from Vader / ETH spot price.
     */
    function forceUpdateVaderPrice() external onlyAuthorized {
        uint _maxPriceDiff = maxPriceDiff;
        _setMaxPriceDiff(MAX_PRICE_DIFF_DENOMINATOR);
        _updateVaderPrice();
        _setMaxPriceDiff(_maxPriceDiff);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_vader","type":"address"},{"internalType":"contract IUniswapV2Pair","name":"_pair","type":"address"},{"internalType":"contract IAggregatorV3","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_updatePeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetOracle","type":"event"},{"inputs":[],"name":"forceUpdateVaderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getChainlinkPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStaleVaderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderEthPriceAverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderEthSpotPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPriceDiff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUpdateWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IAggregatorV3","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 IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairData","outputs":[{"internalType":"uint256","name":"nativeTokenPriceCumulative","type":"uint256"},{"components":[{"internalType":"uint224","name":"_x","type":"uint224"}],"internalType":"struct FixedPoint.uq112x112","name":"nativeTokenPriceAverage","type":"tuple"},{"internalType":"uint256","name":"lastMeasurement","type":"uint256"},{"internalType":"uint256","name":"updatePeriod","type":"uint256"},{"internalType":"bool","name":"isFirst","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPriceDiff","type":"uint256"}],"name":"setMaxPriceDiff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAggregatorV3","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatePeriod","type":"uint256"}],"name":"setUpdatePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"syncVaderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c0604052620186a06008553480156200001857600080fd5b5060405162001c6a38038062001c6a8339810160408190526200003b91620005ba565b6200004633620001b5565b6001600160a01b038416620000965760405162461bcd60e51b81526020600482015260116024820152707661646572203d2030206164647265737360781b60448201526064015b60405180910390fd5b836001600160a01b03166080816001600160a01b031681525050816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620000ea57600080fd5b505afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000125919062000614565b60ff16600814620001795760405162461bcd60e51b815260206004820152601460248201527f6f7261636c6520646563696d616c7320213d203800000000000000000000000060448201526064016200008d565b600780546001600160a01b0319166001600160a01b0384811691909117909155831660a052620001ab84848362000205565b505050506200067a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80620002485760405162461bcd60e51b8152602060048201526011602482015270075706461746520706572696f64203d203607c1b60448201526064016200008d565b6000836001600160a01b0316836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028e57600080fd5b505afa158015620002a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c9919062000640565b6001600160a01b03161490506000816200035857836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031757600080fd5b505afa1580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000352919062000640565b620003cd565b836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039257600080fd5b505afa158015620003a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cd919062000640565b9050846001600160a01b0316816001600160a01b031614620004255760405162461bcd60e51b815260206004820152601060248201526f3ab739bab83837b93a32b2103830b4b960811b60448201526064016200008d565b6006805460ff191683151517905542600455620004428362000542565b81620004c357836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200048257600080fd5b505afa15801562000497573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004bd919062000660565b62000538565b836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620004fd57600080fd5b505afa15801562000512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000538919062000660565b6002555050505050565b62278d00811115620005975760405162461bcd60e51b815260206004820152601360248201527f75706461746520706572696f64203e206d61780000000000000000000000000060448201526064016200008d565b6005819055600155565b6001600160a01b0381168114620005b757600080fd5b50565b60008060008060808587031215620005d157600080fd5b8451620005de81620005a1565b6020860151909450620005f181620005a1565b60408601519093506200060481620005a1565b6060959095015193969295505050565b6000602082840312156200062757600080fd5b815160ff811681146200063957600080fd5b9392505050565b6000602082840312156200065357600080fd5b81516200063981620005a1565b6000602082840312156200067357600080fd5b5051919050565b60805160a0516115bc620006ae60003960008181610220015281816104ff0152610a0d0152600061016501526115bc6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637adbf973116100b8578063ad16059c1161007c578063ad16059c14610255578063dcf206661461025d578063e55fae77146102c2578063e5aa25bf146102d5578063f2fde38b146102de578063fea4c541146102f157600080fd5b80637adbf973146101e45780637dc0d1d0146101f75780638da5cb5b1461020a578063a8aa1b311461021b578063aced16611461024257600080fd5b806347680bdb116100ff57806347680bdb146101b15780635e870ef8146101b957806361d3b4c0146101c1578063715018a6146101c9578063748747e6146101d157600080fd5b806305c552d81461013c5780631524551b146101585780631f494b641461016057806323b5f41a1461019f5780633aeef3d3146101a9575b600080fd5b61014560085481565b6040519081526020015b60405180910390f35b610145610304565b6101877f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014f565b6101a7610313565b005b61014561039b565b6101456104dc565b6101a76104ee565b6101456104f8565b6101a76105f5565b6101a76101df366004611325565b610629565b6101a76101f2366004611325565b610675565b600754610187906001600160a01b031681565b6000546001600160a01b0316610187565b6101877f000000000000000000000000000000000000000000000000000000000000000081565b600954610187906001600160a01b031681565b6101456107ad565b60025460408051602081019091526003546001600160e01b03168152600454600554600654610290949392919060ff1685565b6040805195865293516001600160e01b031660208601529284019190915260608301521515608082015260a00161014f565b6101a76102d0366004611342565b6107ed565b61014560015481565b6101a76102ec366004611325565b610820565b6101a76102ff366004611342565b6108b8565b600061030e6108e2565b905090565b6000546001600160a01b031633148061033657506009546001600160a01b031633145b6103785760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600854610387620186a0610993565b61038f6109de565b61039881610993565b50565b600080600080600760009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156103ef57600080fd5b505afa158015610403573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610427919061137a565b94505050925092508269ffffffffffffffffffff168169ffffffffffffffffffff16101561048f5760405162461bcd60e51b81526020600482015260156024820152747374616c6520436861696e6c696e6b20707269636560581b604482015260640161036f565b600082136104d55760405162461bcd60e51b81526020600482015260136024820152720636861696e6c696e6b207072696365203d203606c1b604482015260640161036f565b5092915050565b60006104e66109de565b61030e6108e2565b6104f66109de565b565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058e91906113e1565b506006546001600160701b03928316945091169150600090819060ff166105b65782846105b9565b83835b915091506105e36105dc670de0b6b3a76400006105d68486610bb4565b90610cea565b5160701c90565b6001600160901b031694505050505090565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260040161036f90611431565b6104f66000610d88565b6000546001600160a01b031633146106535760405162461bcd60e51b815260040161036f90611431565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461069f5760405162461bcd60e51b815260040161036f90611431565b806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107109190611466565b60ff166008146107595760405162461bcd60e51b81526020600482015260146024820152730dee4c2c6d8ca40c8cac6d2dac2d8e640427a40760631b604482015260640161036f565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319060200160405180910390a150565b60408051602081019091526003546001600160e01b031681526000906107df906105dc90670de0b6b3a7640000610cea565b6001600160901b0316905090565b6000546001600160a01b031633146108175760405162461bcd60e51b815260040161036f90611431565b61039881610dd8565b6000546001600160a01b0316331461084a5760405162461bcd60e51b815260040161036f90611431565b6001600160a01b0381166108af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161036f565b61039881610d88565b6000546001600160a01b0316331461038f5760405162461bcd60e51b815260040161036f90611431565b6000806108ed61039b565b60408051602081019091526003546001600160e01b03168152909150600090610922906105dc90670de0b6b3a7640000610cea565b6001600160901b031690506305f5e10061093c828461149f565b61094691906114d4565b92506000831161098e5760405162461bcd60e51b81526020600482015260136024820152720766164657220757364207072696365203d203606c1b604482015260640161036f565b505090565b620186a08111156109d95760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b600855565b6004546000906109ee90426114e8565b6005549091508110156109fe5750565b60065460ff1660008080610a317f0000000000000000000000000000000000000000000000000000000000000000610e2b565b63ffffffff16925092509250600084610a4a5782610a4c565b835b600254604080516020810190915291925090808883850381610a7057610a706114be565b046001600160e01b039081169091529051600380546001600160e01b0319169190921617905560028290556004839055600854620186a01115610bab576000610ab76107ad565b90506000610ac36104f8565b905060008211610b005760405162461bcd60e51b8152602060048201526008602482015267054574150203d20360c41b604482015260640161036f565b60008111610b415760405162461bcd60e51b815260206004820152600e60248201526d073706f74207072696365203d20360941b604482015260640161036f565b60085482620186a0610b53858561104f565b610b5d919061149f565b610b6791906114d4565b1115610ba85760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b50505b50505050505050565b60408051602081019091526000815260008211610c225760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b606482015260840161036f565b82610c3c5750604080516020810190915260008152610ce4565b6001600160901b038311610cd3576000610c5a83607086901b6114d4565b90506001600160e01b03811115610cb35760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015260640161036f565b6040518060200160405280826001600160e01b0316815250915050610ce4565b6000610c5a84600160701b8561107a565b92915050565b6040805160208101909152600081526000821580610d27575083516001600160e01b031683610d19818361149f565b9250610d2590836114d4565b145b610d735760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f7700000000000000604482015260640161036f565b60408051602081019091529081529392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62278d00811115610e215760405162461bcd60e51b81526020600482015260136024820152720eae0c8c2e8ca40e0cae4d2dec8407c40dac2f606b1b604482015260640161036f565b6005819055600155565b6000806000610e38611142565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7357600080fd5b505afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab91906114ff565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906114ff565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9691906113e1565b9250925092508363ffffffff168163ffffffff1614611045576000610fbb8286611518565b90508063ffffffff16610fe0846001600160701b0316866001600160701b0316610bb4565b51610ff491906001600160e01b031661149f565b610ffe908861153d565b96508063ffffffff16611023856001600160701b0316856001600160701b0316610bb4565b5161103791906001600160e01b031661149f565b611041908761153d565b9550505b5050509193909250565b60008183106110695761106282846114e8565b9050610ce4565b61107383836114e8565b9392505050565b60008060006110898686611153565b915091506000848061109d5761109d6114be565b8688099050828111156110b8576110b56001836114e8565b91505b6110c281846114e8565b9250816110dd576110d385846114d4565b9350505050611073565b84821061112c5760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015260640161036f565b611137838387611195565b979650505050505050565b600061030e64010000000042611555565b600080806000198486099050611169848661149f565b925061117583826114e8565b91508281101561118d5761118a6001836114e8565b91505b509250929050565b6000806111a183611569565b831690506111af81846114d4565b92506111bb81866114d4565b9450806111c781611569565b6111d191906114d4565b6111dc90600161153d565b6111e6908561149f565b6111f0908661153d565b945060016111fe818561149f565b6112099060026114e8565b611213908261149f565b905061121f818561149f565b61122a9060026114e8565b611234908261149f565b9050611240818561149f565b61124b9060026114e8565b611255908261149f565b9050611261818561149f565b61126c9060026114e8565b611276908261149f565b9050611282818561149f565b61128d9060026114e8565b611297908261149f565b90506112a3818561149f565b6112ae9060026114e8565b6112b8908261149f565b90506112c4818561149f565b6112cf9060026114e8565b6112d9908261149f565b90506112e5818561149f565b6112f09060026114e8565b6112fa908261149f565b9050611306818761149f565b9695505050505050565b6001600160a01b038116811461039857600080fd5b60006020828403121561133757600080fd5b813561107381611310565b60006020828403121561135457600080fd5b5035919050565b805169ffffffffffffffffffff8116811461137557600080fd5b919050565b600080600080600060a0868803121561139257600080fd5b61139b8661135b565b94506020860151935060408601519250606086015191506113be6080870161135b565b90509295509295909350565b80516001600160701b038116811461137557600080fd5b6000806000606084860312156113f657600080fd5b6113ff846113ca565b925061140d602085016113ca565b9150604084015163ffffffff8116811461142657600080fd5b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561147857600080fd5b815160ff8116811461107357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156114b9576114b9611489565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826114e3576114e36114be565b500490565b6000828210156114fa576114fa611489565b500390565b60006020828403121561151157600080fd5b5051919050565b600063ffffffff8381169083168181101561153557611535611489565b039392505050565b6000821982111561155057611550611489565b500190565b600082611564576115646114be565b500690565b6000600160ff1b82141561157f5761157f611489565b506000039056fea264697066735822122095ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b64736f6c634300080900330000000000000000000000002602278ee1882889b946eb11dc0e810075650983000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80637adbf973116100b8578063ad16059c1161007c578063ad16059c14610255578063dcf206661461025d578063e55fae77146102c2578063e5aa25bf146102d5578063f2fde38b146102de578063fea4c541146102f157600080fd5b80637adbf973146101e45780637dc0d1d0146101f75780638da5cb5b1461020a578063a8aa1b311461021b578063aced16611461024257600080fd5b806347680bdb116100ff57806347680bdb146101b15780635e870ef8146101b957806361d3b4c0146101c1578063715018a6146101c9578063748747e6146101d157600080fd5b806305c552d81461013c5780631524551b146101585780631f494b641461016057806323b5f41a1461019f5780633aeef3d3146101a9575b600080fd5b61014560085481565b6040519081526020015b60405180910390f35b610145610304565b6101877f0000000000000000000000002602278ee1882889b946eb11dc0e81007565098381565b6040516001600160a01b03909116815260200161014f565b6101a7610313565b005b61014561039b565b6101456104dc565b6101a76104ee565b6101456104f8565b6101a76105f5565b6101a76101df366004611325565b610629565b6101a76101f2366004611325565b610675565b600754610187906001600160a01b031681565b6000546001600160a01b0316610187565b6101877f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa81565b600954610187906001600160a01b031681565b6101456107ad565b60025460408051602081019091526003546001600160e01b03168152600454600554600654610290949392919060ff1685565b6040805195865293516001600160e01b031660208601529284019190915260608301521515608082015260a00161014f565b6101a76102d0366004611342565b6107ed565b61014560015481565b6101a76102ec366004611325565b610820565b6101a76102ff366004611342565b6108b8565b600061030e6108e2565b905090565b6000546001600160a01b031633148061033657506009546001600160a01b031633145b6103785760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600854610387620186a0610993565b61038f6109de565b61039881610993565b50565b600080600080600760009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156103ef57600080fd5b505afa158015610403573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610427919061137a565b94505050925092508269ffffffffffffffffffff168169ffffffffffffffffffff16101561048f5760405162461bcd60e51b81526020600482015260156024820152747374616c6520436861696e6c696e6b20707269636560581b604482015260640161036f565b600082136104d55760405162461bcd60e51b81526020600482015260136024820152720636861696e6c696e6b207072696365203d203606c1b604482015260640161036f565b5092915050565b60006104e66109de565b61030e6108e2565b6104f66109de565b565b60008060007f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058e91906113e1565b506006546001600160701b03928316945091169150600090819060ff166105b65782846105b9565b83835b915091506105e36105dc670de0b6b3a76400006105d68486610bb4565b90610cea565b5160701c90565b6001600160901b031694505050505090565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260040161036f90611431565b6104f66000610d88565b6000546001600160a01b031633146106535760405162461bcd60e51b815260040161036f90611431565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461069f5760405162461bcd60e51b815260040161036f90611431565b806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d857600080fd5b505afa1580156106ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107109190611466565b60ff166008146107595760405162461bcd60e51b81526020600482015260146024820152730dee4c2c6d8ca40c8cac6d2dac2d8e640427a40760631b604482015260640161036f565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd3b5d1e0ffaeff528910f3663f0adace7694ab8241d58e17a91351ced2e080319060200160405180910390a150565b60408051602081019091526003546001600160e01b031681526000906107df906105dc90670de0b6b3a7640000610cea565b6001600160901b0316905090565b6000546001600160a01b031633146108175760405162461bcd60e51b815260040161036f90611431565b61039881610dd8565b6000546001600160a01b0316331461084a5760405162461bcd60e51b815260040161036f90611431565b6001600160a01b0381166108af5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161036f565b61039881610d88565b6000546001600160a01b0316331461038f5760405162461bcd60e51b815260040161036f90611431565b6000806108ed61039b565b60408051602081019091526003546001600160e01b03168152909150600090610922906105dc90670de0b6b3a7640000610cea565b6001600160901b031690506305f5e10061093c828461149f565b61094691906114d4565b92506000831161098e5760405162461bcd60e51b81526020600482015260136024820152720766164657220757364207072696365203d203606c1b604482015260640161036f565b505090565b620186a08111156109d95760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b600855565b6004546000906109ee90426114e8565b6005549091508110156109fe5750565b60065460ff1660008080610a317f000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa610e2b565b63ffffffff16925092509250600084610a4a5782610a4c565b835b600254604080516020810190915291925090808883850381610a7057610a706114be565b046001600160e01b039081169091529051600380546001600160e01b0319169190921617905560028290556004839055600854620186a01115610bab576000610ab76107ad565b90506000610ac36104f8565b905060008211610b005760405162461bcd60e51b8152602060048201526008602482015267054574150203d20360c41b604482015260640161036f565b60008111610b415760405162461bcd60e51b815260206004820152600e60248201526d073706f74207072696365203d20360941b604482015260640161036f565b60085482620186a0610b53858561104f565b610b5d919061149f565b610b6791906114d4565b1115610ba85760405162461bcd60e51b815260206004820152601060248201526f0e0e4d2c6ca40c8d2cccc407c40dac2f60831b604482015260640161036f565b50505b50505050505050565b60408051602081019091526000815260008211610c225760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b606482015260840161036f565b82610c3c5750604080516020810190915260008152610ce4565b6001600160901b038311610cd3576000610c5a83607086901b6114d4565b90506001600160e01b03811115610cb35760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015260640161036f565b6040518060200160405280826001600160e01b0316815250915050610ce4565b6000610c5a84600160701b8561107a565b92915050565b6040805160208101909152600081526000821580610d27575083516001600160e01b031683610d19818361149f565b9250610d2590836114d4565b145b610d735760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f7700000000000000604482015260640161036f565b60408051602081019091529081529392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62278d00811115610e215760405162461bcd60e51b81526020600482015260136024820152720eae0c8c2e8ca40e0cae4d2dec8407c40dac2f606b1b604482015260640161036f565b6005819055600155565b6000806000610e38611142565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7357600080fd5b505afa158015610e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eab91906114ff565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906114ff565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610f5e57600080fd5b505afa158015610f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9691906113e1565b9250925092508363ffffffff168163ffffffff1614611045576000610fbb8286611518565b90508063ffffffff16610fe0846001600160701b0316866001600160701b0316610bb4565b51610ff491906001600160e01b031661149f565b610ffe908861153d565b96508063ffffffff16611023856001600160701b0316856001600160701b0316610bb4565b5161103791906001600160e01b031661149f565b611041908761153d565b9550505b5050509193909250565b60008183106110695761106282846114e8565b9050610ce4565b61107383836114e8565b9392505050565b60008060006110898686611153565b915091506000848061109d5761109d6114be565b8688099050828111156110b8576110b56001836114e8565b91505b6110c281846114e8565b9250816110dd576110d385846114d4565b9350505050611073565b84821061112c5760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015260640161036f565b611137838387611195565b979650505050505050565b600061030e64010000000042611555565b600080806000198486099050611169848661149f565b925061117583826114e8565b91508281101561118d5761118a6001836114e8565b91505b509250929050565b6000806111a183611569565b831690506111af81846114d4565b92506111bb81866114d4565b9450806111c781611569565b6111d191906114d4565b6111dc90600161153d565b6111e6908561149f565b6111f0908661153d565b945060016111fe818561149f565b6112099060026114e8565b611213908261149f565b905061121f818561149f565b61122a9060026114e8565b611234908261149f565b9050611240818561149f565b61124b9060026114e8565b611255908261149f565b9050611261818561149f565b61126c9060026114e8565b611276908261149f565b9050611282818561149f565b61128d9060026114e8565b611297908261149f565b90506112a3818561149f565b6112ae9060026114e8565b6112b8908261149f565b90506112c4818561149f565b6112cf9060026114e8565b6112d9908261149f565b90506112e5818561149f565b6112f09060026114e8565b6112fa908261149f565b9050611306818761149f565b9695505050505050565b6001600160a01b038116811461039857600080fd5b60006020828403121561133757600080fd5b813561107381611310565b60006020828403121561135457600080fd5b5035919050565b805169ffffffffffffffffffff8116811461137557600080fd5b919050565b600080600080600060a0868803121561139257600080fd5b61139b8661135b565b94506020860151935060408601519250606086015191506113be6080870161135b565b90509295509295909350565b80516001600160701b038116811461137557600080fd5b6000806000606084860312156113f657600080fd5b6113ff846113ca565b925061140d602085016113ca565b9150604084015163ffffffff8116811461142657600080fd5b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561147857600080fd5b815160ff8116811461107357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156114b9576114b9611489565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826114e3576114e36114be565b500490565b6000828210156114fa576114fa611489565b500390565b60006020828403121561151157600080fd5b5051919050565b600063ffffffff8381169083168181101561153557611535611489565b039392505050565b6000821982111561155057611550611489565b500190565b600082611564576115646114be565b500690565b6000600160ff1b82141561157f5761157f611489565b506000039056fea264697066735822122095ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b64736f6c63430008090033

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

0000000000000000000000002602278ee1882889b946eb11dc0e810075650983000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84190000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _vader (address): 0x2602278EE1882889B946eb11DC0E810075650983
Arg [1] : _pair (address): 0x452c60e1E3Ae0965Cd27dB1c7b3A525d197Ca0Aa
Arg [2] : _oracle (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
Arg [3] : _updatePeriod (uint256): 1

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000002602278ee1882889b946eb11dc0e810075650983
Arg [1] : 000000000000000000000000452c60e1e3ae0965cd27db1c7b3a525d197ca0aa
Arg [2] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

19299:9748:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20653:53;;;;;;;;;160:25:1;;;148:2;133:18;20653:53:0;;;;;;;;21490:107;;;:::i;20088:30::-;;;;;;;;-1:-1:-1;;;;;360:32:1;;;342:51;;330:2;315:18;20088:30:0;196:203:1;28808:236:0;;;:::i;:::-;;21689:323;;;:::i;23175:127::-;;;:::i;23371:73::-;;;:::i;22365:426::-;;;:::i;2815:103::-;;;:::i;27173:138::-;;;;;;:::i;:::-;;:::i;27434:206::-;;;;;;:::i;:::-;;:::i;20352:27::-;;;;;-1:-1:-1;;;;;20352:27:0;;;2164:87;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;2164:87;;20148:36;;;;;20715:21;;;;;-1:-1:-1;;;;;20715:21:0;;;22115:147;;;:::i;20317:28::-;;;;;;;;;;;;;;-1:-1:-1;;;;;20317:28:0;;;;;;;;;;;;;;;;;;;;;;;1829:25:1;;;1894:13;;-1:-1:-1;;;;;1890:39:1;1885:2;1870:18;;1863:67;1946:18;;;1939:34;;;;2004:2;1989:18;;1982:34;2060:14;2053:22;2047:3;2032:19;;2025:51;1816:3;1801:19;20317:28:0;1524:558:1;28006:114:0;;;;;;:::i;:::-;;:::i;20283:27::-;;;;;;3073:201;;;;;;:::i;:::-;;:::i;28542:114::-;;;;;;:::i;:::-;;:::i;21490:107::-;21543:4;21567:22;:20;:22::i;:::-;21560:29;;21490:107;:::o;28808:236::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;20804:10;:21;;:45;;-1:-1:-1;20843:6:0;;-1:-1:-1;;;;;20843:6:0;20829:10;:20;20804:45;20782:109;;;;-1:-1:-1;;;20782:109:0;;2474:2:1;20782:109:0;;;2456:21:1;2513:2;2493:18;;;2486:30;-1:-1:-1;;;2532:18:1;;;2525:44;2586:18;;20782:109:0;;;;;;;;;28897:12:::1;::::0;28920:44:::1;19939:3;28920:16;:44::i;:::-;28975:19;:17;:19::i;:::-;29005:31;29022:13;29005:16;:31::i;:::-;28865:179;28808:236::o:0;21689:323::-;21739:4;21757:14;21773:9;21788:22;21814:6;;;;;;;;;-1:-1:-1;;;;;21814:6:0;-1:-1:-1;;;;;21814:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21756:96;;;;;;;;21890:7;21871:26;;:15;:26;;;;21863:60;;;;-1:-1:-1;;;21863:60:0;;3479:2:1;21863:60:0;;;3461:21:1;3518:2;3498:18;;;3491:30;-1:-1:-1;;;3537:18:1;;;3530:51;3598:18;;21863:60:0;3277:345:1;21863:60:0;21950:1;21942:5;:9;21934:41;;;;-1:-1:-1;;;21934:41:0;;3829:2:1;21934:41:0;;;3811:21:1;3868:2;3848:18;;;3841:30;-1:-1:-1;;;3887:18:1;;;3880:49;3946:18;;21934:41:0;3627:343:1;21934:41:0;-1:-1:-1;21998:5:0;21689:323;-1:-1:-1;;21689:323:0:o;23175:127::-;23218:4;23235:19;:17;:19::i;:::-;23272:22;:20;:22::i;23371:73::-;23417:19;:17;:19::i;:::-;23371:73::o;22365:426::-;22418:4;22436:13;22451;22470:4;-1:-1:-1;;;;;22470:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;22538:16:0;;-1:-1:-1;;;;;22435:53:0;;;;-1:-1:-1;22435:53:0;;;-1:-1:-1;22500:17:0;;;;22538:16;;:88;;22607:8;22617;22538:88;;;22571:8;22581;22538:88;22499:127;;;;22657:126;:96;19797:4;22657:63;22695:10;22707:12;22657:37;:63::i;:::-;:85;;:96::i;:::-;11627:7;10568:3;11627:21;;11527:130;22657:126;-1:-1:-1;;;;;22637:146:0;;;;;;;22365:426;:::o;2815:103::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;2880:30:::1;2907:1;2880:18;:30::i;27173:138::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;27287:6:::1;:16:::0;;-1:-1:-1;;;;;;27287:16:0::1;-1:-1:-1::0;;;;;27287:16:0;;;::::1;::::0;;;::::1;::::0;;27173:138::o;27434:206::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;27514:7:::1;-1:-1:-1::0;;;;;27514:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:23;;27536:1;27514:23;27506:56;;;::::0;-1:-1:-1;;;27506:56:0;;5464:2:1;27506:56:0::1;::::0;::::1;5446:21:1::0;5503:2;5483:18;;;5476:30;-1:-1:-1;;;5522:18:1;;;5515:50;5582:18;;27506:56:0::1;5262:344:1::0;27506:56:0::1;27573:6;:16:::0;;-1:-1:-1;;;;;;27573:16:0::1;-1:-1:-1::0;;;;;27573:16:0;::::1;::::0;;::::1;::::0;;;27605:27:::1;::::0;342:51:1;;;27605:27:0::1;::::0;330:2:1;315:18;27605:27:0::1;;;;;;;27434:206:::0;:::o;22115:147::-;22195:36;;;;;;;;;:32;:36;-1:-1:-1;;;;;22195:36:0;;;22171:4;;22195:59;;:47;;19797:4;22195:36;:47::i;:59::-;-1:-1:-1;;;;;22188:66:0;;;22115:147;:::o;28006:114::-;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;28081:31:::1;28098:13;28081:16;:31::i;3073:201::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3162:22:0;::::1;3154:73;;;::::0;-1:-1:-1;;;3154:73:0;;5813:2:1;3154:73:0::1;::::0;::::1;5795:21:1::0;5852:2;5832:18;;;5825:30;5891:34;5871:18;;;5864:62;-1:-1:-1;;;5942:18:1;;;5935:36;5988:19;;3154:73:0::1;5611:402:1::0;3154:73:0::1;3238:28;3257:8;3238:18;:28::i;28542:114::-:0;2210:7;2237:6;-1:-1:-1;;;;;2237:6:0;917:10;2384:23;2376:68;;;;-1:-1:-1;;;2376:68:0;;;;;;;:::i;25586:496::-;25640:18;25705:14;25722:19;:17;:19::i;:::-;25808:64;;;;;;;;;:46;:64;-1:-1:-1;;;;;25808:64:0;;;25705:36;;-1:-1:-1;25789:16:0;;25808:101;;:75;;19797:4;25808:64;:75::i;:101::-;-1:-1:-1;;;;;25789:120:0;;-1:-1:-1;26011:3:0;25984:23;25789:120;25984:9;:23;:::i;:::-;25983:31;;;;:::i;:::-;25967:47;;26049:1;26033:13;:17;26025:49;;;;-1:-1:-1;;;26025:49:0;;6782:2:1;26025:49:0;;;6764:21:1;6821:2;6801:18;;;6794:30;-1:-1:-1;;;6840:18:1;;;6833:49;6899:18;;26025:49:0;6580:343:1;26025:49:0;25660:422;;25586:496;:::o;28313:221::-;19939:3;28400:13;:43;;28378:109;;;;-1:-1:-1;;;28378:109:0;;7130:2:1;28378:109:0;;;7112:21:1;7169:2;7149:18;;;7142:30;-1:-1:-1;;;7188:18:1;;;7181:46;7244:18;;28378:109:0;6928:340:1;28378:109:0;28498:12;:28;28313:221::o;23513:1985::-;23598:24;;23561:16;;23580:42;;:15;:42;:::i;:::-;23706:21;;23561:61;;-1:-1:-1;23692:35:0;;23688:48;;;23729:7;23513:1985::o;23688:48::-;23761:16;;;;23746:12;;;23912:61;23967:4;23912:46;:61::i;:::-;23788:185;;;;;;;;23984:23;24010:7;:45;;24039:16;24010:45;;;24020:16;24010:45;24094:8;:35;24365:160;;;;;;;;;23984:71;;-1:-1:-1;24094:35:0;24365:160;24480:11;24435:41;;;24480:11;24434:57;;;;:::i;:::-;;-1:-1:-1;;;;;24365:160:0;;;;;;24330:195;;:32;:195;;-1:-1:-1;;;;;;24330:195:0;;;;;;;;:8;24547:56;;;24614:24;:45;;;24740:12;;19939:3;-1:-1:-1;24736:755:0;;;24979:14;24996:25;:23;:25::i;:::-;24979:42;;25036:14;25053:22;:20;:22::i;:::-;25036:39;;25110:1;25098:9;:13;25090:34;;;;-1:-1:-1;;;25090:34:0;;7605:2:1;25090:34:0;;;7587:21:1;7644:1;7624:18;;;7617:29;-1:-1:-1;;;7662:18:1;;;7655:38;7710:18;;25090:34:0;7403:331:1;25090:34:0;25159:1;25147:9;:13;25139:40;;;;-1:-1:-1;;;25139:40:0;;7941:2:1;25139:40:0;;;7923:21:1;7980:2;7960:18;;;7953:30;-1:-1:-1;;;7999:18:1;;;7992:44;8053:18;;25139:40:0;7739:338:1;25139:40:0;25415:12;;25381:9;19939:3;25302:25;25306:9;25317;25302:3;:25::i;:::-;:54;;;;:::i;:::-;25301:89;;;;:::i;:::-;:126;;25275:204;;;;-1:-1:-1;;;25275:204:0;;7130:2:1;25275:204:0;;;7112:21:1;7169:2;7149:18;;;7142:30;-1:-1:-1;;;7188:18:1;;;7181:46;7244:18;;25275:204:0;6928:340:1;25275:204:0;24783:708;;24736:755;23550:1948;;;;;;;23513:1985::o;14849:855::-;-1:-1:-1;;;;;;;;;;;;15007:1:0;14993:11;:15;14985:66;;;;-1:-1:-1;;;14985:66:0;;8284:2:1;14985:66:0;;;8266:21:1;8323:2;8303:18;;;8296:30;8362:34;8342:18;;;8335:62;-1:-1:-1;;;8413:18:1;;;8406:36;8459:19;;14985:66:0;8082:402:1;14985:66:0;15066:14;15062:50;;-1:-1:-1;15089:23:0;;;;;;;;;-1:-1:-1;15089:23:0;;15082:30;;15062:50;-1:-1:-1;;;;;15129:30:0;;15125:572;;15176:11;15190:39;15218:11;10568:3;15191:23;;;15190:39;:::i;:::-;15176:53;-1:-1:-1;;;;;;15270:27:0;;;15244:119;;;;-1:-1:-1;;;15244:119:0;;8691:2:1;15244:119:0;;;8673:21:1;8730:2;8710:18;;;8703:30;8769:32;8749:18;;;8742:60;8819:18;;15244:119:0;8489:354:1;15244:119:0;15385:26;;;;;;;;15403:6;-1:-1:-1;;;;;15385:26:0;;;;15378:33;;;;;15125:572;15444:11;15458:45;15474:9;-1:-1:-1;;;15491:11:0;15458:15;:45::i;15125:572::-;14849:855;;;;:::o;11755:304::-;-1:-1:-1;;;;;;;;;;;;11883:6:0;11926;;;:42;;-1:-1:-1;11961:7:0;;-1:-1:-1;;;;;11936:32:0;11956:1;11941:11;11956:1;11936:32;11941:11;:::i;:::-;11937:15;-1:-1:-1;11936:21:0;;11937:15;11936:21;:::i;:::-;:32;11926:42;11904:117;;;;-1:-1:-1;;;11904:117:0;;9050:2:1;11904:117:0;;;9032:21:1;9089:2;9069:18;;;9062:30;9128:27;9108:18;;;9101:55;9173:18;;11904:117:0;8848:349:1;11904:117:0;12039:12;;;;;;;;;;;;;11755:304;-1:-1:-1;;;11755:304:0:o;3434:191::-;3508:16;3527:6;;-1:-1:-1;;;;;3544:17:0;;;-1:-1:-1;;;;;;3544:17:0;;;;;;3577:40;;3527:6;;;;;;;3577:40;;3508:16;3577:40;3497:128;3434:191;:::o;27769:229::-;20023:7;27842:13;:34;;27834:66;;;;-1:-1:-1;;;27834:66:0;;9404:2:1;27834:66:0;;;9386:21:1;9443:2;9423:18;;;9416:30;-1:-1:-1;;;9462:18:1;;;9455:49;9521:18;;27834:66:0;9202:343:1;27834:66:0;27911:21;:37;;;27959:15;:31;27769:229::o;17484:1242::-;17595:21;17631;17667;17733:23;:21;:23::i;:::-;17716:40;;17801:4;-1:-1:-1;;;;;17786:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17767:62;;17874:4;-1:-1:-1;;;;;17859:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17840:62;;18031:16;18062;18093:25;18147:4;-1:-1:-1;;;;;18132:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18016:150;;;;;;18203:14;18181:36;;:18;:36;;;18177:542;;18282:18;18303:35;18320:18;18303:14;:35;:::i;:::-;18282:56;;18534:11;18466:79;;18471:39;18491:8;-1:-1:-1;;;;;18471:39:0;18501:8;-1:-1:-1;;;;;18471:39:0;:19;:39::i;:::-;:42;18466:79;;;-1:-1:-1;;;;;18466:48:0;:79;:::i;:::-;18429:116;;;;:::i;:::-;;;18696:11;18628:79;;18633:39;18653:8;-1:-1:-1;;;;;18633:39:0;18663:8;-1:-1:-1;;;;;18633:39:0;:19;:39::i;:::-;:42;18628:79;;;-1:-1:-1;;;;;18628:48:0;:79;:::i;:::-;18591:116;;;;:::i;:::-;;;18219:500;18177:542;17705:1021;;;17484:1242;;;;;:::o;19174:121::-;19217:4;19239:1;19234;:6;19230:43;;19260:5;19264:1;19260;:5;:::i;:::-;19253:12;;;;19230:43;19286:5;19290:1;19286;:5;:::i;:::-;19279:12;19174:121;-1:-1:-1;;;19174:121:0:o;9632:367::-;9729:4;9747:6;9755;9765:13;9773:1;9776;9765:7;:13::i;:::-;9746:32;;;;9791:7;9814:1;9801:15;;;;;:::i;:::-;9811:1;9808;9801:15;9791:25;;9836:1;9831:2;:6;9827:18;;;9839:6;9844:1;9839:6;;:::i;:::-;;;9827:18;9856:7;9861:2;9856:7;;:::i;:::-;;-1:-1:-1;9880:6:0;9876:24;;9895:5;9899:1;9895;:5;:::i;:::-;9888:12;;;;;;;9876:24;9925:1;9921;:5;9913:44;;;;-1:-1:-1;;;9913:44:0;;10300:2:1;9913:44:0;;;10282:21:1;10339:2;10319:18;;;10312:30;10378:28;10358:18;;;10351:56;10424:18;;9913:44:0;10098:350:1;9913:44:0;9975:16;9983:1;9986;9989;9975:7;:16::i;:::-;9968:23;9632:367;-1:-1:-1;;;;;;;9632:367:0:o;17257:121::-;17313:6;17346:23;17364:5;17346:15;:23;:::i;8933:199::-;8989:6;;;-1:-1:-1;;9036:1:0;9033;9026:28;9016:38;-1:-1:-1;9069:5:0;9073:1;9069;:5;:::i;:::-;9065:9;-1:-1:-1;9089:6:0;9065:9;9089:2;:6;:::i;:::-;9085:10;;9115:1;9110:2;:6;9106:18;;;9118:6;9123:1;9118:6;;:::i;:::-;;;9106:18;9005:127;8933:199;;;;;:::o;9140:484::-;9237:4;;9275:7;9280:1;9275:7;:::i;:::-;9266:17;;;-1:-1:-1;9294:9:0;9266:17;:1;9294:9;:::i;:::-;;-1:-1:-1;9314:9:0;9319:4;9314:9;;:::i;:::-;;-1:-1:-1;9363:4:0;9349:10;9363:4;9349:10;:::i;:::-;9344:23;;;;:::i;:::-;:27;;9370:1;9344:27;:::i;:::-;9339:33;;:1;:33;:::i;:::-;9334:38;;;;:::i;:::-;;-1:-1:-1;9392:1:0;9413:5;9392:1;9413;:5;:::i;:::-;9409:9;;:1;:9;:::i;:::-;9404:14;;;;:::i;:::-;;-1:-1:-1;9438:5:0;9404:14;9438:1;:5;:::i;:::-;9434:9;;:1;:9;:::i;:::-;9429:14;;;;:::i;:::-;;-1:-1:-1;9463:5:0;9429:14;9463:1;:5;:::i;:::-;9459:9;;:1;:9;:::i;:::-;9454:14;;;;:::i;:::-;;-1:-1:-1;9488:5:0;9454:14;9488:1;:5;:::i;:::-;9484:9;;:1;:9;:::i;:::-;9479:14;;;;:::i;:::-;;-1:-1:-1;9513:5:0;9479:14;9513:1;:5;:::i;:::-;9509:9;;:1;:9;:::i;:::-;9504:14;;;;:::i;:::-;;-1:-1:-1;9538:5:0;9504:14;9538:1;:5;:::i;:::-;9534:9;;:1;:9;:::i;:::-;9529:14;;;;:::i;:::-;;-1:-1:-1;9563:5:0;9529:14;9563:1;:5;:::i;:::-;9559:9;;:1;:9;:::i;:::-;9554:14;;;;:::i;:::-;;-1:-1:-1;9588:5:0;9554:14;9588:1;:5;:::i;:::-;9584:9;;:1;:9;:::i;:::-;9579:14;;;;:::i;:::-;;-1:-1:-1;9611:5:0;9579:14;9611:1;:5;:::i;:::-;9604:12;9140:484;-1:-1:-1;;;;;;9140:484:0:o;404:131:1:-;-1:-1:-1;;;;;479:31:1;;469:42;;459:70;;525:1;522;515:12;540:247;599:6;652:2;640:9;631:7;627:23;623:32;620:52;;;668:1;665;658:12;620:52;707:9;694:23;726:31;751:5;726:31;:::i;2087:180::-;2146:6;2199:2;2187:9;2178:7;2174:23;2170:32;2167:52;;;2215:1;2212;2205:12;2167:52;-1:-1:-1;2238:23:1;;2087:180;-1:-1:-1;2087:180:1:o;2615:179::-;2693:13;;2746:22;2735:34;;2725:45;;2715:73;;2784:1;2781;2774:12;2715:73;2615:179;;;:::o;2799:473::-;2902:6;2910;2918;2926;2934;2987:3;2975:9;2966:7;2962:23;2958:33;2955:53;;;3004:1;3001;2994:12;2955:53;3027:39;3056:9;3027:39;:::i;:::-;3017:49;;3106:2;3095:9;3091:18;3085:25;3075:35;;3150:2;3139:9;3135:18;3129:25;3119:35;;3194:2;3183:9;3179:18;3173:25;3163:35;;3217:49;3261:3;3250:9;3246:19;3217:49;:::i;:::-;3207:59;;2799:473;;;;;;;;:::o;3975:188::-;4054:13;;-1:-1:-1;;;;;4096:42:1;;4086:53;;4076:81;;4153:1;4150;4143:12;4168:450;4255:6;4263;4271;4324:2;4312:9;4303:7;4299:23;4295:32;4292:52;;;4340:1;4337;4330:12;4292:52;4363:40;4393:9;4363:40;:::i;:::-;4353:50;;4422:49;4467:2;4456:9;4452:18;4422:49;:::i;:::-;4412:59;;4514:2;4503:9;4499:18;4493:25;4558:10;4551:5;4547:22;4540:5;4537:33;4527:61;;4584:1;4581;4574:12;4527:61;4607:5;4597:15;;;4168:450;;;;;:::o;4623:356::-;4825:2;4807:21;;;4844:18;;;4837:30;4903:34;4898:2;4883:18;;4876:62;4970:2;4955:18;;4623:356::o;4984:273::-;5052:6;5105:2;5093:9;5084:7;5080:23;5076:32;5073:52;;;5121:1;5118;5111:12;5073:52;5153:9;5147:16;5203:4;5196:5;5192:16;5185:5;5182:27;5172:55;;5223:1;5220;5213:12;6018:127;6079:10;6074:3;6070:20;6067:1;6060:31;6110:4;6107:1;6100:15;6134:4;6131:1;6124:15;6150:168;6190:7;6256:1;6252;6248:6;6244:14;6241:1;6238:21;6233:1;6226:9;6219:17;6215:45;6212:71;;;6263:18;;:::i;:::-;-1:-1:-1;6303:9:1;;6150:168::o;6323:127::-;6384:10;6379:3;6375:20;6372:1;6365:31;6415:4;6412:1;6405:15;6439:4;6436:1;6429:15;6455:120;6495:1;6521;6511:35;;6526:18;;:::i;:::-;-1:-1:-1;6560:9:1;;6455:120::o;7273:125::-;7313:4;7341:1;7338;7335:8;7332:34;;;7346:18;;:::i;:::-;-1:-1:-1;7383:9:1;;7273:125::o;9550:184::-;9620:6;9673:2;9661:9;9652:7;9648:23;9644:32;9641:52;;;9689:1;9686;9679:12;9641:52;-1:-1:-1;9712:16:1;;9550:184;-1:-1:-1;9550:184:1:o;9739:221::-;9778:4;9807:10;9867;;;;9837;;9889:12;;;9886:38;;;9904:18;;:::i;:::-;9941:13;;9739:221;-1:-1:-1;;;9739:221:1:o;9965:128::-;10005:3;10036:1;10032:6;10029:1;10026:13;10023:39;;;10042:18;;:::i;:::-;-1:-1:-1;10078:9:1;;9965:128::o;10453:112::-;10485:1;10511;10501:35;;10516:18;;:::i;:::-;-1:-1:-1;10550:9:1;;10453:112::o;10570:136::-;10605:3;-1:-1:-1;;;10626:22:1;;10623:48;;;10651:18;;:::i;:::-;-1:-1:-1;10691:1:1;10687:13;;10570:136::o

Swarm Source

ipfs://95ea915ba1a77a4de8d25a0cbf7afa3b9a4fce90bfc630f660f44a5e8625720b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.