ETH Price: $2,716.16 (-7.91%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LosslessControllerV2

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-15
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;


abstract contract Initializable { 
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    function __Pausable_init() internal initializer {
        __Context_init_unchained();
        __Pausable_init_unchained();
    }

    function __Pausable_init_unchained() internal initializer {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
    uint256[49] private __gap;
}

interface ProtectionStrategy {
    function isTransferAllowed(address token, address sender, address recipient, uint256 amount) external;
}

contract LosslessControllerV2 is Initializable, ContextUpgradeable, PausableUpgradeable {
    address public pauseAdmin;
    address public admin;
    address public recoveryAdmin;

    // --- V2 VARIABLES ---

    address public guardian;
    mapping(address => Protections) private tokenProtections;

    struct Protection {
        bool isProtected;
        ProtectionStrategy strategy;
    }

    struct Protections {
        mapping(address => Protection) protections;
    }

    // --- EVENTS ---

    event AdminChanged(address indexed previousAdmin, address indexed newAdmin);
    event RecoveryAdminChanged(address indexed previousAdmin, address indexed newAdmin);
    event PauseAdminChanged(address indexed previousAdmin, address indexed newAdmin);


    // --- V2 EVENTS ---

    event GuardianSet(address indexed oldGuardian, address indexed newGuardian);
    event ProtectedAddressSet(address indexed token, address indexed protectedAddress, address indexed strategy);
    event RemovedProtectedAddress(address indexed token, address indexed protectedAddress);

    // --- MODIFIERS ---

    modifier onlyLosslessRecoveryAdmin() {
        require(msg.sender == recoveryAdmin, "LOSSLESS: Must be recoveryAdmin");
        _;
    }

    modifier onlyLosslessAdmin() {
        require(admin == msg.sender, "LOSSLESS: Must be admin");
        _;
    }

    modifier onlyPauseAdmin() {
        require(msg.sender == pauseAdmin, "LOSSLESS: Must be pauseAdmin");
        _;
    }

    // --- V2 MODIFIERS ---

    modifier onlyGuardian() {
        require(msg.sender == guardian, "LOSSLESS: Must be Guardian");
        _;
    }

    // --- VIEWS ---

    function getVersion() external pure returns (uint256) {
        return 2;
    }

    // --- V2 VIEWS ---

    function isAddressProtected(address token, address protectedAddress) external view returns (bool) {
        return tokenProtections[token].protections[protectedAddress].isProtected;
    }

    function getProtectedAddressStrategy(address token, address protectedAddress) external view returns (address) {
        return address(tokenProtections[token].protections[protectedAddress].strategy);
    }

    // --- ADMINISTRATION ---

    function pause() external onlyPauseAdmin  {
        _pause();
    }    
    
    function unpause() external onlyPauseAdmin {
        _unpause();
    }

    function setAdmin(address newAdmin) external onlyLosslessRecoveryAdmin {
        require(newAdmin != address(0), "LERC20: Cannot be zero address");
        emit AdminChanged(admin, newAdmin);
        admin = newAdmin;
    }

    function setRecoveryAdmin(address newRecoveryAdmin) external onlyLosslessRecoveryAdmin {
        require(newRecoveryAdmin != address(0), "LERC20: Cannot be zero address");
        emit RecoveryAdminChanged(recoveryAdmin, newRecoveryAdmin);
        recoveryAdmin = newRecoveryAdmin;
    }

    function setPauseAdmin(address newPauseAdmin) external onlyLosslessRecoveryAdmin {
        require(newPauseAdmin != address(0), "LERC20: Cannot be zero address");
        emit PauseAdminChanged(pauseAdmin, newPauseAdmin);
        pauseAdmin = newPauseAdmin;
    }

    // --- GUARD ---

    // @notice Set a guardian contract.
    // @dev Guardian contract must be trusted as it has some access rights and can modify controller's state.
    function setGuardian(address newGuardian) external onlyLosslessAdmin whenNotPaused {
        require(newGuardian != address(0), "LSS: Cannot be zero address");
        emit GuardianSet(guardian, newGuardian);
        guardian = newGuardian;
    }

    // @notice Sets protection for an address with the choosen strategy.
    // @dev Strategies are verified in the guardian contract.
    // @dev This call is initiated from a strategy, but guardian proxies it.
    function setProtectedAddress(address token, address protectedAddresss, ProtectionStrategy strategy) external onlyGuardian whenNotPaused {
        Protection storage protection = tokenProtections[token].protections[protectedAddresss];
        protection.isProtected = true;
        protection.strategy = strategy;
        emit ProtectedAddressSet(token, protectedAddresss, address(strategy));
    }

    // @notice Remove the protection from the address.
    // @dev Strategies are verified in the guardian contract.
    // @dev This call is initiated from a strategy, but guardian proxies it.
    function removeProtectedAddress(address token, address protectedAddresss) external onlyGuardian whenNotPaused {
        delete tokenProtections[token].protections[protectedAddresss];
        emit RemovedProtectedAddress(token, protectedAddresss);
    }

    // --- BEFORE HOOKS ---

    // @notice If address is protected, transfer validation rules have to be run inside the strategy.
    // @dev isTransferAllowed reverts in case transfer can not be done by the defined rules.
    function beforeTransfer(address sender, address recipient, uint256 amount) external {
        if (tokenProtections[msg.sender].protections[sender].isProtected) {
            tokenProtections[msg.sender].protections[sender].strategy.isTransferAllowed(msg.sender, sender, recipient, amount);
        }
    }

    // @notice If address is protected, transfer validation rules have to be run inside the strategy.
    // @dev isTransferAllowed reverts in case transfer can not be done by the defined rules.
    function beforeTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external {
        if (tokenProtections[msg.sender].protections[sender].isProtected) {
            tokenProtections[msg.sender].protections[sender].strategy.isTransferAllowed(msg.sender, sender, recipient, amount);
        }
    }

    function beforeApprove(address sender, address spender, uint256 amount) external {}

    function beforeIncreaseAllowance(address msgSender, address spender, uint256 addedValue) external {}

    function beforeDecreaseAllowance(address msgSender, address spender, uint256 subtractedValue) external {}

    // --- AFTER HOOKS ---
    // * After hooks are deprecated in LERC20 but we have to keep them
    //   here in order to support legacy LERC20.

    function afterApprove(address sender, address spender, uint256 amount) external {}

    function afterTransfer(address sender, address recipient, uint256 amount) external {}

    function afterTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external {}

    function afterIncreaseAllowance(address sender, address spender, uint256 addedValue) external {}

    function afterDecreaseAllowance(address sender, address spender, uint256 subtractedValue) external {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGuardian","type":"address"},{"indexed":true,"internalType":"address","name":"newGuardian","type":"address"}],"name":"GuardianSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"PauseAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"protectedAddress","type":"address"},{"indexed":true,"internalType":"address","name":"strategy","type":"address"}],"name":"ProtectedAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"RecoveryAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"protectedAddress","type":"address"}],"name":"RemovedProtectedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"afterDecreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"afterIncreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"afterTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"beforeDecreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"beforeIncreaseAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"beforeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddress","type":"address"}],"name":"getProtectedAddressStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddress","type":"address"}],"name":"isAddressProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddresss","type":"address"}],"name":"removeProtectedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGuardian","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPauseAdmin","type":"address"}],"name":"setPauseAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"protectedAddresss","type":"address"},{"internalType":"contract ProtectionStrategy","name":"strategy","type":"address"}],"name":"setProtectedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecoveryAdmin","type":"address"}],"name":"setRecoveryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50610dfa806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806361c1ce06116100de578063af1bf34711610097578063cf5961bb11610071578063cf5961bb146101db578063ded1f4d0146101db578063f49062ca146101db578063f851a440146102e15761018e565b8063af1bf347146102a8578063b75bb0d6146102bb578063c5a07b92146102ce5761018e565b806361c1ce0614610254578063704b6c02146102675780638456cb591461027a5780638a0dac4a14610282578063900f66ef146101db578063a56e8adf146102955761018e565b80633f4ba83a1161014b578063568c75a911610125578063568c75a9146101db5780635937f650146102245780635c975abb146102375780635f6529a31461024c5761018e565b80633f4ba83a14610214578063452a93201461021c57806347abf3be146101db5761018e565b80630d8e6e2c146101935780631ffb811f146101b15780632f11d653146101c657806334d01aa8146101db578063379f5c69146101ee5780633835b4d514610201575b600080fd5b61019b6102e9565b6040516101a89190610da3565b60405180910390f35b6101c46101bf366004610b78565b6102ee565b005b6101ce6103a5565b6040516101a89190610bb8565b6101c46101e9366004610b78565b6103a0565b6101c46101fc366004610ade565b6103b4565b6101c461020f366004610b2e565b61046c565b6101c461053d565b6101ce610571565b6101c4610232366004610a83565b610580565b61023f61062c565b6040516101a89190610bf6565b6101ce610635565b6101c4610262366004610aa6565b610644565b6101c4610275366004610a83565b6106f3565b6101c461079f565b6101c4610290366004610a83565b6107d1565b6101c46102a3366004610ade565b610466565b6101c46102b6366004610a83565b6108a2565b6101ce6102c9366004610aa6565b61094e565b61023f6102dc366004610aa6565b61097d565b6101ce6109ab565b600290565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff16156103a0573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab3039161036d9190879087908790600401610bcc565b600060405180830381600087803b15801561038757600080fd5b505af115801561039b573d6000803e3d6000fd5b505050505b505050565b6065546001600160a01b031681565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff1615610466573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab303916104339190879087908790600401610bcc565b600060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050505b50505050565b6068546001600160a01b0316331461049f5760405162461bcd60e51b815260040161049690610cc7565b60405180910390fd5b6104a761062c565b156104c45760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b03838116600081815260696020908152604080832087861680855292528083208054600160ff1990911617610100600160a81b031916610100968816968702178155905190949391927f2fb7c91e605d5a69479e668b07c4c8edcdcb4ac3111a53c018a2eaf25cd088d891a450505050565b6065546001600160a01b031633146105675760405162461bcd60e51b815260040161049690610d6c565b61056f6109ba565b565b6068546001600160a01b031681565b6067546001600160a01b031633146105aa5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166105d05760405162461bcd60e51b815260040161049690610c59565b6067546040516001600160a01b038084169216907f1c7f382531621f02aefb4212478bba8871ffad078202bdbba87f3e21d639aebb90600090a3606780546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1690565b6067546001600160a01b031681565b6068546001600160a01b0316331461066e5760405162461bcd60e51b815260040161049690610cc7565b61067661062c565b156106935760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0380831660008181526069602090815260408083209486168084529490915280822080546001600160a81b0319169055517fa2971d1046995b3a7aa03439118589e13f8f1f3d35889ad7420b0966c5bc97819190a35050565b6067546001600160a01b0316331461071d5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166107435760405162461bcd60e51b815260040161049690610c59565b6066546040516001600160a01b038084169216907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f90600090a3606680546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146107c95760405162461bcd60e51b815260040161049690610d6c565b61056f610a28565b6066546001600160a01b031633146107fb5760405162461bcd60e51b815260040161049690610d35565b61080361062c565b156108205760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0381166108465760405162461bcd60e51b815260040161049690610c90565b6068546040516001600160a01b038084169216907fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc1413890600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b6067546001600160a01b031633146108cc5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166108f25760405162461bcd60e51b815260040161049690610c59565b6065546040516001600160a01b038084169216907f3e3c23bddf712ae8e73d99dd08fb2e57109143a29c9258dda76a897076e596f590600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526069602090815260408083209385168352929052205461010090041690565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6066546001600160a01b031681565b6109c261062c565b6109de5760405162461bcd60e51b815260040161049690610c01565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a11610a7f565b604051610a1e9190610bb8565b60405180910390a1565b610a3061062c565b15610a4d5760405162461bcd60e51b815260040161049690610c2f565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a115b3390565b600060208284031215610a94578081fd5b8135610a9f81610dac565b9392505050565b60008060408385031215610ab8578081fd5b8235610ac381610dac565b91506020830135610ad381610dac565b809150509250929050565b60008060008060808587031215610af3578182fd5b8435610afe81610dac565b93506020850135610b0e81610dac565b92506040850135610b1e81610dac565b9396929550929360600135925050565b600080600060608486031215610b42578283fd5b8335610b4d81610dac565b92506020840135610b5d81610dac565b91506040840135610b6d81610dac565b809150509250925092565b600080600060608486031215610b8c578283fd5b8335610b9781610dac565b92506020840135610ba781610dac565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b901515815260200190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f4c45524332303a2043616e6e6f74206265207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f4c53533a2043616e6e6f74206265207a65726f20616464726573730000000000604082015260600190565b6020808252601a908201527f4c4f53534c4553533a204d75737420626520477561726469616e000000000000604082015260600190565b6020808252601f908201527f4c4f53534c4553533a204d757374206265207265636f7665727941646d696e00604082015260600190565b60208082526017908201527f4c4f53534c4553533a204d7573742062652061646d696e000000000000000000604082015260600190565b6020808252601c908201527f4c4f53534c4553533a204d75737420626520706175736541646d696e00000000604082015260600190565b90815260200190565b6001600160a01b0381168114610dc157600080fd5b5056fea2646970667358221220b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806361c1ce06116100de578063af1bf34711610097578063cf5961bb11610071578063cf5961bb146101db578063ded1f4d0146101db578063f49062ca146101db578063f851a440146102e15761018e565b8063af1bf347146102a8578063b75bb0d6146102bb578063c5a07b92146102ce5761018e565b806361c1ce0614610254578063704b6c02146102675780638456cb591461027a5780638a0dac4a14610282578063900f66ef146101db578063a56e8adf146102955761018e565b80633f4ba83a1161014b578063568c75a911610125578063568c75a9146101db5780635937f650146102245780635c975abb146102375780635f6529a31461024c5761018e565b80633f4ba83a14610214578063452a93201461021c57806347abf3be146101db5761018e565b80630d8e6e2c146101935780631ffb811f146101b15780632f11d653146101c657806334d01aa8146101db578063379f5c69146101ee5780633835b4d514610201575b600080fd5b61019b6102e9565b6040516101a89190610da3565b60405180910390f35b6101c46101bf366004610b78565b6102ee565b005b6101ce6103a5565b6040516101a89190610bb8565b6101c46101e9366004610b78565b6103a0565b6101c46101fc366004610ade565b6103b4565b6101c461020f366004610b2e565b61046c565b6101c461053d565b6101ce610571565b6101c4610232366004610a83565b610580565b61023f61062c565b6040516101a89190610bf6565b6101ce610635565b6101c4610262366004610aa6565b610644565b6101c4610275366004610a83565b6106f3565b6101c461079f565b6101c4610290366004610a83565b6107d1565b6101c46102a3366004610ade565b610466565b6101c46102b6366004610a83565b6108a2565b6101ce6102c9366004610aa6565b61094e565b61023f6102dc366004610aa6565b61097d565b6101ce6109ab565b600290565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff16156103a0573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab3039161036d9190879087908790600401610bcc565b600060405180830381600087803b15801561038757600080fd5b505af115801561039b573d6000803e3d6000fd5b505050505b505050565b6065546001600160a01b031681565b3360009081526069602090815260408083206001600160a01b038716845290915290205460ff1615610466573360008181526069602090815260408083206001600160a01b03888116855292529182902054915163d4bab30360e01b8152610100909204169163d4bab303916104339190879087908790600401610bcc565b600060405180830381600087803b15801561044d57600080fd5b505af1158015610461573d6000803e3d6000fd5b505050505b50505050565b6068546001600160a01b0316331461049f5760405162461bcd60e51b815260040161049690610cc7565b60405180910390fd5b6104a761062c565b156104c45760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b03838116600081815260696020908152604080832087861680855292528083208054600160ff1990911617610100600160a81b031916610100968816968702178155905190949391927f2fb7c91e605d5a69479e668b07c4c8edcdcb4ac3111a53c018a2eaf25cd088d891a450505050565b6065546001600160a01b031633146105675760405162461bcd60e51b815260040161049690610d6c565b61056f6109ba565b565b6068546001600160a01b031681565b6067546001600160a01b031633146105aa5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166105d05760405162461bcd60e51b815260040161049690610c59565b6067546040516001600160a01b038084169216907f1c7f382531621f02aefb4212478bba8871ffad078202bdbba87f3e21d639aebb90600090a3606780546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1690565b6067546001600160a01b031681565b6068546001600160a01b0316331461066e5760405162461bcd60e51b815260040161049690610cc7565b61067661062c565b156106935760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0380831660008181526069602090815260408083209486168084529490915280822080546001600160a81b0319169055517fa2971d1046995b3a7aa03439118589e13f8f1f3d35889ad7420b0966c5bc97819190a35050565b6067546001600160a01b0316331461071d5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166107435760405162461bcd60e51b815260040161049690610c59565b6066546040516001600160a01b038084169216907f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f90600090a3606680546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031633146107c95760405162461bcd60e51b815260040161049690610d6c565b61056f610a28565b6066546001600160a01b031633146107fb5760405162461bcd60e51b815260040161049690610d35565b61080361062c565b156108205760405162461bcd60e51b815260040161049690610c2f565b6001600160a01b0381166108465760405162461bcd60e51b815260040161049690610c90565b6068546040516001600160a01b038084169216907fc3ce29e3ab42e524b6f6f1b4d3674898d503ee3577a64ac87b555904ebc1413890600090a3606880546001600160a01b0319166001600160a01b0392909216919091179055565b6067546001600160a01b031633146108cc5760405162461bcd60e51b815260040161049690610cfe565b6001600160a01b0381166108f25760405162461bcd60e51b815260040161049690610c59565b6065546040516001600160a01b038084169216907f3e3c23bddf712ae8e73d99dd08fb2e57109143a29c9258dda76a897076e596f590600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526069602090815260408083209385168352929052205461010090041690565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6066546001600160a01b031681565b6109c261062c565b6109de5760405162461bcd60e51b815260040161049690610c01565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610a11610a7f565b604051610a1e9190610bb8565b60405180910390a1565b610a3061062c565b15610a4d5760405162461bcd60e51b815260040161049690610c2f565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a115b3390565b600060208284031215610a94578081fd5b8135610a9f81610dac565b9392505050565b60008060408385031215610ab8578081fd5b8235610ac381610dac565b91506020830135610ad381610dac565b809150509250929050565b60008060008060808587031215610af3578182fd5b8435610afe81610dac565b93506020850135610b0e81610dac565b92506040850135610b1e81610dac565b9396929550929360600135925050565b600080600060608486031215610b42578283fd5b8335610b4d81610dac565b92506020840135610b5d81610dac565b91506040840135610b6d81610dac565b809150509250925092565b600080600060608486031215610b8c578283fd5b8335610b9781610dac565b92506020840135610ba781610dac565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b901515815260200190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601e908201527f4c45524332303a2043616e6e6f74206265207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f4c53533a2043616e6e6f74206265207a65726f20616464726573730000000000604082015260600190565b6020808252601a908201527f4c4f53534c4553533a204d75737420626520477561726469616e000000000000604082015260600190565b6020808252601f908201527f4c4f53534c4553533a204d757374206265207265636f7665727941646d696e00604082015260600190565b60208082526017908201527f4c4f53534c4553533a204d7573742062652061646d696e000000000000000000604082015260600190565b6020808252601c908201527f4c4f53534c4553533a204d75737420626520706175736541646d696e00000000604082015260600190565b90815260200190565b6001600160a01b0381168114610dc157600080fd5b5056fea2646970667358221220b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d64736f6c63430008000033

Deployed Bytecode Sourcemap

3438:6826:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5157:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8439:309;;;;;;:::i;:::-;;:::i;:::-;;3533:25;;;:::i;:::-;;;;;;;:::i;10056:96::-;;;;;;:::i;:::-;;:::i;8953:332::-;;;;;;:::i;:::-;;:::i;7341:402::-;;;;;;:::i;:::-;;:::i;5803:72::-;;;:::i;3660:23::-;;;:::i;6118:291::-;;;;;;:::i;:::-;;:::i;2075:86::-;;;:::i;:::-;;;;;;;:::i;3592:28::-;;;:::i;7948:255::-;;;;;;:::i;:::-;;:::i;5883:227::-;;;;;;:::i;:::-;;:::i;5718:69::-;;;:::i;6868:250::-;;;;;;:::i;:::-;;:::i;9940:108::-;;;;;;:::i;:::-;;:::i;6417:267::-;;;;;;:::i;:::-;;:::i;5470:207::-;;;;;;:::i;:::-;;:::i;5273:189::-;;;;;;:::i;:::-;;:::i;3565:20::-;;;:::i;5157:81::-;5229:1;5157:81;:::o;8439:309::-;8555:10;8538:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;8538:48:0;;;;;;;;;:60;;;8534:207;;;8632:10;8615:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;8615:48:0;;;;;;;;;;;:57;:114;;-1:-1:-1;;;8615:114:0;;:57;;;;;;:75;;:114;;8632:10;8656:6;;8711:9;;8722:6;;8615:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8534:207;8439:309;;;:::o;3533:25::-;;;-1:-1:-1;;;;;3533:25:0;;:::o;8953:332::-;9092:10;9075:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;9075:48:0;;;;;;;;;:60;;;9071:207;;;9169:10;9152:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;9152:48:0;;;;;;;;;;;:57;:114;;-1:-1:-1;;;9152:114:0;;:57;;;;;;:75;;:114;;9169:10;9193:6;;9248:9;;9259:6;;9152:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9071:207;8953:332;;;;:::o;7341:402::-;5066:8;;-1:-1:-1;;;;;5066:8:0;5052:10;:22;5044:61;;;;-1:-1:-1;;;5044:61:0;;;;;;;:::i;:::-;;;;;;;;;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7520:23:0;;::::2;7488:29;7520:23:::0;;;:16:::2;:23;::::0;;;;;;;:54;;::::2;::::0;;;;;;;;7585:29;;7610:4:::2;-1:-1:-1::0;;7585:29:0;;::::2;;-1:-1:-1::0;;;;;;7625:30:0::2;7585:29;7625:30:::0;;::::2;::::0;;::::2;;::::0;;7671:64;;7520:54;;7625:30;7520:54;;7671:64:::2;::::0;::::2;2441:1;7341:402:::0;;;:::o;5803:72::-;4907:10;;-1:-1:-1;;;;;4907:10:0;4893;:24;4885:65;;;;-1:-1:-1;;;4885:65:0;;;;;;;:::i;:::-;5857:10:::1;:8;:10::i;:::-;5803:72::o:0;3660:23::-;;;-1:-1:-1;;;;;3660:23:0;;:::o;6118:291::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6224:30:0;::::1;6216:73;;;;-1:-1:-1::0;;;6216:73:0::1;;;;;;;:::i;:::-;6326:13;::::0;6305:53:::1;::::0;-1:-1:-1;;;;;6305:53:0;;::::1;::::0;6326:13:::1;::::0;6305:53:::1;::::0;6326:13:::1;::::0;6305:53:::1;6369:13;:32:::0;;-1:-1:-1;;;;;;6369:32:0::1;-1:-1:-1::0;;;;;6369:32:0;;;::::1;::::0;;;::::1;::::0;;6118:291::o;2075:86::-;2146:7;;;;2075:86;:::o;3592:28::-;;;-1:-1:-1;;;;;3592:28:0;;:::o;7948:255::-;5066:8;;-1:-1:-1;;;;;5066:8:0;5052:10;:22;5044:61;;;;-1:-1:-1;;;5044:61:0;;;;;;;:::i;:::-;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8076:23:0;;::::2;;::::0;;;:16:::2;:23;::::0;;;;;;;:54;;::::2;::::0;;;;;;;;;;8069:61;;-1:-1:-1;;;;;;8069:61:0;;;8146:49;::::2;::::0;8076:23;8146:49:::2;7948:255:::0;;:::o;5883:227::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5973:22:0;::::1;5965:65;;;;-1:-1:-1::0;;;5965:65:0::1;;;;;;;:::i;:::-;6059:5;::::0;6046:29:::1;::::0;-1:-1:-1;;;;;6046:29:0;;::::1;::::0;6059:5:::1;::::0;6046:29:::1;::::0;6059:5:::1;::::0;6046:29:::1;6086:5;:16:::0;;-1:-1:-1;;;;;;6086:16:0::1;-1:-1:-1::0;;;;;6086:16:0;;;::::1;::::0;;;::::1;::::0;;5883:227::o;5718:69::-;4907:10;;-1:-1:-1;;;;;4907:10:0;4893;:24;4885:65;;;;-1:-1:-1;;;4885:65:0;;;;;;;:::i;:::-;5771:8:::1;:6;:8::i;6868:250::-:0;4773:5;;-1:-1:-1;;;;;4773:5:0;4782:10;4773:19;4765:55;;;;-1:-1:-1;;;4765:55:0;;;;;;;:::i;:::-;2401:8:::1;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1::0;;;2392:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6970:25:0;::::2;6962:65;;;;-1:-1:-1::0;;;6962:65:0::2;;;;;;;:::i;:::-;7055:8;::::0;7043:34:::2;::::0;-1:-1:-1;;;;;7043:34:0;;::::2;::::0;7055:8:::2;::::0;7043:34:::2;::::0;7055:8:::2;::::0;7043:34:::2;7088:8;:22:::0;;-1:-1:-1;;;;;;7088:22:0::2;-1:-1:-1::0;;;;;7088:22:0;;;::::2;::::0;;;::::2;::::0;;6868:250::o;6417:267::-;4648:13;;-1:-1:-1;;;;;4648:13:0;4634:10;:27;4626:71;;;;-1:-1:-1;;;4626:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6517:27:0;::::1;6509:70;;;;-1:-1:-1::0;;;6509:70:0::1;;;;;;;:::i;:::-;6613:10;::::0;6595:44:::1;::::0;-1:-1:-1;;;;;6595:44:0;;::::1;::::0;6613:10:::1;::::0;6595:44:::1;::::0;6613:10:::1;::::0;6595:44:::1;6650:10;:26:::0;;-1:-1:-1;;;;;;6650:26:0::1;-1:-1:-1::0;;;;;6650:26:0;;;::::1;::::0;;;::::1;::::0;;6417:267::o;5470:207::-;-1:-1:-1;;;;;5606:23:0;;;5571:7;5606:23;;;:16;:23;;;;;;;;:53;;;;;;;;;:62;;;;;;5470:207::o;5273:189::-;-1:-1:-1;;;;;5389:23:0;;;5365:4;5389:23;;;:16;:23;;;;;;;;:53;;;;;;;;;;;:65;;;;5273:189::o;3565:20::-;;;-1:-1:-1;;;;;3565:20:0;;:::o;3134:120::-;2678:8;:6;:8::i;:::-;2670:41;;;;-1:-1:-1;;;2670:41:0;;;;;;;:::i;:::-;3193:7:::1;:15:::0;;-1:-1:-1;;3193:15:0::1;::::0;;3224:22:::1;3233:12;:10;:12::i;:::-;3224:22;;;;;;:::i;:::-;;;;;;;;3134:120::o:0;2875:118::-;2401:8;:6;:8::i;:::-;2400:9;2392:38;;;;-1:-1:-1;;;2392:38:0;;;;;;;:::i;:::-;2935:7:::1;:14:::0;;-1:-1:-1;;2935:14:0::1;2945:4;2935:14;::::0;;2965:20:::1;2972:12;1075:98:::0;1155:10;1075:98;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;:::-;262:5;84:189;-1:-1:-1;;;84:189:1:o;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:1;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:614::-;;;;;848:3;836:9;827:7;823:23;819:33;816:2;;;870:6;862;855:22;816:2;914:9;901:23;933:33;960:5;933:33;:::i;:::-;985:5;-1:-1:-1;1042:2:1;1027:18;;1014:32;1055:35;1014:32;1055:35;:::i;:::-;1109:7;-1:-1:-1;1168:2:1;1153:18;;1140:32;1181:35;1140:32;1181:35;:::i;:::-;806:493;;;;-1:-1:-1;1235:7:1;;1289:2;1274:18;1261:32;;-1:-1:-1;;806:493:1:o;1304:571::-;;;;1476:2;1464:9;1455:7;1451:23;1447:32;1444:2;;;1497:6;1489;1482:22;1444:2;1541:9;1528:23;1560:33;1587:5;1560:33;:::i;:::-;1612:5;-1:-1:-1;1669:2:1;1654:18;;1641:32;1682:35;1641:32;1682:35;:::i;:::-;1736:7;-1:-1:-1;1795:2:1;1780:18;;1767:32;1808:35;1767:32;1808:35;:::i;:::-;1862:7;1852:17;;;1434:441;;;;;:::o;1880:470::-;;;;2026:2;2014:9;2005:7;2001:23;1997:32;1994:2;;;2047:6;2039;2032:22;1994:2;2091:9;2078:23;2110:33;2137:5;2110:33;:::i;:::-;2162:5;-1:-1:-1;2219:2:1;2204:18;;2191:32;2232:35;2191:32;2232:35;:::i;:::-;1984:366;;2286:7;;-1:-1:-1;;;2340:2:1;2325:18;;;;2312:32;;1984:366::o;2355:203::-;-1:-1:-1;;;;;2519:32:1;;;;2501:51;;2489:2;2474:18;;2456:102::o;2563:456::-;-1:-1:-1;;;;;2850:15:1;;;2832:34;;2902:15;;;2897:2;2882:18;;2875:43;2954:15;;2949:2;2934:18;;2927:43;3001:2;2986:18;;2979:34;;;;2781:3;2766:19;;2748:271::o;3024:187::-;3189:14;;3182:22;3164:41;;3152:2;3137:18;;3119:92::o;3216:344::-;3418:2;3400:21;;;3457:2;3437:18;;;3430:30;-1:-1:-1;;;3491:2:1;3476:18;;3469:50;3551:2;3536:18;;3390:170::o;3565:340::-;3767:2;3749:21;;;3806:2;3786:18;;;3779:30;-1:-1:-1;;;3840:2:1;3825:18;;3818:46;3896:2;3881:18;;3739:166::o;3910:354::-;4112:2;4094:21;;;4151:2;4131:18;;;4124:30;4190:32;4185:2;4170:18;;4163:60;4255:2;4240:18;;4084:180::o;4269:351::-;4471:2;4453:21;;;4510:2;4490:18;;;4483:30;4549:29;4544:2;4529:18;;4522:57;4611:2;4596:18;;4443:177::o;4625:350::-;4827:2;4809:21;;;4866:2;4846:18;;;4839:30;4905:28;4900:2;4885:18;;4878:56;4966:2;4951:18;;4799:176::o;4980:355::-;5182:2;5164:21;;;5221:2;5201:18;;;5194:30;5260:33;5255:2;5240:18;;5233:61;5326:2;5311:18;;5154:181::o;5340:347::-;5542:2;5524:21;;;5581:2;5561:18;;;5554:30;5620:25;5615:2;5600:18;;5593:53;5678:2;5663:18;;5514:173::o;5692:352::-;5894:2;5876:21;;;5933:2;5913:18;;;5906:30;5972;5967:2;5952:18;;5945:58;6035:2;6020:18;;5866:178::o;6049:177::-;6195:25;;;6183:2;6168:18;;6150:76::o;6231:133::-;-1:-1:-1;;;;;6308:31:1;;6298:42;;6288:2;;6354:1;6351;6344:12;6288:2;6278:86;:::o

Swarm Source

ipfs://b4d4e6342db60e940f855b162f5ddbff6f9ab71866bdbf31fe5443df9fc4b74d

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

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.