ETH Price: $2,063.49 (-0.91%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Observati...220735322025-03-18 11:42:357 days ago1742298155IN
0x02C65719...285045660
0 ETH0.000274125.40985306
Update Observati...210764062024-10-30 5:34:59146 days ago1730266499IN
0x02C65719...285045660
0 ETH0.0008342316.4675592
Update Observati...203227342024-07-17 0:42:47251 days ago1721176967IN
0x02C65719...285045660
0 ETH0.0005101110.07196678
Update Observati...201203822024-06-18 18:18:47279 days ago1718734727IN
0x02C65719...285045660
0 ETH0.000385486.41973946
Update Observati...199333452024-05-23 15:01:35305 days ago1716476495IN
0x02C65719...285045660
0 ETH0.0011557422.80437976
Update Observati...199333392024-05-23 15:00:23305 days ago1716476423IN
0x02C65719...285045660
0 ETH0.001130722.31987625
Update Observati...199333362024-05-23 14:59:47305 days ago1716476387IN
0x02C65719...285045660
0 ETH0.0010683621.08010017
Update Observati...199331242024-05-23 14:17:11305 days ago1716473831IN
0x02C65719...285045660
0 ETH0.001087318.22750631
Transfer Ownersh...198193052024-05-07 16:13:11321 days ago1715098391IN
0x02C65719...285045660
0 ETH0.000224518.43238554
Set Operator198192842024-05-07 16:08:59321 days ago1715098139IN
0x02C65719...285045660
0 ETH0.000242279.34334877
Transfer Ownersh...197321282024-04-25 11:37:23334 days ago1714045043IN
0x02C65719...285045660
0 ETH0.000388188.34351998
Set Threshold194842522024-03-21 16:35:11368 days ago1711038911IN
0x02C65719...285045660
0 ETH0.0015423832.68731518

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Oracle

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 690 runs

Other Settings:
default evmVersion
File 1 of 5 : Oracle.sol
// contracts/Oracle.sol
// SPDX-License-Identifier: UNLICENSED
// Copyright © 2023 SolarExplorer

pragma solidity ^0.8.14;

import "periphery/Operatable.sol";
import "interfaces/IOracle.sol";

contract Oracle is IOracle, Operatable {
    // EIP712 related variables and functions
    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
    // See https://eips.ethereum.org/EIPS/eip-191
    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";
    bytes32 private constant APPROVAL_SIGNATURE_HASH = keccak256("LogUpdateObservation(uint144 value,uint256 deadline)");

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _DOMAIN_SEPARATOR;
    // solhint-disable-next-line var-name-mixedcase
    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;

    uint256 public constant PRECISION = 1e6;
    uint256 public constant HEARTBEAT = 5 minutes;
    uint8 public constant FROZEN = 1;
    uint8 public constant UNFROZEN = 0;

    uint256 public latestInteraction;

    struct StorageType {
        uint144 observation;
        uint64 lastUpdate;
        uint32 deltaPercentage;
        uint8 frozen;
        uint8 signerThreshold;
    }

    StorageType public observation;

    event LogMaxDeltaPercentageChanged(uint256 timestamp, uint32 maxDeltaPercentage);
    event LogFrozenChanged(uint256 timestamp, uint8 frozen);
    event LogSignerThresholdChanged(uint256 timestamp, uint8 signerThreshold);
    event LogUpdateObservation(uint256 timestamp, uint144 observation);

    constructor(address to) {
        // Set default roles
        emit OwnershipTransferred(owner, to);
        owner = to;

        uint256 chainId;
        assembly {
            chainId := chainid()
        }

        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
    }

    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, keccak256("Oracle"), chainId, address(this)));
    }

    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
    }

    function _checkDeltaPercentage(uint256 existingValue, uint256 updatedValue, uint256 maxDelta) internal pure {
        uint256 deltaPercentage;

        if (existingValue <= updatedValue) {
            deltaPercentage = PRECISION - (PRECISION * existingValue / updatedValue);
        } else {
            deltaPercentage = PRECISION - (PRECISION * updatedValue / existingValue);
        }

        require(deltaPercentage < maxDelta, "Delta percentage");
    }

    function _verifySignature(address signer, uint144 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) internal view {
        require(operators[signer], "Oracle: not operator");

        // Also, ecrecover returns address(0) on failure. So we check this.
        require(signer != address(0), "PermissionMgr: Operator cannot be 0");

        require(deadline >= block.timestamp && deadline <= (block.timestamp + 15 minutes), 'Oracle: EXPIRED');

        bytes32 digest =
            keccak256(
                abi.encodePacked(
                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,
                    DOMAIN_SEPARATOR(),
                    keccak256(
                        abi.encode(
                            APPROVAL_SIGNATURE_HASH,
                            value,
                            deadline
                        )
                    )
                )
            );

        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress == signer, "Oracle: Invalid Signature");
    }

    function updateObservation(uint144 value, address[] calldata signers, uint256[] calldata deadline, uint8[] calldata v, bytes32[] calldata r, bytes32[] calldata s) external {
        StorageType memory oldObservation = observation;

        require(signers.length >= oldObservation.signerThreshold, "Too few signers");
        require(block.timestamp != oldObservation.lastUpdate, "Cooldown period");

        address lastSigner;

        for (uint256 i = 0; i < signers.length; i++) {
            require(signers[i] > lastSigner, "Duplicated signer");

            _verifySignature(signers[i], value, deadline[i], v[i], r[i], s[i]);
            lastSigner = signers[i];
        }

        if (oldObservation.observation != 0) {
            _checkDeltaPercentage(uint256(oldObservation.observation), uint256(value), uint256(oldObservation.deltaPercentage));
        }

        observation = StorageType(value, uint64(block.timestamp), oldObservation.deltaPercentage, oldObservation.frozen, oldObservation.signerThreshold);
        emit LogUpdateObservation(block.timestamp, value);
    }

    function get(bytes memory) public view override returns (bool, uint256) {
        StorageType memory oldObservation = observation;
        bool isValid = oldObservation.frozen != FROZEN && block.timestamp - oldObservation.lastUpdate < HEARTBEAT;
        return (isValid, uint256(oldObservation.observation));
    }

    function freeze() external onlyOperators {
        observation.frozen = FROZEN;
        emit LogFrozenChanged(block.timestamp, FROZEN);
    }

    function setMaximumDeltaPercentage(uint32 maximumDeltaPercentage) external onlyOwner {
        observation.deltaPercentage = maximumDeltaPercentage;
        emit LogMaxDeltaPercentageChanged(block.timestamp, maximumDeltaPercentage);
    }

    function unfreeze() external onlyOwner {
        observation.frozen = UNFROZEN;
        emit LogFrozenChanged(block.timestamp, UNFROZEN);
    }

    function setThreshold(uint8 threshold) external onlyOwner {
        observation.signerThreshold = threshold;
        emit LogSignerThresholdChanged(block.timestamp, threshold);
    }

    // Check the last exchange rate without any state changes
    /// @inheritdoc IOracle
    function peek(bytes calldata data) public view override returns (bool, uint256) {
        return get(data);
    }

    // Check the current spot exchange rate without any state changes
    /// @inheritdoc IOracle
    function peekSpot(bytes calldata data) external view override returns (uint256 rate) {
        (,rate) = peek(data); 
    }

    /// @inheritdoc IOracle
    function name(bytes calldata) public pure override returns (string memory) {
        return "Oracle";
    }

    /// @inheritdoc IOracle
    function symbol(bytes calldata) public pure override returns (string memory) {
        return "Oracle";
    }
}

File 2 of 5 : BoringOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Simplified by BoringCrypto

contract BoringOwnableData {
    address public owner;
    address public pendingOwner;
}

contract BoringOwnable is BoringOwnableData {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice `owner` defaults to msg.sender on construction.
    constructor() {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
    /// Can only be invoked by the current `owner`.
    /// @param newOwner Address of the new owner.
    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
    function transferOwnership(
        address newOwner,
        bool direct,
        bool renounce
    ) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    /// @notice Needs to be called by `pendingOwner` to claim ownership.
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;

        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    /// @notice Only allows the `owner` to execute the function.
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

File 3 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    // transfer and tranferFrom have been removed, because they don't work on all tokens (some aren't ERC20 complaint).
    // By removing them you can't accidentally use them.
    // name, symbol and decimals have been removed, because they are optional and sometimes wrongly implemented (MKR).
    // Use BoringERC20 with `using BoringERC20 for IERC20` and call `safeTransfer`, `safeTransferFrom`, etc instead.
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

interface IStrictERC20 {
    // This is the strict ERC20 interface. Don't use this, certainly not if you don't control the ERC20 token you're calling.
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256 balance);
    function transfer(address _to, uint256 _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 4 of 5 : IOracle.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

interface IOracle {
    /// @notice Get the latest exchange rate.
    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
    /// For example:
    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
    /// @return success if no valid (recent) rate is available, return false else true.
    /// @return rate The rate of the requested asset / pair / pool.
    function get(bytes calldata data) external returns (bool success, uint256 rate);

    /// @notice Check the last exchange rate without any state changes.
    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
    /// For example:
    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
    /// @return success if no valid (recent) rate is available, return false else true.
    /// @return rate The rate of the requested asset / pair / pool.
    function peek(bytes calldata data) external view returns (bool success, uint256 rate);

    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().
    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
    /// For example:
    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
    /// @return rate The rate of the requested asset / pair / pool.
    function peekSpot(bytes calldata data) external view returns (uint256 rate);

    /// @notice Returns a human readable (short) name about this oracle.
    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
    /// For example:
    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
    /// @return (string) A human readable symbol name about this oracle.
    function symbol(bytes calldata data) external view returns (string memory);

    /// @notice Returns a human readable name about this oracle.
    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.
    /// For example:
    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));
    /// @return (string) A human readable name about this oracle.
    function name(bytes calldata data) external view returns (string memory);
}

File 5 of 5 : Operatable.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "BoringSolidity/interfaces/IERC20.sol";
import "BoringSolidity/BoringOwnable.sol";

contract Operatable is BoringOwnable {
    event OperatorChanged(address indexed, bool);
    error NotAllowedOperator();

    mapping(address => bool) public operators;

    constructor() {
        operators[msg.sender] = true;
    }

    modifier onlyOperators() {
        if (!operators[msg.sender]) {
            revert NotAllowedOperator();
        }
        _;
    }

    function setOperator(address operator, bool status) external onlyOwner {
        operators[operator] = status;
        emit OperatorChanged(operator, status);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 690
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "remappings": [
    "/=src/",
    "BoringSolidity/=lib/BoringSolidity/contracts/",
    "OpenZeppelin/=lib/openzeppelin-contracts/contracts/",
    "cauldrons/=src/cauldrons/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "interfaces/=src/interfaces/",
    "lenses/=src/lenses/",
    "libraries/=src/libraries/",
    "mocks/=src/mocks/",
    "oracles/=src/oracles/",
    "periphery/=src/periphery/",
    "solidity-stringutils/=lib/surl/lib/solidity-stringutils/src/",
    "solmate/=lib/solmate/src/",
    "strategies/=src/strategies/",
    "surl/=lib/surl/src/",
    "swappers/=src/swappers/",
    "tokens/=src/tokens/",
    "utils/=utils/",
    "OpenZeppelin-Upgrades/=lib/openzeppelin-contracts-upgradeable/contracts/"
  ],
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"to","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotAllowedOperator","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"frozen","type":"uint8"}],"name":"LogFrozenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"maxDeltaPercentage","type":"uint32"}],"name":"LogMaxDeltaPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"signerThreshold","type":"uint8"}],"name":"LogSignerThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint144","name":"observation","type":"uint144"}],"name":"LogUpdateObservation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"OperatorChanged","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FROZEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEARTBEAT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNFROZEN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"get","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestInteraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"observation","outputs":[{"internalType":"uint144","name":"observation","type":"uint144"},{"internalType":"uint64","name":"lastUpdate","type":"uint64"},{"internalType":"uint32","name":"deltaPercentage","type":"uint32"},{"internalType":"uint8","name":"frozen","type":"uint8"},{"internalType":"uint8","name":"signerThreshold","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"peek","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"peekSpot","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"maximumDeltaPercentage","type":"uint32"}],"name":"setMaximumDeltaPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"threshold","type":"uint8"}],"name":"setThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint144","name":"value","type":"uint144"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"deadline","type":"uint256[]"},{"internalType":"uint8[]","name":"v","type":"uint8[]"},{"internalType":"bytes32[]","name":"r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"s","type":"bytes32[]"}],"name":"updateObservation","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b50604051620019703803806200197083398101604081905261003191610151565b600080546001600160a01b03191633908117825560405190919060008051602062001950833981519152908290a333600090815260026020526040808220805460ff19166001179055815490516001600160a01b03848116939216916000805160206200195083398151915291a3600080546001600160a01b0319166001600160a01b0383161790554660a081905261014681604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660208201527f1a4461ab9f0dcef4a35a8660e8bbb361ae4c140fabb5b8c363bd6282ded34a90918101919091526060810182905230608082015260009060a001604051602081830303815290604052805190602001209050919050565b608052506101819050565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b60805160a0516117a9620001a76000396000610542015260006105e901526117a96000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80636a28f000116100e3578063d39bbef01161008c578063e30c397811610066578063e30c39781461039e578063e5a98603146103b1578063eeb8a8d3146103c457600080fd5b8063d39bbef014610361578063d568866c14610341578063d6d7d5251461037457600080fd5b8063abee062b116100bd578063abee062b1461031b578063b27938bf1461032e578063c699c4d61461034157600080fd5b80636a28f000146102de5780638da5cb5b146102e6578063aaf5eb681461031157600080fd5b80633644e515116101455780634e71e0c81161011f5780634e71e0c8146102bb578063558a7297146102c357806362a5af3b146102d657600080fd5b80633644e515146102915780633b5764eb146102995780633bb865b9146102b357600080fd5b80630d2242a9116101765780630d2242a91461023e57806313e7c9d8146102555780631586b3881461028857600080fd5b8063078dfbe71461019257806309be76c9146101a7575b600080fd5b6101a56101a03660046112cc565b6103d7565b005b6004546101f0906001600160901b0381169067ffffffffffffffff600160901b8204169063ffffffff600160d01b8204169060ff600160f01b8204811691600160f81b90041685565b604080516001600160901b03909616865267ffffffffffffffff909416602086015263ffffffff9092169284019290925260ff918216606084015216608082015260a0015b60405180910390f35b61024760035481565b604051908152602001610235565b61027861026336600461130f565b60026020526000908152604090205460ff1681565b6040519015158152602001610235565b61024761012c81565b61024761053d565b6102a1600181565b60405160ff9091168152602001610235565b6102a1600081565b6101a561060f565b6101a56102d1366004611331565b6106d9565b6101a5610792565b6101a5610811565b6000546102f9906001600160a01b031681565b6040516001600160a01b039091168152602001610235565b610247620f424081565b6101a5610329366004611364565b6108ae565b6101a561033c3660046113e6565b610982565b61035461034f3660046114ed565b610d65565b6040516102359190611583565b61024761036f3660046114ed565b610d89565b6103876103823660046115cc565b610d9d565b604080519215158352602083019190915201610235565b6001546102f9906001600160a01b031681565b6101a56103bf36600461167d565b610e4a565b6103876103d23660046114ed565b610efb565b6000546001600160a01b031633146104365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b811561050e576001600160a01b0383161515806104505750805b61049c5760405162461bcd60e51b815260206004820152601560248201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604482015260640161042d565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600180549091169055505050565b600180546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19909116179055505050565b6000467f000000000000000000000000000000000000000000000000000000000000000081146105e757604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f1a4461ab9f0dcef4a35a8660e8bbb361ae4c140fabb5b8c363bd6282ded34a908284015260608201849052306080808401919091528351808403909101815260a09092019092528051910120610609565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6001546001600160a01b031633811461066a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604482015260640161042d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19928316179055600180549091169055565b6000546001600160a01b031633146107335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b3360009081526002602052604090205460ff166107c25760405163de19c8b360e01b815260040160405180910390fd5b6004805460ff60f01b1916600160f01b17905560408051428152600160208201527fb07c78c0c10a182d467af5ad4614b52dd7e8f37f153665394bca2866a38d252091015b60405180910390a1565b6000546001600160a01b0316331461086b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b6004805460ff60f01b1916905560408051428152600060208201527fb07c78c0c10a182d467af5ad4614b52dd7e8f37f153665394bca2866a38d25209101610807565b6000546001600160a01b031633146109085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b63ffffffff8416908102919091179091556040805142815260208101929092527fa9f87fe67efb850d48acefd4d96c627e025b53bac2f7831cf5037daa0355800191015b60405180910390a150565b6040805160a0810182526004546001600160901b038116825267ffffffffffffffff600160901b820416602083015263ffffffff600160d01b8204169282019290925260ff600160f01b830481166060830152600160f81b909204909116608082018190528a1015610a365760405162461bcd60e51b815260206004820152600f60248201527f546f6f20666577207369676e6572730000000000000000000000000000000000604482015260640161042d565b806020015167ffffffffffffffff164203610a935760405162461bcd60e51b815260206004820152600f60248201527f436f6f6c646f776e20706572696f640000000000000000000000000000000000604482015260640161042d565b6000805b8b811015610c0357816001600160a01b03168d8d83818110610abb57610abb6116a0565b9050602002016020810190610ad0919061130f565b6001600160a01b031611610b265760405162461bcd60e51b815260206004820152601160248201527f4475706c696361746564207369676e6572000000000000000000000000000000604482015260640161042d565b610bc88d8d83818110610b3b57610b3b6116a0565b9050602002016020810190610b50919061130f565b8f8d8d85818110610b6357610b636116a0565b905060200201358c8c86818110610b7c57610b7c6116a0565b9050602002016020810190610b91919061167d565b8b8b87818110610ba357610ba36116a0565b905060200201358a8a88818110610bbc57610bbc6116a0565b90506020020135610f49565b8c8c82818110610bda57610bda6116a0565b9050602002016020810190610bef919061130f565b915080610bfb816116cc565b915050610a97565b5081516001600160901b031615610c3f57610c3f82600001516001600160901b03168e6001600160901b0316846040015163ffffffff166111ee565b6040805160a0810182526001600160901b038f168082524267ffffffffffffffff811660208085018290528786015163ffffffff168587018190526060808a015160ff9081169188018290526080808c01519091169701879052600480547fffffffffffff0000000000000000000000000000000000000000000000000000168717600160901b909502949094177fff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b90920260ff60f01b191691909117600160f01b909102176001600160f81b0316600160f81b9095029490941790558351908152918201527f8d5b7dfd36756115de1bf344f2d5268ed31bd23fb5f1fd73233aecba2ebfe5dc910160405180910390a150505050505050505050505050565b6040805180820190915260068152654f7261636c6560d01b60208201525b92915050565b6000610d958383610efb565b949350505050565b6040805160a0810182526004546001600160901b038116825267ffffffffffffffff600160901b820416602083015263ffffffff600160d01b8204169282019290925260ff600160f01b8304811660608301819052600160f81b9093041660808201526000918291908290600114801590610e32575061012c826020015167ffffffffffffffff1642610e3091906116e5565b105b915191956001600160901b0390921694509092505050565b6000546001600160a01b03163314610ea45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b600480546001600160f81b0316600160f81b60ff8416908102919091179091556040805142815260208101929092527f7e5216ced32aeca8e67408772764eb48b7c58cec187b9cca4b300206b68256079101610977565b600080610f3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d9d92505050565b915091505b9250929050565b6001600160a01b03861660009081526002602052604090205460ff16610fb15760405162461bcd60e51b815260206004820152601460248201527f4f7261636c653a206e6f74206f70657261746f72000000000000000000000000604482015260640161042d565b6001600160a01b0386166110135760405162461bcd60e51b815260206004820152602360248201527f5065726d697373696f6e4d67723a204f70657261746f722063616e6e6f74206260448201526206520360ec1b606482015260840161042d565b42841015801561102e575061102a426103846116f8565b8411155b61107a5760405162461bcd60e51b815260206004820152600f60248201527f4f7261636c653a20455850495245440000000000000000000000000000000000604482015260640161042d565b600060405180604001604052806002815260200161190160f01b81525061109f61053d565b604080517f20907ceb44bc150c98ea3e61448c974f15c63306ae5dce6afed9a58ca7d15b7c60208201526001600160901b038a1691810191909152606081018890526080016040516020818303038152906040528051906020012060405160200161110c9392919061170b565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146111e45760405162461bcd60e51b815260206004820152601960248201527f4f7261636c653a20496e76616c6964205369676e617475726500000000000000604482015260640161042d565b5050505050505050565b6000828411611223578261120585620f4240611732565b61120f9190611751565b61121c90620f42406116e5565b905061124b565b8361123184620f4240611732565b61123b9190611751565b61124890620f42406116e5565b90505b81811061129a5760405162461bcd60e51b815260206004820152601060248201527f44656c74612070657263656e7461676500000000000000000000000000000000604482015260640161042d565b50505050565b80356001600160a01b03811681146112b757600080fd5b919050565b803580151581146112b757600080fd5b6000806000606084860312156112e157600080fd5b6112ea846112a0565b92506112f8602085016112bc565b9150611306604085016112bc565b90509250925092565b60006020828403121561132157600080fd5b61132a826112a0565b9392505050565b6000806040838503121561134457600080fd5b61134d836112a0565b915061135b602084016112bc565b90509250929050565b60006020828403121561137657600080fd5b813563ffffffff8116811461132a57600080fd5b80356001600160901b03811681146112b757600080fd5b60008083601f8401126113b357600080fd5b50813567ffffffffffffffff8111156113cb57600080fd5b6020830191508360208260051b8501011115610f4257600080fd5b600080600080600080600080600080600060c08c8e03121561140757600080fd5b6114108c61138a565b9a5067ffffffffffffffff8060208e0135111561142c57600080fd5b61143c8e60208f01358f016113a1565b909b50995060408d013581101561145257600080fd5b6114628e60408f01358f016113a1565b909950975060608d013581101561147857600080fd5b6114888e60608f01358f016113a1565b909750955060808d013581101561149e57600080fd5b6114ae8e60808f01358f016113a1565b909550935060a08d01358110156114c457600080fd5b506114d58d60a08e01358e016113a1565b81935080925050509295989b509295989b9093969950565b6000806020838503121561150057600080fd5b823567ffffffffffffffff8082111561151857600080fd5b818501915085601f83011261152c57600080fd5b81358181111561153b57600080fd5b86602082850101111561154d57600080fd5b60209290920196919550909350505050565b60005b8381101561157a578181015183820152602001611562565b50506000910152565b60208152600082518060208401526115a281604085016020870161155f565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156115de57600080fd5b813567ffffffffffffffff808211156115f657600080fd5b818401915084601f83011261160a57600080fd5b81358181111561161c5761161c6115b6565b604051601f8201601f19908116603f01168101908382118183101715611644576116446115b6565b8160405282815287602084870101111561165d57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561168f57600080fd5b813560ff8116811461132a57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016116de576116de6116b6565b5060010190565b81810381811115610d8357610d836116b6565b80820180821115610d8357610d836116b6565b6000845161171d81846020890161155f565b91909101928352506020820152604001919050565b600081600019048311821515161561174c5761174c6116b6565b500290565b60008261176e57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205639b058a22ddf2d254064c972aea87dc6b74a25bc1271c695b2dac5c284091b64736f6c634300081000338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000001da4ebf84afae68915206855213a70a4fb693da6

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80636a28f000116100e3578063d39bbef01161008c578063e30c397811610066578063e30c39781461039e578063e5a98603146103b1578063eeb8a8d3146103c457600080fd5b8063d39bbef014610361578063d568866c14610341578063d6d7d5251461037457600080fd5b8063abee062b116100bd578063abee062b1461031b578063b27938bf1461032e578063c699c4d61461034157600080fd5b80636a28f000146102de5780638da5cb5b146102e6578063aaf5eb681461031157600080fd5b80633644e515116101455780634e71e0c81161011f5780634e71e0c8146102bb578063558a7297146102c357806362a5af3b146102d657600080fd5b80633644e515146102915780633b5764eb146102995780633bb865b9146102b357600080fd5b80630d2242a9116101765780630d2242a91461023e57806313e7c9d8146102555780631586b3881461028857600080fd5b8063078dfbe71461019257806309be76c9146101a7575b600080fd5b6101a56101a03660046112cc565b6103d7565b005b6004546101f0906001600160901b0381169067ffffffffffffffff600160901b8204169063ffffffff600160d01b8204169060ff600160f01b8204811691600160f81b90041685565b604080516001600160901b03909616865267ffffffffffffffff909416602086015263ffffffff9092169284019290925260ff918216606084015216608082015260a0015b60405180910390f35b61024760035481565b604051908152602001610235565b61027861026336600461130f565b60026020526000908152604090205460ff1681565b6040519015158152602001610235565b61024761012c81565b61024761053d565b6102a1600181565b60405160ff9091168152602001610235565b6102a1600081565b6101a561060f565b6101a56102d1366004611331565b6106d9565b6101a5610792565b6101a5610811565b6000546102f9906001600160a01b031681565b6040516001600160a01b039091168152602001610235565b610247620f424081565b6101a5610329366004611364565b6108ae565b6101a561033c3660046113e6565b610982565b61035461034f3660046114ed565b610d65565b6040516102359190611583565b61024761036f3660046114ed565b610d89565b6103876103823660046115cc565b610d9d565b604080519215158352602083019190915201610235565b6001546102f9906001600160a01b031681565b6101a56103bf36600461167d565b610e4a565b6103876103d23660046114ed565b610efb565b6000546001600160a01b031633146104365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b811561050e576001600160a01b0383161515806104505750805b61049c5760405162461bcd60e51b815260206004820152601560248201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604482015260640161042d565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600180549091169055505050565b600180546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19909116179055505050565b6000467f000000000000000000000000000000000000000000000000000000000000000181146105e757604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f1a4461ab9f0dcef4a35a8660e8bbb361ae4c140fabb5b8c363bd6282ded34a908284015260608201849052306080808401919091528351808403909101815260a09092019092528051910120610609565b7f908fa95e2404b83a5db7b1d36897c689bc0c8afdbfca781ccc274d3fe381aa2c5b91505090565b6001546001600160a01b031633811461066a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604482015260640161042d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19928316179055600180549091169055565b6000546001600160a01b031633146107335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915591519182527f193de8d500b5cb7b720089b258a39e9c1d0b840019a73ae7c51c3f9101732b02910160405180910390a25050565b3360009081526002602052604090205460ff166107c25760405163de19c8b360e01b815260040160405180910390fd5b6004805460ff60f01b1916600160f01b17905560408051428152600160208201527fb07c78c0c10a182d467af5ad4614b52dd7e8f37f153665394bca2866a38d252091015b60405180910390a1565b6000546001600160a01b0316331461086b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b6004805460ff60f01b1916905560408051428152600060208201527fb07c78c0c10a182d467af5ad4614b52dd7e8f37f153665394bca2866a38d25209101610807565b6000546001600160a01b031633146109085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b600480547fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b63ffffffff8416908102919091179091556040805142815260208101929092527fa9f87fe67efb850d48acefd4d96c627e025b53bac2f7831cf5037daa0355800191015b60405180910390a150565b6040805160a0810182526004546001600160901b038116825267ffffffffffffffff600160901b820416602083015263ffffffff600160d01b8204169282019290925260ff600160f01b830481166060830152600160f81b909204909116608082018190528a1015610a365760405162461bcd60e51b815260206004820152600f60248201527f546f6f20666577207369676e6572730000000000000000000000000000000000604482015260640161042d565b806020015167ffffffffffffffff164203610a935760405162461bcd60e51b815260206004820152600f60248201527f436f6f6c646f776e20706572696f640000000000000000000000000000000000604482015260640161042d565b6000805b8b811015610c0357816001600160a01b03168d8d83818110610abb57610abb6116a0565b9050602002016020810190610ad0919061130f565b6001600160a01b031611610b265760405162461bcd60e51b815260206004820152601160248201527f4475706c696361746564207369676e6572000000000000000000000000000000604482015260640161042d565b610bc88d8d83818110610b3b57610b3b6116a0565b9050602002016020810190610b50919061130f565b8f8d8d85818110610b6357610b636116a0565b905060200201358c8c86818110610b7c57610b7c6116a0565b9050602002016020810190610b91919061167d565b8b8b87818110610ba357610ba36116a0565b905060200201358a8a88818110610bbc57610bbc6116a0565b90506020020135610f49565b8c8c82818110610bda57610bda6116a0565b9050602002016020810190610bef919061130f565b915080610bfb816116cc565b915050610a97565b5081516001600160901b031615610c3f57610c3f82600001516001600160901b03168e6001600160901b0316846040015163ffffffff166111ee565b6040805160a0810182526001600160901b038f168082524267ffffffffffffffff811660208085018290528786015163ffffffff168587018190526060808a015160ff9081169188018290526080808c01519091169701879052600480547fffffffffffff0000000000000000000000000000000000000000000000000000168717600160901b909502949094177fff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff16600160d01b90920260ff60f01b191691909117600160f01b909102176001600160f81b0316600160f81b9095029490941790558351908152918201527f8d5b7dfd36756115de1bf344f2d5268ed31bd23fb5f1fd73233aecba2ebfe5dc910160405180910390a150505050505050505050505050565b6040805180820190915260068152654f7261636c6560d01b60208201525b92915050565b6000610d958383610efb565b949350505050565b6040805160a0810182526004546001600160901b038116825267ffffffffffffffff600160901b820416602083015263ffffffff600160d01b8204169282019290925260ff600160f01b8304811660608301819052600160f81b9093041660808201526000918291908290600114801590610e32575061012c826020015167ffffffffffffffff1642610e3091906116e5565b105b915191956001600160901b0390921694509092505050565b6000546001600160a01b03163314610ea45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042d565b600480546001600160f81b0316600160f81b60ff8416908102919091179091556040805142815260208101929092527f7e5216ced32aeca8e67408772764eb48b7c58cec187b9cca4b300206b68256079101610977565b600080610f3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d9d92505050565b915091505b9250929050565b6001600160a01b03861660009081526002602052604090205460ff16610fb15760405162461bcd60e51b815260206004820152601460248201527f4f7261636c653a206e6f74206f70657261746f72000000000000000000000000604482015260640161042d565b6001600160a01b0386166110135760405162461bcd60e51b815260206004820152602360248201527f5065726d697373696f6e4d67723a204f70657261746f722063616e6e6f74206260448201526206520360ec1b606482015260840161042d565b42841015801561102e575061102a426103846116f8565b8411155b61107a5760405162461bcd60e51b815260206004820152600f60248201527f4f7261636c653a20455850495245440000000000000000000000000000000000604482015260640161042d565b600060405180604001604052806002815260200161190160f01b81525061109f61053d565b604080517f20907ceb44bc150c98ea3e61448c974f15c63306ae5dce6afed9a58ca7d15b7c60208201526001600160901b038a1691810191909152606081018890526080016040516020818303038152906040528051906020012060405160200161110c9392919061170b565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146111e45760405162461bcd60e51b815260206004820152601960248201527f4f7261636c653a20496e76616c6964205369676e617475726500000000000000604482015260640161042d565b5050505050505050565b6000828411611223578261120585620f4240611732565b61120f9190611751565b61121c90620f42406116e5565b905061124b565b8361123184620f4240611732565b61123b9190611751565b61124890620f42406116e5565b90505b81811061129a5760405162461bcd60e51b815260206004820152601060248201527f44656c74612070657263656e7461676500000000000000000000000000000000604482015260640161042d565b50505050565b80356001600160a01b03811681146112b757600080fd5b919050565b803580151581146112b757600080fd5b6000806000606084860312156112e157600080fd5b6112ea846112a0565b92506112f8602085016112bc565b9150611306604085016112bc565b90509250925092565b60006020828403121561132157600080fd5b61132a826112a0565b9392505050565b6000806040838503121561134457600080fd5b61134d836112a0565b915061135b602084016112bc565b90509250929050565b60006020828403121561137657600080fd5b813563ffffffff8116811461132a57600080fd5b80356001600160901b03811681146112b757600080fd5b60008083601f8401126113b357600080fd5b50813567ffffffffffffffff8111156113cb57600080fd5b6020830191508360208260051b8501011115610f4257600080fd5b600080600080600080600080600080600060c08c8e03121561140757600080fd5b6114108c61138a565b9a5067ffffffffffffffff8060208e0135111561142c57600080fd5b61143c8e60208f01358f016113a1565b909b50995060408d013581101561145257600080fd5b6114628e60408f01358f016113a1565b909950975060608d013581101561147857600080fd5b6114888e60608f01358f016113a1565b909750955060808d013581101561149e57600080fd5b6114ae8e60808f01358f016113a1565b909550935060a08d01358110156114c457600080fd5b506114d58d60a08e01358e016113a1565b81935080925050509295989b509295989b9093969950565b6000806020838503121561150057600080fd5b823567ffffffffffffffff8082111561151857600080fd5b818501915085601f83011261152c57600080fd5b81358181111561153b57600080fd5b86602082850101111561154d57600080fd5b60209290920196919550909350505050565b60005b8381101561157a578181015183820152602001611562565b50506000910152565b60208152600082518060208401526115a281604085016020870161155f565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156115de57600080fd5b813567ffffffffffffffff808211156115f657600080fd5b818401915084601f83011261160a57600080fd5b81358181111561161c5761161c6115b6565b604051601f8201601f19908116603f01168101908382118183101715611644576116446115b6565b8160405282815287602084870101111561165d57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561168f57600080fd5b813560ff8116811461132a57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016116de576116de6116b6565b5060010190565b81810381811115610d8357610d836116b6565b80820180821115610d8357610d836116b6565b6000845161171d81846020890161155f565b91909101928352506020820152604001919050565b600081600019048311821515161561174c5761174c6116b6565b500290565b60008261176e57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212205639b058a22ddf2d254064c972aea87dc6b74a25bc1271c695b2dac5c284091b64736f6c63430008100033

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

0000000000000000000000001da4ebf84afae68915206855213a70a4fb693da6

-----Decoded View---------------
Arg [0] : to (address): 0x1dA4EbF84afAE68915206855213a70A4Fb693Da6

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001da4ebf84afae68915206855213a70a4fb693da6


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
Loading...
Loading
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.