ETH Price: $3,328.60 (+0.58%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Send Message388195122025-11-29 14:59:3149 days ago1764428371IN
0xFC82C29a...d4f672079
0 ETH0.000000250.00124224
Send Message388192932025-11-29 14:52:1350 days ago1764427933IN
0xFC82C29a...d4f672079
0 ETH0.000000130.00071997
Send Message387909612025-11-28 23:07:4950 days ago1764371269IN
0xFC82C29a...d4f672079
0 ETH0.000000290.00147383
Send Message387905852025-11-28 22:55:1750 days ago1764370517IN
0xFC82C29a...d4f672079
0 ETH0.000000260.00128526
Send Message387900002025-11-28 22:35:4750 days ago1764369347IN
0xFC82C29a...d4f672079
0 ETH0.000000490.00267478
Send Message387899422025-11-28 22:33:5150 days ago1764369231IN
0xFC82C29a...d4f672079
0 ETH0.000000270.00150575
Send Message387898902025-11-28 22:32:0750 days ago1764369127IN
0xFC82C29a...d4f672079
0 ETH0.000000270.00147155
Send Message387898582025-11-28 22:31:0350 days ago1764369063IN
0xFC82C29a...d4f672079
0 ETH0.000000490.00269134
Send Message387898432025-11-28 22:30:3350 days ago1764369033IN
0xFC82C29a...d4f672079
0 ETH0.000000450.00245783
Send Message387888062025-11-28 21:55:5950 days ago1764366959IN
0xFC82C29a...d4f672079
0 ETH0.000000210.00114551
Send Message387807192025-11-28 17:26:2550 days ago1764350785IN
0xFC82C29a...d4f672079
0 ETH0.00000080.00434127
Send Message387798002025-11-28 16:55:4750 days ago1764348947IN
0xFC82C29a...d4f672079
0 ETH0.000000520.00280219
Send Message387584022025-11-28 5:02:3151 days ago1764306151IN
0xFC82C29a...d4f672079
0 ETH0.000000310.00170667
Send Message387560392025-11-28 3:43:4551 days ago1764301425IN
0xFC82C29a...d4f672079
0 ETH0.000000390.00194464
Send Message387552822025-11-28 3:18:3151 days ago1764299911IN
0xFC82C29a...d4f672079
0 ETH0.000000330.0016487
Send Message387552482025-11-28 3:17:2351 days ago1764299843IN
0xFC82C29a...d4f672079
0 ETH0.000000520.00239024
Set Message Fee387538192025-11-28 2:29:4551 days ago1764296985IN
0xFC82C29a...d4f672079
0 ETH0.000000010.00044556

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainMail

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

/// @title Voidly ChainMail
/// @author voidly.ai
/// @notice Minimal, audit‑friendly on‑chain registry for end‑to‑end encrypted messages.
/// @dev Stores only opaque encrypted payloads + metadata. No plaintext ever touches the chain.
///      All privacy comes from your crypto; this contract just timestamps and routes.

contract ChainMail {
    /// -----------------------------------------------------------------------
    /// Errors
    /// -----------------------------------------------------------------------
    error InvalidRecipient();
    error MessageNotFound();
    error Unauthorized();
    error AlreadyDeleted();
    error PayloadTooLarge();
    error EmptyPayload();
    error InsufficientFee();
    error ContractPaused();
    error SelfSendNotAllowed();
    error InvalidPagination();

    /// -----------------------------------------------------------------------
    /// Types
    /// -----------------------------------------------------------------------

    /// @notice Opaque message metadata + encrypted payload.
    /// @dev `encryptedPayload` is application‑defined bytes (e.g. encrypted JSON blob).
    struct Message {
        address sender;          // wallet that sent the message
        address recipient;       // wallet that should be able to decrypt
        bytes32 topic;           // optional: thread / conversation / label id
        bool oneTime;            // hint for one‑time view semantics (enforced off‑chain)
        bool deleted;            // soft‑delete flag for sender/recipient UX
        uint64 createdAt;        // unix timestamp (seconds)
        bytes encryptedPayload;  // opaque ciphertext
    }

    /// -----------------------------------------------------------------------
    /// Constants
    /// -----------------------------------------------------------------------

    /// @notice Max size for encrypted payload (256 KB)
    /// @dev Prevents DOS via huge payloads. Adjust based on your use case.
    uint256 public constant MAX_PAYLOAD_SIZE = 256 * 1024;

    /// @notice Minimum fee to send a message (anti-spam)
    /// @dev Set to 0.0001 ETH. Owner can adjust via setMessageFee().
    uint256 public messageFee = 0.0001 ether;

    /// @notice Maximum pagination limit to prevent gas issues
    uint256 public constant MAX_PAGINATION_LIMIT = 100;

    /// -----------------------------------------------------------------------
    /// Storage
    /// -----------------------------------------------------------------------

    // Contract owner (can pause/unpause, adjust fees)
    address public owner;

    // Emergency pause flag
    bool public paused;

    // Reentrancy guard
    uint256 private _locked;

    // Auto‑incrementing message ID (starts at 1 so "0" is an obvious sentinel).
    uint256 private _nextMessageId = 1;

    // messageId => Message
    mapping(uint256 => Message) private _messages;

    // Simple inbox/outbox indexes for wallets.
    mapping(address => uint256[]) private _inboxByAddress;
    mapping(address => uint256[]) private _outboxByAddress;

    /// -----------------------------------------------------------------------
    /// Events
    /// -----------------------------------------------------------------------

    /// @notice Emitted whenever a new encrypted message is registered on‑chain.
    /// @dev Indexer can follow this to build inbox/outbox views.
    event MessageSent(
        uint256 indexed messageId,
        address indexed sender,
        address indexed recipient,
        bytes32 topic,
        bool oneTime,
        uint64 createdAt
    );

    /// @notice Emitted when a message is soft‑deleted by sender or recipient.
    event MessageDeleted(
        uint256 indexed messageId,
        address indexed by,
        uint64 timestamp
    );

    /// @notice Emitted when owner changes message fee.
    event MessageFeeUpdated(uint256 oldFee, uint256 newFee);

    /// @notice Emitted when contract is paused/unpaused.
    event PauseStatusChanged(bool isPaused);

    /// @notice Emitted when owner withdraws accumulated fees.
    event FeesWithdrawn(address indexed to, uint256 amount);

    /// @notice Emitted when ownership is transferred.
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// -----------------------------------------------------------------------
    /// Modifiers
    /// -----------------------------------------------------------------------

    modifier onlyOwner() {
        if (msg.sender != owner) revert Unauthorized();
        _;
    }

    modifier whenNotPaused() {
        if (paused) revert ContractPaused();
        _;
    }

    modifier nonReentrant() {
        if (_locked == 1) revert Unauthorized();
        _locked = 1;
        _;
        _locked = 0;
    }

    /// -----------------------------------------------------------------------
    /// Constructor
    /// -----------------------------------------------------------------------

    constructor() {
        owner = msg.sender;
        paused = false;
        _locked = 0;
    }

    /// -----------------------------------------------------------------------
    /// View helpers
    /// -----------------------------------------------------------------------

    /// @notice Human‑readable name for wallets / UIs.
    function name() external pure returns (string memory) {
        return "Voidly ChainMail";
    }

    /// @notice Semantic version string.
    function version() external pure returns (string memory) {
        return "1.0.0";
    }

    /// @notice Total messages ever created (including deleted).
    function totalMessages() external view returns (uint256) {
        // _nextMessageId starts at 1, so subtract 1 for count
        return _nextMessageId - 1;
    }

    /// -----------------------------------------------------------------------
    /// Core API
    /// -----------------------------------------------------------------------

    /// @notice Register a new encrypted message on‑chain.
    /// @dev
    /// - `encryptedPayload` must already be encrypted client‑side.
    /// - Anyone can send to anyone; do your own allow‑lists off‑chain.
    ///
    /// @param recipient        Wallet that should be able to decrypt.
    /// @param topic            Optional thread / label identifier (0x0 if unused).
    /// @param oneTime          Hint for one‑time view semantics (off‑chain).
    /// @param encryptedPayload Opaque ciphertext bytes.
    ///
    /// @return messageId       Global message ID.
    function sendMessage(
        address recipient,
        bytes32 topic,
        bool oneTime,
        bytes calldata encryptedPayload
    ) external payable whenNotPaused nonReentrant returns (uint256 messageId) {
        // Validation checks
        if (recipient == address(0)) revert InvalidRecipient();
        if (recipient == msg.sender) revert SelfSendNotAllowed();
        if (encryptedPayload.length == 0) revert EmptyPayload();
        if (encryptedPayload.length > MAX_PAYLOAD_SIZE) revert PayloadTooLarge();
        if (msg.value < messageFee) revert InsufficientFee();

        // Generate message ID and timestamp
        messageId = _nextMessageId++;
        uint64 ts = uint64(block.timestamp);

        // Store message (SSTORE after all checks)
        Message storage m = _messages[messageId];
        m.sender = msg.sender;
        m.recipient = recipient;
        m.topic = topic;
        m.oneTime = oneTime;
        m.deleted = false;
        m.createdAt = ts;
        m.encryptedPayload = encryptedPayload;

        // Update indexes
        _inboxByAddress[recipient].push(messageId);
        _outboxByAddress[msg.sender].push(messageId);

        emit MessageSent(messageId, msg.sender, recipient, topic, oneTime, ts);

        // Refund excess payment
        if (msg.value > messageFee) {
            (bool success, ) = msg.sender.call{value: msg.value - messageFee}("");
            require(success, "Refund failed");
        }
    }

    /// @notice Read a message by its ID (encrypted payload + metadata).
    /// @dev Anyone can call this, but only the intended recipient (or sender)
    ///      can actually decrypt the ciphertext. Privacy is cryptographic.
    function getMessage(uint256 messageId)
        external
        view
        returns (
            address sender,
            address recipient,
            bytes32 topic,
            bool oneTime,
            bool deleted,
            uint64 createdAt,
            bytes memory encryptedPayload
        )
    {
        Message storage m = _messages[messageId];
        if (m.sender == address(0)) revert MessageNotFound();

        return (
            m.sender,
            m.recipient,
            m.topic,
            m.oneTime,
            m.deleted,
            m.createdAt,
            m.encryptedPayload
        );
    }

    /// @notice Soft‑delete a message from the perspective of sender/recipient.
    /// @dev
    /// - Does NOT remove data from chain (impossible).
    /// - Marks `deleted = true` for UI / off‑chain indexers.
    /// - Only `sender` or `recipient` may call.
    function deleteMessage(uint256 messageId) external {
        Message storage m = _messages[messageId];
        if (m.sender == address(0)) revert MessageNotFound();

        if (msg.sender != m.sender && msg.sender != m.recipient) {
            revert Unauthorized();
        }

        if (m.deleted) revert AlreadyDeleted();

        m.deleted = true;
        emit MessageDeleted(messageId, msg.sender, uint64(block.timestamp));
    }

    /// -----------------------------------------------------------------------
    /// Inbox / Outbox helpers
    /// -----------------------------------------------------------------------

    /// @notice List of message IDs where `user` is the recipient.
    /// @dev For big inboxes, indexers should paginate off‑chain.
    ///      WARNING: This can hit gas limits for large inboxes. Use inboxPaginated instead.
    function inbox(address user) external view returns (uint256[] memory) {
        return _inboxByAddress[user];
    }

    /// @notice List of message IDs where `user` is the sender.
    ///      WARNING: This can hit gas limits for large outboxes. Use outboxPaginated instead.
    function outbox(address user) external view returns (uint256[] memory) {
        return _outboxByAddress[user];
    }

    /// @notice Get paginated inbox for a user.
    /// @param user The user's address
    /// @param offset Starting index
    /// @param limit Maximum number of items to return
    function inboxPaginated(address user, uint256 offset, uint256 limit) 
        external 
        view 
        returns (uint256[] memory messageIds, uint256 total) 
    {
        if (limit == 0 || limit > MAX_PAGINATION_LIMIT) revert InvalidPagination();

        uint256[] storage allMessages = _inboxByAddress[user];
        total = allMessages.length;

        if (offset >= total) {
            return (new uint256[](0), total);
        }

        // Safe math: check for overflow
        uint256 end;
        unchecked {
            end = offset + limit;
            if (end < offset) revert InvalidPagination(); // overflow
        }

        if (end > total) {
            end = total;
        }

        uint256 resultLength = end - offset;
        messageIds = new uint256[](resultLength);

        for (uint256 i = 0; i < resultLength; i++) {
            messageIds[i] = allMessages[offset + i];
        }
    }

    /// @notice Get paginated outbox for a user.
    /// @param user The user's address
    /// @param offset Starting index
    /// @param limit Maximum number of items to return
    function outboxPaginated(address user, uint256 offset, uint256 limit) 
        external 
        view 
        returns (uint256[] memory messageIds, uint256 total) 
    {
        if (limit == 0 || limit > MAX_PAGINATION_LIMIT) revert InvalidPagination();

        uint256[] storage allMessages = _outboxByAddress[user];
        total = allMessages.length;

        if (offset >= total) {
            return (new uint256[](0), total);
        }

        // Safe math: check for overflow
        uint256 end;
        unchecked {
            end = offset + limit;
            if (end < offset) revert InvalidPagination(); // overflow
        }

        if (end > total) {
            end = total;
        }

        uint256 resultLength = end - offset;
        messageIds = new uint256[](resultLength);

        for (uint256 i = 0; i < resultLength; i++) {
            messageIds[i] = allMessages[offset + i];
        }
    }

    /// @notice Get inbox count for a user.
    function inboxCount(address user) external view returns (uint256) {
        return _inboxByAddress[user].length;
    }

    /// @notice Get outbox count for a user.
    function outboxCount(address user) external view returns (uint256) {
        return _outboxByAddress[user].length;
    }

    /// -----------------------------------------------------------------------
    /// Admin Functions
    /// -----------------------------------------------------------------------

    /// @notice Update the message fee (anti-spam).
    function setMessageFee(uint256 newFee) external onlyOwner {
        uint256 oldFee = messageFee;
        messageFee = newFee;
        emit MessageFeeUpdated(oldFee, newFee);
    }

    /// @notice Pause/unpause the contract (emergency).
    function setPaused(bool _paused) external onlyOwner {
        paused = _paused;
        emit PauseStatusChanged(_paused);
    }

    /// @notice Withdraw accumulated fees.
    function withdrawFees(address payable to) external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        (bool success, ) = to.call{value: balance}("");
        require(success, "Withdrawal failed");
        emit FeesWithdrawn(to, balance);
    }

    /// @notice Transfer ownership.
    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) revert InvalidRecipient();
        address oldOwner = owner;
        owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /// @notice Get contract balance.
    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyDeleted","type":"error"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"EmptyPayload","type":"error"},{"inputs":[],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"InvalidPagination","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"MessageNotFound","type":"error"},{"inputs":[],"name":"PayloadTooLarge","type":"error"},{"inputs":[],"name":"SelfSendNotAllowed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeesWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"messageId","type":"uint256"},{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"MessageDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"MessageFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"messageId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"bytes32","name":"topic","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"oneTime","type":"bool"},{"indexed":false,"internalType":"uint64","name":"createdAt","type":"uint64"}],"name":"MessageSent","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseStatusChanged","type":"event"},{"inputs":[],"name":"MAX_PAGINATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PAYLOAD_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"messageId","type":"uint256"}],"name":"deleteMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"messageId","type":"uint256"}],"name":"getMessage","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"topic","type":"bytes32"},{"internalType":"bool","name":"oneTime","type":"bool"},{"internalType":"bool","name":"deleted","type":"bool"},{"internalType":"uint64","name":"createdAt","type":"uint64"},{"internalType":"bytes","name":"encryptedPayload","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"inbox","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"inboxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"inboxPaginated","outputs":[{"internalType":"uint256[]","name":"messageIds","type":"uint256[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"outbox","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"outboxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"outboxPaginated","outputs":[{"internalType":"uint256[]","name":"messageIds","type":"uint256[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes32","name":"topic","type":"bytes32"},{"internalType":"bool","name":"oneTime","type":"bool"},{"internalType":"bytes","name":"encryptedPayload","type":"bytes"}],"name":"sendMessage","outputs":[{"internalType":"uint256","name":"messageId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setMessageFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalMessages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052655af3107a4000600055600160035534801561001f57600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160146101000a81548160ff0219169083151502179055506000600281905550612746806100936000396000f3fe6080604052600436106101355760003560e01c806386f79edb116100ab578063b888690a1161006f578063b888690a14610438578063ed0e26b914610461578063ef0e233b1461049e578063f0549006146104dc578063f2fde38b14610519578063ff6acade1461054257610135565b806386f79edb146103445780638da5cb5b14610387578063951166c0146103b2578063a2ba1934146103dd578063b6d54d7c1461040857610135565b806323aa2a9d116100fd57806323aa2a9d1461020d57806330da5f9c1461023657806354fd4d50146102735780635c975abb1461029e5780636dfa7268146102c9578063719c04761461030657610135565b806306fdde031461013a57806312065fe014610165578063164e68de1461019057806316c38b3c146101b95780631a90a219146101e2575b600080fd5b34801561014657600080fd5b5061014f61056d565b60405161015c9190611b68565b60405180910390f35b34801561017157600080fd5b5061017a6105aa565b6040516101879190611ba3565b60405180910390f35b34801561019c57600080fd5b506101b760048036038101906101b29190611c26565b6105b2565b005b3480156101c557600080fd5b506101e060048036038101906101db9190611c8b565b610789565b005b3480156101ee57600080fd5b506101f7610864565b6040516102049190611ba3565b60405180910390f35b34801561021957600080fd5b50610234600480360381019061022f9190611ce4565b61086a565b005b34801561024257600080fd5b5061025d60048036038101906102589190611d4f565b61093b565b60405161026a9190611ba3565b60405180910390f35b34801561027f57600080fd5b50610288610987565b6040516102959190611b68565b60405180910390f35b3480156102aa57600080fd5b506102b36109c4565b6040516102c09190611d8b565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611d4f565b6109d7565b6040516102fd9190611e64565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190611e86565b610a6e565b60405161033b929190611ed9565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190611ce4565b610c75565b60405161037e9796959493929190611fa9565b60405180910390f35b34801561039357600080fd5b5061039c610e57565b6040516103a9919061201f565b60405180910390f35b3480156103be57600080fd5b506103c7610e7d565b6040516103d49190611ba3565b60405180910390f35b3480156103e957600080fd5b506103f2610e93565b6040516103ff9190611ba3565b60405180910390f35b610422600480360381019061041d91906120cb565b610e9a565b60405161042f9190611ba3565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190611ce4565b6113f5565b005b34801561046d57600080fd5b5061048860048036038101906104839190611d4f565b611636565b6040516104959190611e64565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190611e86565b6116cd565b6040516104d3929190611ed9565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190611d4f565b6118d4565b6040516105109190611ba3565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611d4f565b611920565b005b34801561054e57600080fd5b50610557611ad3565b6040516105649190611ba3565b60405180910390f35b60606040518060400160405280601081526020017f566f69646c7920436861696e4d61696c00000000000000000000000000000000815250905090565b600047905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610639576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160025403610675576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281905550600047905060008273ffffffffffffffffffffffffffffffffffffffff16826040516106a890612184565b60006040518083038185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906121e5565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fc0819c13be868895eb93e40eaceb96de976442fa1d404e5c55f14bb65a8c489a836040516107749190611ba3565b60405180910390a25050600060028190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610810576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600160146101000a81548160ff0219169083151502179055507fef37df9624f797913e7585c7f7b5d004ba6704be3c64b0561c157728ccc86985816040516108599190611d8b565b60405180910390a150565b60005481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050816000819055507ff8de0c222317f1c7cca7a70a6499138fbf1811c0dada7926c5af1ae368a6b5e7818360405161092f929190612205565b60405180910390a15050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b600160149054906101000a900460ff1681565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610a6257602002820191906000526020600020905b815481526020019060010190808311610a4e575b50505050509050919050565b6060600080831480610a805750606483115b15610ab7576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080805490509150818510610b5a57600067ffffffffffffffff811115610b2357610b2261222e565b5b604051908082528060200260200182016040528015610b515781602001602082028036833780820191505090505b50925050610c6d565b6000848601905085811015610b9b576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610ba7578290505b60008682610bb5919061228c565b90508067ffffffffffffffff811115610bd157610bd061222e565b5b604051908082528060200260200182016040528015610bff5781602001602082028036833780820191505090505b50945060005b81811015610c6857838189610c1a91906122c0565b81548110610c2b57610c2a6122f4565b5b9060005260206000200154868281518110610c4957610c486122f4565b5b6020026020010181815250508080610c6090612323565b915050610c05565b505050505b935093915050565b60008060008060008060606000600460008a81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d21576040517f28915ac700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600201548360030160009054906101000a900460ff168460030160019054906101000a900460ff168560030160029054906101000a900467ffffffffffffffff1686600401808054610dbd9061239a565b80601f0160208091040260200160405190810160405280929190818152602001828054610de99061239a565b8015610e365780601f10610e0b57610100808354040283529160200191610e36565b820191906000526020600020905b815481529060010190602001808311610e1957829003601f168201915b50505050509050975097509750975097509750975050919395979092949650565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001600354610e8e919061228c565b905090565b6204000081565b6000600160149054906101000a900460ff1615610ee3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160025403610f1f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610f8d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610ff2576040517f06c54b3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838390500361102f576040517f2e3f1f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6204000083839050111561106f576040517f492f620d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000543410156110ab576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360008154809291906110be90612323565b91905055905060004290506000600460008481526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550868160020181905550858160030160006101000a81548160ff02191690831515021790555060008160030160016101000a81548160ff021916908315150217905550818160030160026101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555084848260040191826111e6929190612582565b50600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150558773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe76c023611c79201a2025a284fce4c02b0a696ffca371c1e11cd95f0e8f5eba48a8a8760405161131593929190612652565b60405180910390a46000543411156113e25760003373ffffffffffffffffffffffffffffffffffffffff166000543461134e919061228c565b60405161135a90612184565b60006040518083038185875af1925050503d8060008114611397576040519150601f19603f3d011682016040523d82523d6000602084013e61139c565b606091505b50509050806113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906126d5565b60405180910390fd5b505b5050600060028190555095945050505050565b6000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611496576040517f28915ac700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561154657508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561157d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030160019054906101000a900460ff16156115c6576040517fba48b5de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16827f679d5802a0a7666ade18ca7241b1423df5ff9f988597e1391a5be8cbc492172a4260405161162a91906126f5565b60405180910390a35050565b6060600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156116c157602002820191906000526020600020905b8154815260200190600101908083116116ad575b50505050509050919050565b60606000808314806116df5750606483115b15611716576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050808054905091508185106117b957600067ffffffffffffffff8111156117825761178161222e565b5b6040519080825280602002602001820160405280156117b05781602001602082028036833780820191505090505b509250506118cc565b60008486019050858110156117fa576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115611806578290505b60008682611814919061228c565b90508067ffffffffffffffff8111156118305761182f61222e565b5b60405190808252806020026020018201604052801561185e5781602001602082028036833780820191505090505b50945060005b818110156118c75783818961187991906122c0565b8154811061188a576118896122f4565b5b90600052602060002001548682815181106118a8576118a76122f4565b5b60200260200101818152505080806118bf90612323565b915050611864565b505050505b935093915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606481565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b12578082015181840152602081019050611af7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b3a82611ad8565b611b448185611ae3565b9350611b54818560208601611af4565b611b5d81611b1e565b840191505092915050565b60006020820190508181036000830152611b828184611b2f565b905092915050565b6000819050919050565b611b9d81611b8a565b82525050565b6000602082019050611bb86000830184611b94565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bf382611bc8565b9050919050565b611c0381611be8565b8114611c0e57600080fd5b50565b600081359050611c2081611bfa565b92915050565b600060208284031215611c3c57611c3b611bbe565b5b6000611c4a84828501611c11565b91505092915050565b60008115159050919050565b611c6881611c53565b8114611c7357600080fd5b50565b600081359050611c8581611c5f565b92915050565b600060208284031215611ca157611ca0611bbe565b5b6000611caf84828501611c76565b91505092915050565b611cc181611b8a565b8114611ccc57600080fd5b50565b600081359050611cde81611cb8565b92915050565b600060208284031215611cfa57611cf9611bbe565b5b6000611d0884828501611ccf565b91505092915050565b6000611d1c82611bc8565b9050919050565b611d2c81611d11565b8114611d3757600080fd5b50565b600081359050611d4981611d23565b92915050565b600060208284031215611d6557611d64611bbe565b5b6000611d7384828501611d3a565b91505092915050565b611d8581611c53565b82525050565b6000602082019050611da06000830184611d7c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611ddb81611b8a565b82525050565b6000611ded8383611dd2565b60208301905092915050565b6000602082019050919050565b6000611e1182611da6565b611e1b8185611db1565b9350611e2683611dc2565b8060005b83811015611e57578151611e3e8882611de1565b9750611e4983611df9565b925050600181019050611e2a565b5085935050505092915050565b60006020820190508181036000830152611e7e8184611e06565b905092915050565b600080600060608486031215611e9f57611e9e611bbe565b5b6000611ead86828701611d3a565b9350506020611ebe86828701611ccf565b9250506040611ecf86828701611ccf565b9150509250925092565b60006040820190508181036000830152611ef38185611e06565b9050611f026020830184611b94565b9392505050565b611f1281611d11565b82525050565b6000819050919050565b611f2b81611f18565b82525050565b600067ffffffffffffffff82169050919050565b611f4e81611f31565b82525050565b600081519050919050565b600082825260208201905092915050565b6000611f7b82611f54565b611f858185611f5f565b9350611f95818560208601611af4565b611f9e81611b1e565b840191505092915050565b600060e082019050611fbe600083018a611f09565b611fcb6020830189611f09565b611fd86040830188611f22565b611fe56060830187611d7c565b611ff26080830186611d7c565b611fff60a0830185611f45565b81810360c08301526120118184611f70565b905098975050505050505050565b60006020820190506120346000830184611f09565b92915050565b61204381611f18565b811461204e57600080fd5b50565b6000813590506120608161203a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208b5761208a612066565b5b8235905067ffffffffffffffff8111156120a8576120a761206b565b5b6020830191508360018202830111156120c4576120c3612070565b5b9250929050565b6000806000806000608086880312156120e7576120e6611bbe565b5b60006120f588828901611d3a565b955050602061210688828901612051565b945050604061211788828901611c76565b935050606086013567ffffffffffffffff81111561213857612137611bc3565b5b61214488828901612075565b92509250509295509295909350565b600081905092915050565b50565b600061216e600083612153565b91506121798261215e565b600082019050919050565b600061218f82612161565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b60006121cf601183611ae3565b91506121da82612199565b602082019050919050565b600060208201905081810360008301526121fe816121c2565b9050919050565b600060408201905061221a6000830185611b94565b6122276020830184611b94565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061229782611b8a565b91506122a283611b8a565b92508282039050818111156122ba576122b961225d565b5b92915050565b60006122cb82611b8a565b91506122d683611b8a565b92508282019050808211156122ee576122ed61225d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061232e82611b8a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123605761235f61225d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123b257607f821691505b6020821081036123c5576123c461236b565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026124387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826123fb565b61244286836123fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061247f61247a61247584611b8a565b61245a565b611b8a565b9050919050565b6000819050919050565b61249983612464565b6124ad6124a582612486565b848454612408565b825550505050565b600090565b6124c26124b5565b6124cd818484612490565b505050565b5b818110156124f1576124e66000826124ba565b6001810190506124d3565b5050565b601f82111561253657612507816123d6565b612510846123eb565b8101602085101561251f578190505b61253361252b856123eb565b8301826124d2565b50505b505050565b600082821c905092915050565b60006125596000198460080261253b565b1980831691505092915050565b60006125728383612548565b9150826002028217905092915050565b61258c83836123cb565b67ffffffffffffffff8111156125a5576125a461222e565b5b6125af825461239a565b6125ba8282856124f5565b6000601f8311600181146125e957600084156125d7578287013590505b6125e18582612566565b865550612649565b601f1984166125f7866123d6565b60005b8281101561261f578489013582556001820191506020850194506020810190506125fa565b8683101561263c5784890135612638601f891682612548565b8355505b6001600288020188555050505b50505050505050565b60006060820190506126676000830186611f22565b6126746020830185611d7c565b6126816040830184611f45565b949350505050565b7f526566756e64206661696c656400000000000000000000000000000000000000600082015250565b60006126bf600d83611ae3565b91506126ca82612689565b602082019050919050565b600060208201905081810360008301526126ee816126b2565b9050919050565b600060208201905061270a6000830184611f45565b9291505056fea2646970667358221220dee69763ddc823899ae8aefd34a32fe42c88c7b13b534ecd072b83788a56183b64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101355760003560e01c806386f79edb116100ab578063b888690a1161006f578063b888690a14610438578063ed0e26b914610461578063ef0e233b1461049e578063f0549006146104dc578063f2fde38b14610519578063ff6acade1461054257610135565b806386f79edb146103445780638da5cb5b14610387578063951166c0146103b2578063a2ba1934146103dd578063b6d54d7c1461040857610135565b806323aa2a9d116100fd57806323aa2a9d1461020d57806330da5f9c1461023657806354fd4d50146102735780635c975abb1461029e5780636dfa7268146102c9578063719c04761461030657610135565b806306fdde031461013a57806312065fe014610165578063164e68de1461019057806316c38b3c146101b95780631a90a219146101e2575b600080fd5b34801561014657600080fd5b5061014f61056d565b60405161015c9190611b68565b60405180910390f35b34801561017157600080fd5b5061017a6105aa565b6040516101879190611ba3565b60405180910390f35b34801561019c57600080fd5b506101b760048036038101906101b29190611c26565b6105b2565b005b3480156101c557600080fd5b506101e060048036038101906101db9190611c8b565b610789565b005b3480156101ee57600080fd5b506101f7610864565b6040516102049190611ba3565b60405180910390f35b34801561021957600080fd5b50610234600480360381019061022f9190611ce4565b61086a565b005b34801561024257600080fd5b5061025d60048036038101906102589190611d4f565b61093b565b60405161026a9190611ba3565b60405180910390f35b34801561027f57600080fd5b50610288610987565b6040516102959190611b68565b60405180910390f35b3480156102aa57600080fd5b506102b36109c4565b6040516102c09190611d8b565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190611d4f565b6109d7565b6040516102fd9190611e64565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190611e86565b610a6e565b60405161033b929190611ed9565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190611ce4565b610c75565b60405161037e9796959493929190611fa9565b60405180910390f35b34801561039357600080fd5b5061039c610e57565b6040516103a9919061201f565b60405180910390f35b3480156103be57600080fd5b506103c7610e7d565b6040516103d49190611ba3565b60405180910390f35b3480156103e957600080fd5b506103f2610e93565b6040516103ff9190611ba3565b60405180910390f35b610422600480360381019061041d91906120cb565b610e9a565b60405161042f9190611ba3565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190611ce4565b6113f5565b005b34801561046d57600080fd5b5061048860048036038101906104839190611d4f565b611636565b6040516104959190611e64565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190611e86565b6116cd565b6040516104d3929190611ed9565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190611d4f565b6118d4565b6040516105109190611ba3565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611d4f565b611920565b005b34801561054e57600080fd5b50610557611ad3565b6040516105649190611ba3565b60405180910390f35b60606040518060400160405280601081526020017f566f69646c7920436861696e4d61696c00000000000000000000000000000000815250905090565b600047905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610639576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160025403610675576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281905550600047905060008273ffffffffffffffffffffffffffffffffffffffff16826040516106a890612184565b60006040518083038185875af1925050503d80600081146106e5576040519150601f19603f3d011682016040523d82523d6000602084013e6106ea565b606091505b505090508061072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906121e5565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fc0819c13be868895eb93e40eaceb96de976442fa1d404e5c55f14bb65a8c489a836040516107749190611ba3565b60405180910390a25050600060028190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610810576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600160146101000a81548160ff0219169083151502179055507fef37df9624f797913e7585c7f7b5d004ba6704be3c64b0561c157728ccc86985816040516108599190611d8b565b60405180910390a150565b60005481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108f1576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050816000819055507ff8de0c222317f1c7cca7a70a6499138fbf1811c0dada7926c5af1ae368a6b5e7818360405161092f929190612205565b60405180910390a15050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b600160149054906101000a900460ff1681565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610a6257602002820191906000526020600020905b815481526020019060010190808311610a4e575b50505050509050919050565b6060600080831480610a805750606483115b15610ab7576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080805490509150818510610b5a57600067ffffffffffffffff811115610b2357610b2261222e565b5b604051908082528060200260200182016040528015610b515781602001602082028036833780820191505090505b50925050610c6d565b6000848601905085811015610b9b576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115610ba7578290505b60008682610bb5919061228c565b90508067ffffffffffffffff811115610bd157610bd061222e565b5b604051908082528060200260200182016040528015610bff5781602001602082028036833780820191505090505b50945060005b81811015610c6857838189610c1a91906122c0565b81548110610c2b57610c2a6122f4565b5b9060005260206000200154868281518110610c4957610c486122f4565b5b6020026020010181815250508080610c6090612323565b915050610c05565b505050505b935093915050565b60008060008060008060606000600460008a81526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610d21576040517f28915ac700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600201548360030160009054906101000a900460ff168460030160019054906101000a900460ff168560030160029054906101000a900467ffffffffffffffff1686600401808054610dbd9061239a565b80601f0160208091040260200160405190810160405280929190818152602001828054610de99061239a565b8015610e365780601f10610e0b57610100808354040283529160200191610e36565b820191906000526020600020905b815481529060010190602001808311610e1957829003601f168201915b50505050509050975097509750975097509750975050919395979092949650565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006001600354610e8e919061228c565b905090565b6204000081565b6000600160149054906101000a900460ff1615610ee3576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160025403610f1f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610f8d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610ff2576040517f06c54b3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838390500361102f576040517f2e3f1f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6204000083839050111561106f576040517f492f620d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000543410156110ab576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360008154809291906110be90612323565b91905055905060004290506000600460008481526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550868160020181905550858160030160006101000a81548160ff02191690831515021790555060008160030160016101000a81548160ff021916908315150217905550818160030160026101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555084848260040191826111e6929190612582565b50600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150558773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe76c023611c79201a2025a284fce4c02b0a696ffca371c1e11cd95f0e8f5eba48a8a8760405161131593929190612652565b60405180910390a46000543411156113e25760003373ffffffffffffffffffffffffffffffffffffffff166000543461134e919061228c565b60405161135a90612184565b60006040518083038185875af1925050503d8060008114611397576040519150601f19603f3d011682016040523d82523d6000602084013e61139c565b606091505b50509050806113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d7906126d5565b60405180910390fd5b505b5050600060028190555095945050505050565b6000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611496576040517f28915ac700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561154657508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b1561157d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060030160019054906101000a900460ff16156115c6576040517fba48b5de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16827f679d5802a0a7666ade18ca7241b1423df5ff9f988597e1391a5be8cbc492172a4260405161162a91906126f5565b60405180910390a35050565b6060600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156116c157602002820191906000526020600020905b8154815260200190600101908083116116ad575b50505050509050919050565b60606000808314806116df5750606483115b15611716576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050808054905091508185106117b957600067ffffffffffffffff8111156117825761178161222e565b5b6040519080825280602002602001820160405280156117b05781602001602082028036833780820191505090505b509250506118cc565b60008486019050858110156117fa576040517f3d47273b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82811115611806578290505b60008682611814919061228c565b90508067ffffffffffffffff8111156118305761182f61222e565b5b60405190808252806020026020018201604052801561185e5781602001602082028036833780820191505090505b50945060005b818110156118c75783818961187991906122c0565b8154811061188a576118896122f4565b5b90600052602060002001548682815181106118a8576118a76122f4565b5b60200260200101818152505080806118bf90612323565b915050611864565b505050505b935093915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119a7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606481565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b12578082015181840152602081019050611af7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b3a82611ad8565b611b448185611ae3565b9350611b54818560208601611af4565b611b5d81611b1e565b840191505092915050565b60006020820190508181036000830152611b828184611b2f565b905092915050565b6000819050919050565b611b9d81611b8a565b82525050565b6000602082019050611bb86000830184611b94565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611bf382611bc8565b9050919050565b611c0381611be8565b8114611c0e57600080fd5b50565b600081359050611c2081611bfa565b92915050565b600060208284031215611c3c57611c3b611bbe565b5b6000611c4a84828501611c11565b91505092915050565b60008115159050919050565b611c6881611c53565b8114611c7357600080fd5b50565b600081359050611c8581611c5f565b92915050565b600060208284031215611ca157611ca0611bbe565b5b6000611caf84828501611c76565b91505092915050565b611cc181611b8a565b8114611ccc57600080fd5b50565b600081359050611cde81611cb8565b92915050565b600060208284031215611cfa57611cf9611bbe565b5b6000611d0884828501611ccf565b91505092915050565b6000611d1c82611bc8565b9050919050565b611d2c81611d11565b8114611d3757600080fd5b50565b600081359050611d4981611d23565b92915050565b600060208284031215611d6557611d64611bbe565b5b6000611d7384828501611d3a565b91505092915050565b611d8581611c53565b82525050565b6000602082019050611da06000830184611d7c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611ddb81611b8a565b82525050565b6000611ded8383611dd2565b60208301905092915050565b6000602082019050919050565b6000611e1182611da6565b611e1b8185611db1565b9350611e2683611dc2565b8060005b83811015611e57578151611e3e8882611de1565b9750611e4983611df9565b925050600181019050611e2a565b5085935050505092915050565b60006020820190508181036000830152611e7e8184611e06565b905092915050565b600080600060608486031215611e9f57611e9e611bbe565b5b6000611ead86828701611d3a565b9350506020611ebe86828701611ccf565b9250506040611ecf86828701611ccf565b9150509250925092565b60006040820190508181036000830152611ef38185611e06565b9050611f026020830184611b94565b9392505050565b611f1281611d11565b82525050565b6000819050919050565b611f2b81611f18565b82525050565b600067ffffffffffffffff82169050919050565b611f4e81611f31565b82525050565b600081519050919050565b600082825260208201905092915050565b6000611f7b82611f54565b611f858185611f5f565b9350611f95818560208601611af4565b611f9e81611b1e565b840191505092915050565b600060e082019050611fbe600083018a611f09565b611fcb6020830189611f09565b611fd86040830188611f22565b611fe56060830187611d7c565b611ff26080830186611d7c565b611fff60a0830185611f45565b81810360c08301526120118184611f70565b905098975050505050505050565b60006020820190506120346000830184611f09565b92915050565b61204381611f18565b811461204e57600080fd5b50565b6000813590506120608161203a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261208b5761208a612066565b5b8235905067ffffffffffffffff8111156120a8576120a761206b565b5b6020830191508360018202830111156120c4576120c3612070565b5b9250929050565b6000806000806000608086880312156120e7576120e6611bbe565b5b60006120f588828901611d3a565b955050602061210688828901612051565b945050604061211788828901611c76565b935050606086013567ffffffffffffffff81111561213857612137611bc3565b5b61214488828901612075565b92509250509295509295909350565b600081905092915050565b50565b600061216e600083612153565b91506121798261215e565b600082019050919050565b600061218f82612161565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b60006121cf601183611ae3565b91506121da82612199565b602082019050919050565b600060208201905081810360008301526121fe816121c2565b9050919050565b600060408201905061221a6000830185611b94565b6122276020830184611b94565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061229782611b8a565b91506122a283611b8a565b92508282039050818111156122ba576122b961225d565b5b92915050565b60006122cb82611b8a565b91506122d683611b8a565b92508282019050808211156122ee576122ed61225d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061232e82611b8a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123605761235f61225d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123b257607f821691505b6020821081036123c5576123c461236b565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026124387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826123fb565b61244286836123fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061247f61247a61247584611b8a565b61245a565b611b8a565b9050919050565b6000819050919050565b61249983612464565b6124ad6124a582612486565b848454612408565b825550505050565b600090565b6124c26124b5565b6124cd818484612490565b505050565b5b818110156124f1576124e66000826124ba565b6001810190506124d3565b5050565b601f82111561253657612507816123d6565b612510846123eb565b8101602085101561251f578190505b61253361252b856123eb565b8301826124d2565b50505b505050565b600082821c905092915050565b60006125596000198460080261253b565b1980831691505092915050565b60006125728383612548565b9150826002028217905092915050565b61258c83836123cb565b67ffffffffffffffff8111156125a5576125a461222e565b5b6125af825461239a565b6125ba8282856124f5565b6000601f8311600181146125e957600084156125d7578287013590505b6125e18582612566565b865550612649565b601f1984166125f7866123d6565b60005b8281101561261f578489013582556001820191506020850194506020810190506125fa565b8683101561263c5784890135612638601f891682612548565b8355505b6001600288020188555050505b50505050505050565b60006060820190506126676000830186611f22565b6126746020830185611d7c565b6126816040830184611f45565b949350505050565b7f526566756e64206661696c656400000000000000000000000000000000000000600082015250565b60006126bf600d83611ae3565b91506126ca82612689565b602082019050919050565b600060208201905081810360008301526126ee816126b2565b9050919050565b600060208201905061270a6000830184611f45565b9291505056fea2646970667358221220dee69763ddc823899ae8aefd34a32fe42c88c7b13b534ecd072b83788a56183b64736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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