ETH Price: $3,068.06 (-6.81%)
Gas: 9 Gwei

Contract

0x0818Ad7016138f0A40DFAe30F64a923c2A8F61bA
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Update Aggregato...158902472022-11-03 15:00:35609 days ago1667487635IN
0x0818Ad70...c2A8F61bA
0 ETH0.0019158923.67402177
Update Aggregato...158492972022-10-28 21:38:11615 days ago1666993091IN
0x0818Ad70...c2A8F61bA
0 ETH0.0014598129.25197734
Update Aggregato...158163912022-10-24 7:11:59619 days ago1666595519IN
0x0818Ad70...c2A8F61bA
0 ETH0.000983612.15225995
Add Whitelist Ad...144482122022-03-24 9:42:18833 days ago1648114938IN
0x0818Ad70...c2A8F61bA
0 ETH0.0012468125.85617332
0x60806040144482102022-03-24 9:41:49833 days ago1648114909IN
 Create: ChainlinkConversionPath
0 ETH0.0456895125.85617332

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainlinkConversionPath

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : ChainlinkConversionPath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import './legacy_openzeppelin/contracts/access/roles/WhitelistAdminRole.sol';

interface ERC20fraction {
    function decimals() external view returns (uint8);
}

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

    function latestAnswer() external view returns (int256);

    function latestTimestamp() external view returns (uint256);
}

/**
 * @title ChainlinkConversionPath
 *
 * @notice ChainlinkConversionPath is a contract computing currency conversion rates based on Chainlink aggretators
 */
contract ChainlinkConversionPath is WhitelistAdminRole {
    uint256 constant PRECISION = 1e18;
    uint256 constant NATIVE_TOKEN_DECIMALS = 18;
    uint256 constant FIAT_DECIMALS = 8;
    address public nativeTokenHash;

    /**
     * @param _nativeTokenHash hash of the native token
     */
    constructor(address _nativeTokenHash) {
        nativeTokenHash = _nativeTokenHash;
    }

    // Mapping of Chainlink aggregators (input currency => output currency => contract address)
    // input & output currencies are the addresses of the ERC20 contracts OR the sha3("currency code")
    mapping(address => mapping(address => address)) public allAggregators;

    // declare a new aggregator
    event AggregatorUpdated(address _input, address _output, address _aggregator);

    /**
     * @notice Update an aggregator
     * @param _input address representing the input currency
     * @param _output address representing the output currency
     * @param _aggregator address of the aggregator contract
     */
    function updateAggregator(
        address _input,
        address _output,
        address _aggregator
    ) external onlyWhitelistAdmin {
        allAggregators[_input][_output] = _aggregator;
        emit AggregatorUpdated(_input, _output, _aggregator);
    }

    /**
     * @notice Update a list of aggregators
     * @param _inputs list of addresses representing the input currencies
     * @param _outputs list of addresses representing the output currencies
     * @param _aggregators list of addresses of the aggregator contracts
     */
    function updateAggregatorsList(
        address[] calldata _inputs,
        address[] calldata _outputs,
        address[] calldata _aggregators
    ) external onlyWhitelistAdmin {
        require(_inputs.length == _outputs.length, 'arrays must have the same length');
        require(_inputs.length == _aggregators.length, 'arrays must have the same length');

        // For every conversions of the path
        for (uint256 i; i < _inputs.length; i++) {
            allAggregators[_inputs[i]][_outputs[i]] = _aggregators[i];
            emit AggregatorUpdated(_inputs[i], _outputs[i], _aggregators[i]);
        }
    }

    /**
     * @notice Computes the conversion of an amount through a list of intermediate conversions
     * @param _amountIn Amount to convert
     * @param _path List of addresses representing the currencies for the intermediate conversions
     * @return result The result after all the conversions
     * @return oldestRateTimestamp The oldest timestamp of the path
     */
    function getConversion(uint256 _amountIn, address[] calldata _path)
        external
        view
        returns (uint256 result, uint256 oldestRateTimestamp)
    {
        (uint256 rate, uint256 timestamp, uint256 decimals) = getRate(_path);

        // initialize the result
        result = (_amountIn * rate) / decimals;

        oldestRateTimestamp = timestamp;
    }

    /**
     * @notice Computes the conversion rate from a list of currencies
     * @param _path List of addresses representing the currencies for the conversions
     * @return rate The rate
     * @return oldestRateTimestamp The oldest timestamp of the path
     * @return decimals of the conversion rate
     */
    function getRate(address[] memory _path)
        public
        view
        returns (
            uint256 rate,
            uint256 oldestRateTimestamp,
            uint256 decimals
        )
    {
        // initialize the result with 18 decimals (for more precision)
        rate = PRECISION;
        decimals = PRECISION;
        oldestRateTimestamp = block.timestamp;

        // For every conversion of the path
        for (uint256 i; i < _path.length - 1; i++) {
            (
                AggregatorFraction aggregator,
                bool reverseAggregator,
                uint256 decimalsInput,
                uint256 decimalsOutput
            ) = getAggregatorAndDecimals(_path[i], _path[i + 1]);

            // store the latest timestamp of the path
            uint256 currentTimestamp = aggregator.latestTimestamp();
            if (currentTimestamp < oldestRateTimestamp) {
                oldestRateTimestamp = currentTimestamp;
            }

            // get the rate of the current step
            uint256 currentRate = uint256(aggregator.latestAnswer());
            // get the number of decimals of the current rate
            uint256 decimalsAggregator = uint256(aggregator.decimals());

            // mul with the difference of decimals before the current rate computation (for more precision)
            if (decimalsAggregator > decimalsInput) {
                rate = rate * (10**(decimalsAggregator - decimalsInput));
            }
            if (decimalsAggregator < decimalsOutput) {
                rate = rate * (10**(decimalsOutput - decimalsAggregator));
            }

            // Apply the current rate (if path uses an aggregator in the reverse way, div instead of mul)
            if (reverseAggregator) {
                rate = (rate * (10**decimalsAggregator)) / currentRate;
            } else {
                rate = (rate * currentRate) / (10**decimalsAggregator);
            }

            // div with the difference of decimals AFTER the current rate computation (for more precision)
            if (decimalsAggregator < decimalsInput) {
                rate = rate / (10**(decimalsInput - decimalsAggregator));
            }
            if (decimalsAggregator > decimalsOutput) {
                rate = rate / (10**(decimalsAggregator - decimalsOutput));
            }
        }
    }

    /**
     * @notice Gets aggregators and decimals of two currencies
     * @param _input input Address
     * @param _output output Address
     * @return aggregator to get the rate between the two currencies
     * @return reverseAggregator true if the aggregator returned give the rate from _output to _input
     * @return decimalsInput decimals of _input
     * @return decimalsOutput decimals of _output
     */
    function getAggregatorAndDecimals(address _input, address _output)
        private
        view
        returns (
            AggregatorFraction aggregator,
            bool reverseAggregator,
            uint256 decimalsInput,
            uint256 decimalsOutput
        )
    {
        // Try to get the right aggregator for the conversion
        aggregator = AggregatorFraction(allAggregators[_input][_output]);
        reverseAggregator = false;

        // if no aggregator found we try to find an aggregator in the reverse way
        if (address(aggregator) == address(0x00)) {
            aggregator = AggregatorFraction(allAggregators[_output][_input]);
            reverseAggregator = true;
        }

        require(address(aggregator) != address(0x00), 'No aggregator found');

        // get the decimals for the two currencies
        decimalsInput = getDecimals(_input);
        decimalsOutput = getDecimals(_output);
    }

    /**
     * @notice Gets decimals from an address currency
     * @param _addr address to check
     * @return decimals number of decimals
     */
    function getDecimals(address _addr) private view returns (uint256 decimals) {
        // by default we assume it is fiat
        decimals = FIAT_DECIMALS;
        // if address is the hash of the ETH currency
        if (_addr == nativeTokenHash) {
            decimals = NATIVE_TOKEN_DECIMALS;
        } else if (isContract(_addr)) {
            // otherwise, we get the decimals from the erc20 directly
            decimals = ERC20fraction(_addr).decimals();
        }
    }

    /**
     * @notice Checks if an address is a contract
     * @param _addr Address to check
     * @return true if the address hosts a contract, false otherwise
     */
    function isContract(address _addr) private view returns (bool) {
        uint32 size;
        // solium-disable security/no-inline-assembly
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
}

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

import '@openzeppelin/contracts/utils/Context.sol';
import "../Roles.sol";

/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
abstract contract WhitelistAdminRole is Context {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () {
        _addWhitelistAdmin(_msgSender());
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(_msgSender());
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

File 3 of 4 : Context.sol
// SPDX-License-Identifier: MIT
// 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;
    }
}

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

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nativeTokenHash","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_input","type":"address"},{"indexed":false,"internalType":"address","name":"_output","type":"address"},{"indexed":false,"internalType":"address","name":"_aggregator","type":"address"}],"name":"AggregatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allAggregators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getConversion","outputs":[{"internalType":"uint256","name":"result","type":"uint256"},{"internalType":"uint256","name":"oldestRateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"oldestRateTimestamp","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenHash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"address","name":"_aggregator","type":"address"}],"name":"updateAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_inputs","type":"address[]"},{"internalType":"address[]","name":"_outputs","type":"address[]"},{"internalType":"address[]","name":"_aggregators","type":"address[]"}],"name":"updateAggregatorsList","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002249380380620022498339818101604052810190620000379190620002f0565b620000576200004b6200009f60201b60201c565b620000a760201b60201c565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200043d565b600033905090565b620000c28160006200010860201b62000ace1790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6200011a8282620001bb60201b60201c565b156200015d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001549062000383565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200022f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000226906200041b565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002b8826200028b565b9050919050565b620002ca81620002ab565b8114620002d657600080fd5b50565b600081519050620002ea81620002bf565b92915050565b60006020828403121562000309576200030862000286565b5b60006200031984828501620002d9565b91505092915050565b600082825260208201905092915050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b60006200036b601f8362000322565b9150620003788262000333565b602082019050919050565b600060208201905081810360008301526200039e816200035c565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200040360228362000322565b91506200041082620003a5565b604082019050919050565b600060208201905081810360008301526200043681620003f4565b9050919050565b611dfc806200044d6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c806397edd4fa1161006657806397edd4fa1461010a578063a3d7afa31461013c578063bb5f747b14610158578063d515bb0314610188578063fbd4122a146101a657610093565b806308d5bc58146100985780634b6c8879146100c85780634c5a628c146100e45780637362d9c8146100ee575b600080fd5b6100b260048036038101906100ad919061113a565b6101d7565b6040516100bf9190611189565b60405180910390f35b6100e260048036038101906100dd91906111a4565b610219565b005b6100ec610363565b005b610108600480360381019061010391906111f7565b610375565b005b610124600480360381019061011f919061137d565b6103d0565b604051610133939291906113df565b60405180910390f35b61015660048036038101906101519190611471565b610723565b005b610172600480360381019061016d91906111f7565b610a0c565b60405161017f9190611540565b60405180910390f35b610190610a29565b60405161019d9190611189565b60405180910390f35b6101c060048036038101906101bb9190611587565b610a4f565b6040516101ce9291906115e7565b60405180910390f35b60026020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610229610224610b76565b610a0c565b610268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025f90611693565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf838383604051610356939291906116b3565b60405180910390a1505050565b61037361036e610b76565b610b7e565b565b610385610380610b76565b610a0c565b6103c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bb90611693565b60405180910390fd5b6103cd81610bd8565b50565b6000806000670de0b6b3a76400009250670de0b6b3a7640000905042915060005b600185516103ff9190611719565b81101561071b576000806000806104568986815181106104225761042161174d565b5b60200260200101518a600188610438919061177c565b815181106104495761044861174d565b5b6020026020010151610c32565b935093509350935060008473ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a657600080fd5b505afa1580156104ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104de91906117e7565b9050878110156104ec578097505b60008573ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053457600080fd5b505afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c919061184a565b905060008673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b657600080fd5b505afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee91906118b0565b60ff169050848111156106215784816106079190611719565b600a6106139190611a10565b8b61061e9190611a5b565b9a505b8381101561064f5780846106359190611719565b600a6106419190611a10565b8b61064c9190611a5b565b9a505b851561067f578181600a6106639190611a10565b8c61066e9190611a5b565b6106789190611ae4565b9a506106a5565b80600a61068c9190611a10565b828c6106989190611a5b565b6106a29190611ae4565b9a505b848110156106d35780856106b99190611719565b600a6106c59190611a10565b8b6106d09190611ae4565b9a505b838111156107015783816106e79190611719565b600a6106f39190611a10565b8b6106fe9190611ae4565b9a505b50505050505050808061071390611b15565b9150506103f1565b509193909250565b61073361072e610b76565b610a0c565b610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990611693565b60405180910390fd5b8383905086869050146107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190611baa565b60405180910390fd5b818190508686905014610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f990611baa565b60405180910390fd5b60005b86869050811015610a03578282828181106108235761082261174d565b5b905060200201602081019061083891906111f7565b6002600089898581811061084f5761084e61174d565b5b905060200201602081019061086491906111f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106108b3576108b261174d565b5b90506020020160208101906108c891906111f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf8787838181106109745761097361174d565b5b905060200201602081019061098991906111f7565b86868481811061099c5761099b61174d565b5b90506020020160208101906109b191906111f7565b8585858181106109c4576109c361174d565b5b90506020020160208101906109d991906111f7565b6040516109e8939291906116b3565b60405180910390a180806109fb90611b15565b915050610805565b50505050505050565b6000610a22826000610e4390919063ffffffff16565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000610aa1878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506103d0565b925092509250808389610ab49190611a5b565b610abe9190611ae4565b9450819350505050935093915050565b610ad88282610e43565b15610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611c16565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b610b92816000610f0b90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b610bec816000610ace90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b600080600080600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060009250600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610db457600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350600192505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90611c82565b60405180910390fd5b610e2d86610fb2565b9150610e3885610fb2565b905092959194509250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90611d14565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f158282610e43565b610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90611da6565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060089050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101757601290506110aa565b611020826110af565b156110a9578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561106b57600080fd5b505afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a391906118b0565b60ff1690505b5b919050565b600080823b905060008163ffffffff1611915050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611107826110dc565b9050919050565b611117816110fc565b811461112257600080fd5b50565b6000813590506111348161110e565b92915050565b60008060408385031215611151576111506110d2565b5b600061115f85828601611125565b925050602061117085828601611125565b9150509250929050565b611183816110fc565b82525050565b600060208201905061119e600083018461117a565b92915050565b6000806000606084860312156111bd576111bc6110d2565b5b60006111cb86828701611125565b93505060206111dc86828701611125565b92505060406111ed86828701611125565b9150509250925092565b60006020828403121561120d5761120c6110d2565b5b600061121b84828501611125565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61127282611229565b810181811067ffffffffffffffff821117156112915761129061123a565b5b80604052505050565b60006112a46110c8565b90506112b08282611269565b919050565b600067ffffffffffffffff8211156112d0576112cf61123a565b5b602082029050602081019050919050565b600080fd5b60006112f96112f4846112b5565b61129a565b9050808382526020820190506020840283018581111561131c5761131b6112e1565b5b835b8181101561134557806113318882611125565b84526020840193505060208101905061131e565b5050509392505050565b600082601f83011261136457611363611224565b5b81356113748482602086016112e6565b91505092915050565b600060208284031215611393576113926110d2565b5b600082013567ffffffffffffffff8111156113b1576113b06110d7565b5b6113bd8482850161134f565b91505092915050565b6000819050919050565b6113d9816113c6565b82525050565b60006060820190506113f460008301866113d0565b61140160208301856113d0565b61140e60408301846113d0565b949350505050565b600080fd5b60008083601f84011261143157611430611224565b5b8235905067ffffffffffffffff81111561144e5761144d611416565b5b60208301915083602082028301111561146a576114696112e1565b5b9250929050565b6000806000806000806060878903121561148e5761148d6110d2565b5b600087013567ffffffffffffffff8111156114ac576114ab6110d7565b5b6114b889828a0161141b565b9650965050602087013567ffffffffffffffff8111156114db576114da6110d7565b5b6114e789828a0161141b565b9450945050604087013567ffffffffffffffff81111561150a576115096110d7565b5b61151689828a0161141b565b92509250509295509295509295565b60008115159050919050565b61153a81611525565b82525050565b60006020820190506115556000830184611531565b92915050565b611564816113c6565b811461156f57600080fd5b50565b6000813590506115818161155b565b92915050565b6000806000604084860312156115a05761159f6110d2565b5b60006115ae86828701611572565b935050602084013567ffffffffffffffff8111156115cf576115ce6110d7565b5b6115db8682870161141b565b92509250509250925092565b60006040820190506115fc60008301856113d0565b61160960208301846113d0565b9392505050565b600082825260208201905092915050565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015250565b600061167d604083611610565b915061168882611621565b604082019050919050565b600060208201905081810360008301526116ac81611670565b9050919050565b60006060820190506116c8600083018661117a565b6116d5602083018561117a565b6116e2604083018461117a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611724826113c6565b915061172f836113c6565b925082821015611742576117416116ea565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611787826113c6565b9150611792836113c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156117c7576117c66116ea565b5b828201905092915050565b6000815190506117e18161155b565b92915050565b6000602082840312156117fd576117fc6110d2565b5b600061180b848285016117d2565b91505092915050565b6000819050919050565b61182781611814565b811461183257600080fd5b50565b6000815190506118448161181e565b92915050565b6000602082840312156118605761185f6110d2565b5b600061186e84828501611835565b91505092915050565b600060ff82169050919050565b61188d81611877565b811461189857600080fd5b50565b6000815190506118aa81611884565b92915050565b6000602082840312156118c6576118c56110d2565b5b60006118d48482850161189b565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115611934578086048111156119105761190f6116ea565b5b600185161561191f5780820291505b808102905061192d856118dd565b94506118f4565b94509492505050565b60008261194d5760019050611a09565b8161195b5760009050611a09565b8160018114611971576002811461197b576119aa565b6001915050611a09565b60ff84111561198d5761198c6116ea565b5b8360020a9150848211156119a4576119a36116ea565b5b50611a09565b5060208310610133831016604e8410600b84101617156119df5782820a9050838111156119da576119d96116ea565b5b611a09565b6119ec84848460016118ea565b92509050818404811115611a0357611a026116ea565b5b81810290505b9392505050565b6000611a1b826113c6565b9150611a26836113c6565b9250611a537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461193d565b905092915050565b6000611a66826113c6565b9150611a71836113c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611aaa57611aa96116ea565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611aef826113c6565b9150611afa836113c6565b925082611b0a57611b09611ab5565b5b828204905092915050565b6000611b20826113c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611b5357611b526116ea565b5b600182019050919050565b7f617272617973206d7573742068617665207468652073616d65206c656e677468600082015250565b6000611b94602083611610565b9150611b9f82611b5e565b602082019050919050565b60006020820190508181036000830152611bc381611b87565b9050919050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b6000611c00601f83611610565b9150611c0b82611bca565b602082019050919050565b60006020820190508181036000830152611c2f81611bf3565b9050919050565b7f4e6f2061676772656761746f7220666f756e6400000000000000000000000000600082015250565b6000611c6c601383611610565b9150611c7782611c36565b602082019050919050565b60006020820190508181036000830152611c9b81611c5f565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cfe602283611610565b9150611d0982611ca2565b604082019050919050565b60006020820190508181036000830152611d2d81611cf1565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d90602183611610565b9150611d9b82611d34565b604082019050919050565b60006020820190508181036000830152611dbf81611d83565b905091905056fea2646970667358221220a8ba5a5da9875306267caf4df617f778fbf16f0bed6cc93465e82df75e212f6a64736f6c63430008090033000000000000000000000000f5af88e117747e87fc5929f2ff87221b1447652e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c806397edd4fa1161006657806397edd4fa1461010a578063a3d7afa31461013c578063bb5f747b14610158578063d515bb0314610188578063fbd4122a146101a657610093565b806308d5bc58146100985780634b6c8879146100c85780634c5a628c146100e45780637362d9c8146100ee575b600080fd5b6100b260048036038101906100ad919061113a565b6101d7565b6040516100bf9190611189565b60405180910390f35b6100e260048036038101906100dd91906111a4565b610219565b005b6100ec610363565b005b610108600480360381019061010391906111f7565b610375565b005b610124600480360381019061011f919061137d565b6103d0565b604051610133939291906113df565b60405180910390f35b61015660048036038101906101519190611471565b610723565b005b610172600480360381019061016d91906111f7565b610a0c565b60405161017f9190611540565b60405180910390f35b610190610a29565b60405161019d9190611189565b60405180910390f35b6101c060048036038101906101bb9190611587565b610a4f565b6040516101ce9291906115e7565b60405180910390f35b60026020528160005260406000206020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610229610224610b76565b610a0c565b610268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025f90611693565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf838383604051610356939291906116b3565b60405180910390a1505050565b61037361036e610b76565b610b7e565b565b610385610380610b76565b610a0c565b6103c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103bb90611693565b60405180910390fd5b6103cd81610bd8565b50565b6000806000670de0b6b3a76400009250670de0b6b3a7640000905042915060005b600185516103ff9190611719565b81101561071b576000806000806104568986815181106104225761042161174d565b5b60200260200101518a600188610438919061177c565b815181106104495761044861174d565b5b6020026020010151610c32565b935093509350935060008473ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104a657600080fd5b505afa1580156104ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104de91906117e7565b9050878110156104ec578097505b60008573ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561053457600080fd5b505afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c919061184a565b905060008673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b657600080fd5b505afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee91906118b0565b60ff169050848111156106215784816106079190611719565b600a6106139190611a10565b8b61061e9190611a5b565b9a505b8381101561064f5780846106359190611719565b600a6106419190611a10565b8b61064c9190611a5b565b9a505b851561067f578181600a6106639190611a10565b8c61066e9190611a5b565b6106789190611ae4565b9a506106a5565b80600a61068c9190611a10565b828c6106989190611a5b565b6106a29190611ae4565b9a505b848110156106d35780856106b99190611719565b600a6106c59190611a10565b8b6106d09190611ae4565b9a505b838111156107015783816106e79190611719565b600a6106f39190611a10565b8b6106fe9190611ae4565b9a505b50505050505050808061071390611b15565b9150506103f1565b509193909250565b61073361072e610b76565b610a0c565b610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990611693565b60405180910390fd5b8383905086869050146107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190611baa565b60405180910390fd5b818190508686905014610802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f990611baa565b60405180910390fd5b60005b86869050811015610a03578282828181106108235761082261174d565b5b905060200201602081019061083891906111f7565b6002600089898581811061084f5761084e61174d565b5b905060200201602081019061086491906111f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106108b3576108b261174d565b5b90506020020160208101906108c891906111f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf8787838181106109745761097361174d565b5b905060200201602081019061098991906111f7565b86868481811061099c5761099b61174d565b5b90506020020160208101906109b191906111f7565b8585858181106109c4576109c361174d565b5b90506020020160208101906109d991906111f7565b6040516109e8939291906116b3565b60405180910390a180806109fb90611b15565b915050610805565b50505050505050565b6000610a22826000610e4390919063ffffffff16565b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000610aa1878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506103d0565b925092509250808389610ab49190611a5b565b610abe9190611ae4565b9450819350505050935093915050565b610ad88282610e43565b15610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90611c16565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b610b92816000610f0b90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b610bec816000610ace90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b600080600080600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935060009250600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610db457600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350600192505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90611c82565b60405180910390fd5b610e2d86610fb2565b9150610e3885610fb2565b905092959194509250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab90611d14565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f158282610e43565b610f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4b90611da6565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060089050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101757601290506110aa565b611020826110af565b156110a9578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561106b57600080fd5b505afa15801561107f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a391906118b0565b60ff1690505b5b919050565b600080823b905060008163ffffffff1611915050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611107826110dc565b9050919050565b611117816110fc565b811461112257600080fd5b50565b6000813590506111348161110e565b92915050565b60008060408385031215611151576111506110d2565b5b600061115f85828601611125565b925050602061117085828601611125565b9150509250929050565b611183816110fc565b82525050565b600060208201905061119e600083018461117a565b92915050565b6000806000606084860312156111bd576111bc6110d2565b5b60006111cb86828701611125565b93505060206111dc86828701611125565b92505060406111ed86828701611125565b9150509250925092565b60006020828403121561120d5761120c6110d2565b5b600061121b84828501611125565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61127282611229565b810181811067ffffffffffffffff821117156112915761129061123a565b5b80604052505050565b60006112a46110c8565b90506112b08282611269565b919050565b600067ffffffffffffffff8211156112d0576112cf61123a565b5b602082029050602081019050919050565b600080fd5b60006112f96112f4846112b5565b61129a565b9050808382526020820190506020840283018581111561131c5761131b6112e1565b5b835b8181101561134557806113318882611125565b84526020840193505060208101905061131e565b5050509392505050565b600082601f83011261136457611363611224565b5b81356113748482602086016112e6565b91505092915050565b600060208284031215611393576113926110d2565b5b600082013567ffffffffffffffff8111156113b1576113b06110d7565b5b6113bd8482850161134f565b91505092915050565b6000819050919050565b6113d9816113c6565b82525050565b60006060820190506113f460008301866113d0565b61140160208301856113d0565b61140e60408301846113d0565b949350505050565b600080fd5b60008083601f84011261143157611430611224565b5b8235905067ffffffffffffffff81111561144e5761144d611416565b5b60208301915083602082028301111561146a576114696112e1565b5b9250929050565b6000806000806000806060878903121561148e5761148d6110d2565b5b600087013567ffffffffffffffff8111156114ac576114ab6110d7565b5b6114b889828a0161141b565b9650965050602087013567ffffffffffffffff8111156114db576114da6110d7565b5b6114e789828a0161141b565b9450945050604087013567ffffffffffffffff81111561150a576115096110d7565b5b61151689828a0161141b565b92509250509295509295509295565b60008115159050919050565b61153a81611525565b82525050565b60006020820190506115556000830184611531565b92915050565b611564816113c6565b811461156f57600080fd5b50565b6000813590506115818161155b565b92915050565b6000806000604084860312156115a05761159f6110d2565b5b60006115ae86828701611572565b935050602084013567ffffffffffffffff8111156115cf576115ce6110d7565b5b6115db8682870161141b565b92509250509250925092565b60006040820190506115fc60008301856113d0565b61160960208301846113d0565b9392505050565b600082825260208201905092915050565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015250565b600061167d604083611610565b915061168882611621565b604082019050919050565b600060208201905081810360008301526116ac81611670565b9050919050565b60006060820190506116c8600083018661117a565b6116d5602083018561117a565b6116e2604083018461117a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611724826113c6565b915061172f836113c6565b925082821015611742576117416116ea565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611787826113c6565b9150611792836113c6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156117c7576117c66116ea565b5b828201905092915050565b6000815190506117e18161155b565b92915050565b6000602082840312156117fd576117fc6110d2565b5b600061180b848285016117d2565b91505092915050565b6000819050919050565b61182781611814565b811461183257600080fd5b50565b6000815190506118448161181e565b92915050565b6000602082840312156118605761185f6110d2565b5b600061186e84828501611835565b91505092915050565b600060ff82169050919050565b61188d81611877565b811461189857600080fd5b50565b6000815190506118aa81611884565b92915050565b6000602082840312156118c6576118c56110d2565b5b60006118d48482850161189b565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115611934578086048111156119105761190f6116ea565b5b600185161561191f5780820291505b808102905061192d856118dd565b94506118f4565b94509492505050565b60008261194d5760019050611a09565b8161195b5760009050611a09565b8160018114611971576002811461197b576119aa565b6001915050611a09565b60ff84111561198d5761198c6116ea565b5b8360020a9150848211156119a4576119a36116ea565b5b50611a09565b5060208310610133831016604e8410600b84101617156119df5782820a9050838111156119da576119d96116ea565b5b611a09565b6119ec84848460016118ea565b92509050818404811115611a0357611a026116ea565b5b81810290505b9392505050565b6000611a1b826113c6565b9150611a26836113c6565b9250611a537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461193d565b905092915050565b6000611a66826113c6565b9150611a71836113c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611aaa57611aa96116ea565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611aef826113c6565b9150611afa836113c6565b925082611b0a57611b09611ab5565b5b828204905092915050565b6000611b20826113c6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611b5357611b526116ea565b5b600182019050919050565b7f617272617973206d7573742068617665207468652073616d65206c656e677468600082015250565b6000611b94602083611610565b9150611b9f82611b5e565b602082019050919050565b60006020820190508181036000830152611bc381611b87565b9050919050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b6000611c00601f83611610565b9150611c0b82611bca565b602082019050919050565b60006020820190508181036000830152611c2f81611bf3565b9050919050565b7f4e6f2061676772656761746f7220666f756e6400000000000000000000000000600082015250565b6000611c6c601383611610565b9150611c7782611c36565b602082019050919050565b60006020820190508181036000830152611c9b81611c5f565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611cfe602283611610565b9150611d0982611ca2565b604082019050919050565b60006020820190508181036000830152611d2d81611cf1565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d90602183611610565b9150611d9b82611d34565b604082019050919050565b60006020820190508181036000830152611dbf81611d83565b905091905056fea2646970667358221220a8ba5a5da9875306267caf4df617f778fbf16f0bed6cc93465e82df75e212f6a64736f6c63430008090033

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

000000000000000000000000f5af88e117747e87fc5929f2ff87221b1447652e

-----Decoded View---------------
Arg [0] : _nativeTokenHash (address): 0xF5AF88e117747e87fC5929F2ff87221B1447652E

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5af88e117747e87fc5929f2ff87221b1447652e


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.