ETH Price: $2,630.36 (+0.05%)

Contract

0x199CA6e284F344210F9A3090d1eaf7D3B88Ca079
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Call207670952024-09-17 1:36:3514 days ago1726536995IN
0x199CA6e2...3B88Ca079
0 ETH0.000161451.75706282
Transfer207670912024-09-17 1:35:4714 days ago1726536947IN
0x199CA6e2...3B88Ca079
39.9988 ETH0.000080233.8107251
Call207597262024-09-16 0:52:3515 days ago1726447955IN
0x199CA6e2...3B88Ca079
0 ETH0.000166671.56762434
Call206258412024-08-28 8:17:5934 days ago1724833079IN
0x199CA6e2...3B88Ca079
0 ETH0.000156311.70073149
Transfer206258352024-08-28 8:16:4734 days ago1724833007IN
0x199CA6e2...3B88Ca079
39.9987 ETH0.000077463.67928561
Call204884372024-08-09 3:44:5953 days ago1723175099IN
0x199CA6e2...3B88Ca079
0 ETH0.000151251.64567976
Transfer204883592024-08-09 3:29:2353 days ago1723174163IN
0x199CA6e2...3B88Ca079
19.9987 ETH0.000073453.48852497
Call202429582024-07-05 21:21:2387 days ago1720214483IN
0x199CA6e2...3B88Ca079
0 ETH0.000238892.59918263
Transfer202429482024-07-05 21:19:1187 days ago1720214351IN
0x199CA6e2...3B88Ca079
19.9985 ETH0.000114655.44573409
Call201873172024-06-28 2:52:1195 days ago1719543131IN
0x199CA6e2...3B88Ca079
0 ETH0.000553416.02119118
Transfer201873132024-06-28 2:51:2395 days ago1719543083IN
0x199CA6e2...3B88Ca079
29.9985 ETH0.000198269.41668267
Call201155372024-06-18 2:00:11105 days ago1718676011IN
0x199CA6e2...3B88Ca079
0 ETH0.0063985558.51178884
Call200759702024-06-12 13:13:11110 days ago1718197991IN
0x199CA6e2...3B88Ca079
0 ETH0.0036095733.01145057
Call200550762024-06-09 15:10:59113 days ago1717945859IN
0x199CA6e2...3B88Ca079
0 ETH0.0015832617.22592913
Transfer200550202024-06-09 14:59:47113 days ago1717945187IN
0x199CA6e2...3B88Ca079
49.9983 ETH0.0003027814.38070977
Call199470112024-05-25 12:52:11128 days ago1716641531IN
0x199CA6e2...3B88Ca079
0 ETH0.000650975.95281883
Call199303602024-05-23 5:01:35131 days ago1716440495IN
0x199CA6e2...3B88Ca079
0 ETH0.000449244.10814445
Call198968792024-05-18 12:38:47135 days ago1716035927IN
0x199CA6e2...3B88Ca079
0 ETH0.000341683.21320826
Call197901292024-05-03 14:17:23150 days ago1714745843IN
0x199CA6e2...3B88Ca079
0 ETH0.0010226811.12675147
Transfer197760362024-05-01 15:00:35152 days ago1714575635IN
0x199CA6e2...3B88Ca079
29.9982 ETH0.0002633212.50634237
Call196519382024-04-14 6:18:35170 days ago1713075515IN
0x199CA6e2...3B88Ca079
0 ETH0.0011143411.59349964
Call193627522024-03-04 15:40:23210 days ago1709566823IN
0x199CA6e2...3B88Ca079
0 ETH0.01080177101.59206851
Call192976042024-02-24 13:00:35219 days ago1708779635IN
0x199CA6e2...3B88Ca079
0 ETH0.0026489124.91337725
Call192036342024-02-11 8:27:47233 days ago1707640067IN
0x199CA6e2...3B88Ca079
0 ETH0.0032645430.706966
Call188087422023-12-17 22:34:23288 days ago1702852463IN
0x199CA6e2...3B88Ca079
0 ETH0.0038372836.09010495
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
207670952024-09-17 1:36:3514 days ago1726536995
0x199CA6e2...3B88Ca079
39.9988 ETH
206258412024-08-28 8:17:5934 days ago1724833079
0x199CA6e2...3B88Ca079
39.9987 ETH
204884372024-08-09 3:44:5953 days ago1723175099
0x199CA6e2...3B88Ca079
19.9987 ETH
202429582024-07-05 21:21:2387 days ago1720214483
0x199CA6e2...3B88Ca079
19.9985 ETH
201873172024-06-28 2:52:1195 days ago1719543131
0x199CA6e2...3B88Ca079
29.9985 ETH
200550762024-06-09 15:10:59113 days ago1717945859
0x199CA6e2...3B88Ca079
49.9983 ETH
197901292024-05-03 14:17:23150 days ago1714745843
0x199CA6e2...3B88Ca079
29.9982 ETH
173121692023-05-22 3:28:11498 days ago1684726091
0x199CA6e2...3B88Ca079
1.0059823 ETH
169336092023-03-29 14:42:11551 days ago1680100931
0x199CA6e2...3B88Ca079
69.58452069 ETH
169335962023-03-29 14:39:35551 days ago1680100775
0x199CA6e2...3B88Ca079
69.58452069 ETH
164055502023-01-14 14:09:59625 days ago1673705399
0x199CA6e2...3B88Ca079
74.27007717 ETH
164054872023-01-14 13:57:23625 days ago1673704643
0x199CA6e2...3B88Ca079
74.27007717 ETH
163767302023-01-10 13:33:11629 days ago1673357591
0x199CA6e2...3B88Ca079
70.75333382 ETH
163767222023-01-10 13:31:35629 days ago1673357495
0x199CA6e2...3B88Ca079
70.75333382 ETH
163661632023-01-09 2:10:23631 days ago1673230223
0x199CA6e2...3B88Ca079
66.17987361 ETH
163661422023-01-09 2:06:11631 days ago1673229971
0x199CA6e2...3B88Ca079
66.17987361 ETH
163617522023-01-08 11:24:35632 days ago1673177075
0x199CA6e2...3B88Ca079
66.65474769 ETH
163612752023-01-08 9:47:59632 days ago1673171279
0x199CA6e2...3B88Ca079
66.65474769 ETH
162890982022-12-29 8:03:23642 days ago1672301003
0x199CA6e2...3B88Ca079
91.681 ETH
162890882022-12-29 8:01:23642 days ago1672300883
0x199CA6e2...3B88Ca079
91.681 ETH
162058602022-12-17 17:18:23653 days ago1671297503
0x199CA6e2...3B88Ca079
82.675 ETH
162058562022-12-17 17:17:35653 days ago1671297455
0x199CA6e2...3B88Ca079
82.675 ETH
161990462022-12-16 18:27:23654 days ago1671215243
0x199CA6e2...3B88Ca079
116.7717675 ETH
161990312022-12-16 18:24:23654 days ago1671215063
0x199CA6e2...3B88Ca079
116.7717675 ETH
161987612022-12-16 17:30:23654 days ago1671211823
0x199CA6e2...3B88Ca079
80.794 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingBridge

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 16 : StakingBridge.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "./lib/OwnerManagable.sol";
import "./lib/BytesUtil.sol";
import "./lib/Drainable.sol";
import "./lib/ApprovalCheck.sol";
import "./thirdparty/erc165/IERC165.sol";
import "./thirdparty/erc1155/ERC1155Holder.sol";
import "./thirdparty/erc721/ERC721Holder.sol";

contract StakingBridge is OwnerManagable, Drainable, IERC165, ERC721Holder, ERC1155Holder, ApprovalCheck {
    using BytesUtil for bytes;

    mapping(address => mapping(bytes4 => bool)) public authorized;

    event CallSucceeded(uint callId, address target, bytes4 method);
    event CallReverted(uint callId, address target, bytes4 method);

    modifier withAccess(address target, bytes4 selector) {
        require(authorized[target][selector], "UNAUTHORIZED_CALLE");
        _;
    }

    receive() external payable { }

    function authorizeCall(address target, bytes4 selector)
        external
        onlyOwner
    {
        authorized[target][selector] = true;
    }

    function unauthorizeCall(address target, bytes4 selector)
        external
        onlyOwner
    {
        delete authorized[target][selector];
    }

    function setApproveSpender(address target, bool allowed)
        external
        onlyOwner
    {
        _setApproveSpender(target, allowed);
    }

    function call(uint callId, address target, bytes calldata data, uint ethAmount)
        payable
        external
        onlyManager(msg.sender)
        withAccess(target, data.toBytes4(0))
        isApprovalAllowed(data)
    {
        (bool success, /*bytes memory returnData*/) = target
            .call{value: ethAmount}(data);

        if (success) {
	    emit CallSucceeded(callId, target, data.toBytes4(0));
        } else {
	    emit CallReverted(callId, target, data.toBytes4(0));
	}

    }

    function canDrain(address drainer, address /*token*/)
        public
        view
        override
        returns (bool)
    {
        return drainer == owner;
    }

    // ERC165
    function supportsInterface(
        bytes4 interfaceId
        )
        external
        pure
        override
        returns (bool)
    {
        return  interfaceId == type(IERC165).interfaceId ||
                interfaceId == type(IERC721Receiver).interfaceId ||
                interfaceId == type(IERC1155Receiver).interfaceId;
    }
}

File 2 of 16 : OwnerManagable.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;

import "./AddressSet.sol";
import "./Claimable.sol";


contract OwnerManagable is Claimable, AddressSet
{
    bytes32 internal constant MANAGER = keccak256("__MANAGED__");

    event ManagerAdded  (address indexed manager);
    event ManagerRemoved(address indexed manager);

    modifier onlyManager(address addr)
    {
        require(isManager(addr), "NOT_MANAGER");
        _;
    }

    modifier onlyFromManager
    {
        require(isManager(msg.sender), "NOT_MANAGER");
        _;
    }

    modifier onlyOwnerOrManager
    {
        require(msg.sender == owner || isManager(msg.sender), "NOT_OWNER_OR_MANAGER");
        _;
    }

    constructor() Claimable() {}

    /// @dev Gets the managers.
    /// @return The list of managers.
    function managers()
        public
        view
        returns (address[] memory)
    {
        return addressesInSet(MANAGER);
    }

    /// @dev Gets the number of managers.
    /// @return The numer of managers.
    function numManagers()
        public
        view
        returns (uint)
    {
        return numAddressesInSet(MANAGER);
    }

    /// @dev Checks if an address is a manger.
    /// @param addr The address to check.
    /// @return True if the address is a manager, False otherwise.
    function isManager(address addr)
        public
        view
        returns (bool)
    {
        return isAddressInSet(MANAGER, addr);
    }

    /// @dev Adds a new manager.
    /// @param manager The new address to add.
    function addManager(address manager)
        public
        virtual
        onlyOwner
    {
        addManagerInternal(manager);
    }

    /// @dev Removes a manager.
    /// @param manager The manager to remove.
    function removeManager(address manager)
        public
        virtual
        onlyOwner
    {
        removeAddressFromSet(MANAGER, manager);
        emit ManagerRemoved(manager);
    }

    function addManagerInternal(address manager)
        internal
    {
        addAddressToSet(MANAGER, manager, true);
        emit ManagerAdded(manager);
    }
}

File 3 of 16 : BytesUtil.sol
// SPDX-License-Identifier: UNLICENSED
//Mainly taken from https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol
pragma solidity ^0.8.0;

library BytesUtil {
    function toBytes4(bytes memory _bytes, uint _start) internal  pure returns (bytes4) {
        require(_bytes.length >= (_start + 4));
        bytes4 tempBytes4;

        assembly {
            tempBytes4 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes4;
    }

    function toAddress(bytes memory _bytes, uint _start) internal  pure returns (address) {
        require(_bytes.length >= (_start + 20));
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

}

File 4 of 16 : Drainable.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./ERC20SafeTransfer.sol";
import "./AddressUtil.sol";


/// @title Drainable
/// @author Brecht Devos - <[email protected]>
/// @dev Standard functionality to allow draining funds from a contract.
abstract contract Drainable
{
    using AddressUtil for address;
    using ERC20SafeTransfer for address;

    event Drained(
        address to,
        address token,
        uint    amount
    );

    function drain(
        address to,
        address token
        )
        public
        returns (uint amount)
    {
        require(canDrain(msg.sender, token), "UNAUTHORIZED");

        if (token == address(0)) {
            amount = address(this).balance;
            to.sendETHAndVerify(amount, gasleft());   // ETH
        } else {
            amount = ERC20(token).balanceOf(address(this));
            token.safeTransferAndVerify(to, amount);  // ERC20 token
        }

        emit Drained(to, token, amount);
    }

    // Needs to return if the address is authorized to call drain.
    function canDrain(address drainer, address token)
        public
        virtual
        view
        returns (bool);
}

File 5 of 16 : ApprovalCheck.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./BytesUtil.sol";


/// @title ApprovalCheck
/// @author Kongliang Zhong - <[email protected]>
/// @dev check ERC20 approve calls, only allowed when to address is whitelisted.
abstract contract ApprovalCheck {
    using BytesUtil for bytes;

    bytes4 public constant Erc20ApproveSelector = ERC20.approve.selector;
    mapping (address => bool) public allowedSpender;

    modifier isApprovalAllowed(bytes memory data) {
        if (data.toBytes4(0) == Erc20ApproveSelector) {
            address spender = data.toAddress(4 + 12);
            require(allowedSpender[spender], "APPROVAL_SPENDER_NOW_ALLOWED");
        }

        _;
    }

    function _setApproveSpender(address target, bool allowed) internal {
        require(target != address(0), "ZERO_ADDRESS");
        allowedSpender[target] = allowed;
    }

}

File 6 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 16 : ERC1155Holder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155Receiver.sol";

/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is IERC1155Receiver {
    function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override pure returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override pure returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

File 8 of 16 : ERC721Holder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721Receiver.sol";

  /**
   * @dev Implementation of the {IERC721Receiver} interface.
   *
   * Accepts all token transfers.
   * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
   */
contract ERC721Holder is IERC721Receiver {

    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address, address, uint256, bytes memory) public virtual override pure returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

File 9 of 16 : AddressSet.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;


/// @title AddressSet
/// @author Daniel Wang - <[email protected]>
contract AddressSet
{
    struct Set
    {
        address[] addresses;
        mapping (address => uint) positions;
        uint count;
    }
    mapping (bytes32 => Set) private sets;

    function addAddressToSet(
        bytes32 key,
        address addr,
        bool maintainList
        ) internal
    {
        Set storage set = sets[key];
        require(set.positions[addr] == 0, "ALREADY_IN_SET");

        if (maintainList) {
            require(set.addresses.length == set.count, "PREVIOUSLY_NOT_MAINTAILED");
            set.addresses.push(addr);
        } else {
            require(set.addresses.length == 0, "MUST_MAINTAIN");
        }

        set.count += 1;
        set.positions[addr] = set.count;
    }

    function removeAddressFromSet(
        bytes32 key,
        address addr
        )
        internal
    {
        Set storage set = sets[key];
        uint pos = set.positions[addr];
        require(pos != 0, "NOT_IN_SET");

        delete set.positions[addr];
        set.count -= 1;

        if (set.addresses.length > 0) {
            address lastAddr = set.addresses[set.count];
            if (lastAddr != addr) {
                set.addresses[pos - 1] = lastAddr;
                set.positions[lastAddr] = pos;
            }
            set.addresses.pop();
        }
    }

    function removeSet(bytes32 key)
        internal
    {
        delete sets[key];
    }

    function isAddressInSet(
        bytes32 key,
        address addr
        )
        internal
        view
        returns (bool)
    {
        return sets[key].positions[addr] != 0;
    }

    function numAddressesInSet(bytes32 key)
        internal
        view
        returns (uint)
    {
        Set storage set = sets[key];
        return set.count;
    }

    function addressesInSet(bytes32 key)
        internal
        view
        returns (address[] memory)
    {
        Set storage set = sets[key];
        require(set.count == set.addresses.length, "NOT_MAINTAINED");
        return sets[key].addresses;
    }
}

File 10 of 16 : Claimable.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;

import "./Ownable.sol";


/// @title Claimable
/// @author Brecht Devos - <[email protected]>
/// @dev Extension for the Ownable contract, where the ownership needs
///      to be claimed. This allows the new owner to accept the transfer.
contract Claimable is Ownable
{
    address public pendingOwner;

    /// @dev Modifier throws if called by any account other than the pendingOwner.
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner, "UNAUTHORIZED");
        _;
    }

    /// @dev Allows the current owner to set the pendingOwner address.
    /// @param newOwner The address to transfer ownership to.
    function transferOwnership(
        address newOwner
        )
        public
        override
        onlyOwner
    {
        require(newOwner != address(0) && newOwner != owner, "INVALID_ADDRESS");
        pendingOwner = newOwner;
    }

    /// @dev Allows the pendingOwner address to finalize the transfer.
    function claimOwnership()
        public
        onlyPendingOwner
    {
        emit OwnershipTransferred(owner, pendingOwner);
        owner = pendingOwner;
        pendingOwner = address(0);
    }
}

File 11 of 16 : Ownable.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;


/// @title Ownable
/// @author Brecht Devos - <[email protected]>
/// @dev The Ownable contract has an owner address, and provides basic
///      authorization control functions, this simplifies the implementation of
///      "user permissions".
contract Ownable
{
    address public owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /// @dev The Ownable constructor sets the original `owner` of the contract
    ///      to the sender.
    constructor()
    {
        owner = msg.sender;
    }

    /// @dev Throws if called by any account other than the owner.
    modifier onlyOwner()
    {
        require(msg.sender == owner, "UNAUTHORIZED");
        _;
    }

    /// @dev Allows the current owner to transfer control of the contract to a
    ///      new owner.
    /// @param newOwner The address to transfer ownership to.
    function transferOwnership(
        address newOwner
        )
        public
        virtual
        onlyOwner
    {
        require(newOwner != address(0), "ZERO_ADDRESS");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function renounceOwnership()
        public
        onlyOwner
    {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }
}

File 12 of 16 : ERC20.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;


/// @title ERC20 Token Interface
/// @dev see https://github.com/ethereum/EIPs/issues/20
/// @author Daniel Wang - <[email protected]>
abstract contract ERC20
{
    function totalSupply()
        public
        virtual
        view
        returns (uint);

    function balanceOf(
        address who
        )
        public
        virtual
        view
        returns (uint);

    function allowance(
        address owner,
        address spender
        )
        public
        virtual
        view
        returns (uint);

    function transfer(
        address to,
        uint value
        )
        public
        virtual
        returns (bool);

    function transferFrom(
        address from,
        address to,
        uint    value
        )
        public
        virtual
        returns (bool);

    function approve(
        address spender,
        uint    value
        )
        public
        virtual
        returns (bool);
}

File 13 of 16 : ERC20SafeTransfer.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;


/// @title ERC20 safe transfer
/// @dev see https://github.com/sec-bit/badERC20Fix
/// @author Brecht Devos - <[email protected]>
library ERC20SafeTransfer
{
    function safeTransferAndVerify(
        address token,
        address to,
        uint    value
        )
        internal
    {
        safeTransferWithGasLimitAndVerify(
            token,
            to,
            value,
            gasleft()
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint    value
        )
        internal
        returns (bool)
    {
        return safeTransferWithGasLimit(
            token,
            to,
            value,
            gasleft()
        );
    }

    function safeTransferWithGasLimitAndVerify(
        address token,
        address to,
        uint    value,
        uint    gasLimit
        )
        internal
    {
        require(
            safeTransferWithGasLimit(token, to, value, gasLimit),
            "TRANSFER_FAILURE"
        );
    }

    function safeTransferWithGasLimit(
        address token,
        address to,
        uint    value,
        uint    gasLimit
        )
        internal
        returns (bool)
    {
        // A transfer is successful when 'call' is successful and depending on the token:
        // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false)
        // - A single boolean is returned: this boolean needs to be true (non-zero)

        // bytes4(keccak256("transfer(address,uint256)")) = 0xa9059cbb
        bytes memory callData = abi.encodeWithSelector(
            bytes4(0xa9059cbb),
            to,
            value
        );
        (bool success, ) = token.call{gas: gasLimit}(callData);
        return checkReturnValue(success);
    }

    function safeTransferFromAndVerify(
        address token,
        address from,
        address to,
        uint    value
        )
        internal
    {
        safeTransferFromWithGasLimitAndVerify(
            token,
            from,
            to,
            value,
            gasleft()
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint    value
        )
        internal
        returns (bool)
    {
        return safeTransferFromWithGasLimit(
            token,
            from,
            to,
            value,
            gasleft()
        );
    }

    function safeTransferFromWithGasLimitAndVerify(
        address token,
        address from,
        address to,
        uint    value,
        uint    gasLimit
        )
        internal
    {
        bool result = safeTransferFromWithGasLimit(
            token,
            from,
            to,
            value,
            gasLimit
        );
        require(result, "TRANSFER_FAILURE");
    }

    function safeTransferFromWithGasLimit(
        address token,
        address from,
        address to,
        uint    value,
        uint    gasLimit
        )
        internal
        returns (bool)
    {
        // A transferFrom is successful when 'call' is successful and depending on the token:
        // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false)
        // - A single boolean is returned: this boolean needs to be true (non-zero)

        // bytes4(keccak256("transferFrom(address,address,uint256)")) = 0x23b872dd
        bytes memory callData = abi.encodeWithSelector(
            bytes4(0x23b872dd),
            from,
            to,
            value
        );
        (bool success, ) = token.call{gas: gasLimit}(callData);
        return checkReturnValue(success);
    }

    function checkReturnValue(
        bool success
        )
        internal
        pure
        returns (bool)
    {
        // A transfer/transferFrom is successful when 'call' is successful and depending on the token:
        // - No value is returned: we assume a revert when the transfer failed (i.e. 'call' returns false)
        // - A single boolean is returned: this boolean needs to be true (non-zero)
        if (success) {
            assembly {
                switch returndatasize()
                // Non-standard ERC20: nothing is returned so if 'call' was successful we assume the transfer succeeded
                case 0 {
                    success := 1
                }
                // Standard ERC20: a single boolean value is returned which needs to be true
                case 32 {
                    returndatacopy(0, 0, 32)
                    success := mload(0)
                }
                // None of the above: not successful
                default {
                    success := 0
                }
            }
        }
        return success;
    }
}

File 14 of 16 : AddressUtil.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.8.0;


/// @title Utility Functions for addresses
/// @author Daniel Wang - <[email protected]>
/// @author Brecht Devos - <[email protected]>
library AddressUtil
{
    using AddressUtil for *;

    function isContract(
        address addr
        )
        internal
        view
        returns (bool)
    {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(addr) }
        return (codehash != 0x0 &&
                codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }

    function toPayable(
        address addr
        )
        internal
        pure
        returns (address payable)
    {
        return payable(addr);
    }

    // Works like address.send but with a customizable gas limit
    // Make sure your code is safe for reentrancy when using this function!
    function sendETH(
        address to,
        uint    amount,
        uint    gasLimit
        )
        internal
        returns (bool success)
    {
        if (amount == 0) {
            return true;
        }
        address payable recipient = to.toPayable();
        /* solium-disable-next-line */
        (success, ) = recipient.call{value: amount, gas: gasLimit}("");
    }

    // Works like address.transfer but with a customizable gas limit
    // Make sure your code is safe for reentrancy when using this function!
    function sendETHAndVerify(
        address to,
        uint    amount,
        uint    gasLimit
        )
        internal
        returns (bool success)
    {
        success = to.sendETH(amount, gasLimit);
        require(success, "TRANSFER_FAILURE");
    }

    // Works like call but is slightly more efficient when data
    // needs to be copied from memory to do the call.
    function fastCall(
        address to,
        uint    gasLimit,
        uint    value,
        bytes   memory data
        )
        internal
        returns (bool success, bytes memory returnData)
    {
        if (to != address(0)) {
            assembly {
                // Do the call
                success := call(gasLimit, to, value, add(data, 32), mload(data), 0, 0)
                // Copy the return data
                let size := returndatasize()
                returnData := mload(0x40)
                mstore(returnData, size)
                returndatacopy(add(returnData, 32), 0, size)
                // Update free memory pointer
                mstore(0x40, add(returnData, add(32, size)))
            }
        }
    }

    // Like fastCall, but throws when the call is unsuccessful.
    function fastCallAndVerify(
        address to,
        uint    gasLimit,
        uint    value,
        bytes   memory data
        )
        internal
        returns (bytes memory returnData)
    {
        bool success;
        (success, returnData) = fastCall(to, gasLimit, value, data);
        if (!success) {
            assembly {
                revert(add(returnData, 32), mload(returnData))
            }
        }
    }
}

File 15 of 16 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * _Available since v3.1._
 */
interface IERC1155Receiver {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

File 16 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes4","name":"method","type":"bytes4"}],"name":"CallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"callId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes4","name":"method","type":"bytes4"}],"name":"CallSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Drained","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"Erc20ApproveSelector","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"authorizeCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"callId","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"call","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"drainer","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"canDrain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"drain","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numManagers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setApproveSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"unauthorizeCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b0319163317905561209d806100326000396000f3fe6080604052600436106101845760003560e01c80638da5cb5b116100d6578063bc197c811161007f578063f23a6e6111610059578063f23a6e6114610532578063f2fde38b14610577578063f3ae24151461059757600080fd5b8063bc197c8114610470578063e30c3978146104b5578063e68777d7146104d557600080fd5b8063a6e977d0116100b0578063a6e977d01461041d578063a8c1e9c11461043d578063ac18de431461045057600080fd5b80638da5cb5b146103955780638ef369ba146103cd578063907d985b146103ed57600080fd5b8063715018a6116101385780637b977ec4116101125780637b977ec4146103035780637eaf312114610337578063837971e41461036757600080fd5b8063715018a61461029157806371b87298146102a657806372311705146102e157600080fd5b8063150b7a0211610169578063150b7a02146101e75780632d06177a1461025c5780634e71e0c81461027c57600080fd5b806301ffc9a7146101905780630e5fa4cd146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004611e45565b6105b7565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004611e1c565b61069c565b005b3480156101f357600080fd5b5061022b610202366004611d19565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101bc565b34801561026857600080fd5b506101e5610277366004611c27565b610769565b34801561028857600080fd5b506101e56107cf565b34801561029d57600080fd5b506101e56108a5565b3480156102b257600080fd5b506101b06102c1366004611e1c565b600460209081526000928352604080842090915290825290205460ff1681565b3480156102ed57600080fd5b506102f6610961565b6040516101bc9190611f4a565b34801561030f57600080fd5b5061022b7f095ea7b30000000000000000000000000000000000000000000000000000000081565b34801561034357600080fd5b506101b0610352366004611c27565b60036020526000908152604090205460ff1681565b34801561037357600080fd5b50610387610382366004611c41565b610991565b6040519081526020016101bc565b3480156103a157600080fd5b506000546103b5906001600160a01b031681565b6040516001600160a01b0390911681526020016101bc565b3480156103d957600080fd5b506101e56103e8366004611e1c565b610b0f565b3480156103f957600080fd5b506101b0610408366004611c41565b506000546001600160a01b0390811691161490565b34801561042957600080fd5b506101e5610438366004611de2565b610bda565b6101e561044b366004611e77565b610c42565b34801561045c57600080fd5b506101e561046b366004611c27565b61104f565b34801561047c57600080fd5b5061022b61048b366004611c73565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156104c157600080fd5b506001546103b5906001600160a01b031681565b3480156104e157600080fd5b507fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f860005260026020527fcb12253ebf62631b6bd57b44a6063538cd5b38bb493f10fcea7a14477e41e7a854610387565b34801561053e57600080fd5b5061022b61054d366004611d7f565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561058357600080fd5b506101e5610592366004611c27565b61110a565b3480156105a357600080fd5b506101b06105b2366004611c27565b611210565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000148061064a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061069657507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b92915050565b6000546001600160a01b031633146106fb5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0390911660009081526004602090815260408083207fffffffff0000000000000000000000000000000000000000000000000000000090941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000546001600160a01b031633146107c35760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6107cc8161124f565b50565b6001546001600160a01b031633146108295760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b6000546001600160a01b031633146108ff5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b606061098c7fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f86112b2565b905090565b600080546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b038216610a18575047610a12815a6001600160a01b0386169190611384565b50610abe565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610a7057600080fd5b505afa158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa89190611e5f565b9050610abe6001600160a01b03831684836113f0565b604080516001600160a01b038086168252841660208201529081018290527fbfd2431e6c719bec0308db4f4ed0afc39712d368867354c711a1ea1e384fa7819060600160405180910390a192915050565b6000546001600160a01b03163314610b695760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0390911660009081526004602090815260408083207fffffffff0000000000000000000000000000000000000000000000000000000090941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000546001600160a01b03163314610c345760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b610c3e8282611401565b5050565b33610c4c81611210565b610c985760405162461bcd60e51b815260206004820152600b60248201527f4e4f545f4d414e4147455200000000000000000000000000000000000000000060448201526064016106f2565b84610cdd600086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b6001600160a01b03821660009081526004602090815260408083207fffffffff000000000000000000000000000000000000000000000000000000008516845290915290205460ff16610d725760405162461bcd60e51b815260206004820152601260248201527f554e415554484f52495a45445f43414c4c45000000000000000000000000000060448201526064016106f2565b85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052507f095ea7b3000000000000000000000000000000000000000000000000000000009350610dd492508491506114a0565b7fffffffff00000000000000000000000000000000000000000000000000000000161415610e76576000610e098260106114c3565b6001600160a01b03811660009081526003602052604090205490915060ff16610e745760405162461bcd60e51b815260206004820152601c60248201527f415050524f56414c5f5350454e4445525f4e4f575f414c4c4f5745440000000060448201526064016106f2565b505b6000886001600160a01b0316868989604051610e93929190611f01565b60006040518083038185875af1925050503d8060008114610ed0576040519150601f19603f3d011682016040523d82523d6000602084013e610ed5565b606091505b505090508015610f93577fae8e3cedf7fc44ab393da64789fd4a4c8d85259cbc55a795a9fb630b893a55378a8a610f4660008c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b604080519384526001600160a01b0390921660208401527fffffffff00000000000000000000000000000000000000000000000000000000169082015260600160405180910390a1611043565b7f7af015e7613a8a9cf091f9a299aec7409798cb347db8e4b33807dc08e01afbcb8a8a610ffa60008c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b604080519384526001600160a01b0390921660208401527fffffffff00000000000000000000000000000000000000000000000000000000169082015260600160405180910390a15b50505050505050505050565b6000546001600160a01b031633146110a95760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6110d37fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f8826114f6565b6040516001600160a01b038216907fef69f7d97228658c92417be1b16b19058315de71fecb435d07b7d23728b6bd3190600090a250565b6000546001600160a01b031633146111645760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0381161580159061118a57506000546001600160a01b03828116911614155b6111d65760405162461bcd60e51b815260206004820152600f60248201527f494e56414c49445f41444452455353000000000000000000000000000000000060448201526064016106f2565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6001600160a01b03811660009081527fcb12253ebf62631b6bd57b44a6063538cd5b38bb493f10fcea7a14477e41e7a760205260408120541515610696565b61127b7fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f882600161173d565b6040516001600160a01b038216907f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a90600090a250565b6000818152600260208190526040909120805491810154606092146113195760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f4d41494e5441494e454400000000000000000000000000000000000060448201526064016106f2565b6000838152600260209081526040918290208054835181840281018401909452808452909183018282801561137757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611359575b5050505050915050919050565b600061139a6001600160a01b03851684846118e6565b9050806113e95760405162461bcd60e51b815260206004820152601060248201527f5452414e534645525f4641494c5552450000000000000000000000000000000060448201526064016106f2565b9392505050565b6113fc8383835a611954565b505050565b6001600160a01b0382166114575760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0391909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60006114ad826004611fda565b835110156114ba57600080fd5b50016020015190565b60006114d0826014611fda565b835110156114dd57600080fd5b5001602001516c01000000000000000000000000900490565b60008281526002602090815260408083206001600160a01b038516845260018101909252909120548061156b5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f494e5f5345540000000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b03831660009081526001808401602052604082208290556002840180549192909161159e908490611ff2565b9091555050815415611737576000826000018360020154815481106115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912001546001600160a01b039081169150841681146116a557808361161a600185611ff2565b81548110611651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055918316815260018501909152604090208290555b82548390806116dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b50505050565b60008381526002602090815260408083206001600160a01b03861684526001810190925290912054156117b25760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f494e5f53455400000000000000000000000000000000000060448201526064016106f2565b811561185457600281015481541461180c5760405162461bcd60e51b815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c45440000000000000060448201526064016106f2565b80546001810182556000828152602090200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385161790556118a3565b8054156118a35760405162461bcd60e51b815260206004820152600d60248201527f4d5553545f4d41494e5441494e0000000000000000000000000000000000000060448201526064016106f2565b60018160020160008282546118b89190611fda565b909155505060028101546001600160a01b039093166000908152600190910160205260409020919091555050565b6000826118f5575060016113e9565b6040516001600160a01b038516908190849086906000818181858888f193505050503d8060008114611943576040519150601f19603f3d011682016040523d82523d6000602084013e611948565b606091505b50909695505050505050565b611960848484846119ac565b6117375760405162461bcd60e51b815260206004820152601060248201527f5452414e534645525f4641494c5552450000000000000000000000000000000060448201526064016106f2565b604080516001600160a01b038581166024830152604480830186905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928391908816908590611a39908590611f11565b60006040518083038160008787f1925050503d8060008114611a77576040519150601f19603f3d011682016040523d82523d6000602084013e611a7c565b606091505b50509050611a8981611a94565b979650505050505050565b60008115611acb573d8015611ab45760208114611abd5760009250611ac9565b60019250611ac9565b60206000803e60005192505b505b5090565b80356001600160a01b0381168114611ae657600080fd5b919050565b600082601f830112611afb578081fd5b8135602067ffffffffffffffff821115611b1757611b17612038565b8160051b611b26828201611f8b565b838152828101908684018388018501891015611b40578687fd5b8693505b85841015611b62578035835260019390930192918401918401611b44565b50979650505050505050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114611ae657600080fd5b600082601f830112611bae578081fd5b813567ffffffffffffffff811115611bc857611bc8612038565b611bf960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611f8b565b818152846020838601011115611c0d578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611c38578081fd5b6113e982611acf565b60008060408385031215611c53578081fd5b611c5c83611acf565b9150611c6a60208401611acf565b90509250929050565b600080600080600060a08688031215611c8a578081fd5b611c9386611acf565b9450611ca160208701611acf565b9350604086013567ffffffffffffffff80821115611cbd578283fd5b611cc989838a01611aeb565b94506060880135915080821115611cde578283fd5b611cea89838a01611aeb565b93506080880135915080821115611cff578283fd5b50611d0c88828901611b9e565b9150509295509295909350565b60008060008060808587031215611d2e578384fd5b611d3785611acf565b9350611d4560208601611acf565b925060408501359150606085013567ffffffffffffffff811115611d67578182fd5b611d7387828801611b9e565b91505092959194509250565b600080600080600060a08688031215611d96578081fd5b611d9f86611acf565b9450611dad60208701611acf565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dd6578182fd5b611d0c88828901611b9e565b60008060408385031215611df4578182fd5b611dfd83611acf565b915060208301358015158114611e11578182fd5b809150509250929050565b60008060408385031215611e2e578182fd5b611e3783611acf565b9150611c6a60208401611b6e565b600060208284031215611e56578081fd5b6113e982611b6e565b600060208284031215611e70578081fd5b5051919050565b600080600080600060808688031215611e8e578081fd5b85359450611e9e60208701611acf565b9350604086013567ffffffffffffffff80821115611eba578283fd5b818801915088601f830112611ecd578283fd5b813581811115611edb578384fd5b896020828501011115611eec578384fd5b96999598505060200195606001359392505050565b8183823760009101908152919050565b60008251815b81811015611f315760208186018101518583015201611f17565b81811115611f3f5782828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156119485783516001600160a01b031683529284019291840191600101611f66565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611fd257611fd2612038565b604052919050565b60008219821115611fed57611fed612009565b500190565b60008282101561200457612004612009565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220e4a76fc9c7411e572a5b534cffb4a8fa57bc7cc2903d24b0dbd2c10da76f3ddd64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101845760003560e01c80638da5cb5b116100d6578063bc197c811161007f578063f23a6e6111610059578063f23a6e6114610532578063f2fde38b14610577578063f3ae24151461059757600080fd5b8063bc197c8114610470578063e30c3978146104b5578063e68777d7146104d557600080fd5b8063a6e977d0116100b0578063a6e977d01461041d578063a8c1e9c11461043d578063ac18de431461045057600080fd5b80638da5cb5b146103955780638ef369ba146103cd578063907d985b146103ed57600080fd5b8063715018a6116101385780637b977ec4116101125780637b977ec4146103035780637eaf312114610337578063837971e41461036757600080fd5b8063715018a61461029157806371b87298146102a657806372311705146102e157600080fd5b8063150b7a0211610169578063150b7a02146101e75780632d06177a1461025c5780634e71e0c81461027c57600080fd5b806301ffc9a7146101905780630e5fa4cd146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004611e45565b6105b7565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004611e1c565b61069c565b005b3480156101f357600080fd5b5061022b610202366004611d19565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101bc565b34801561026857600080fd5b506101e5610277366004611c27565b610769565b34801561028857600080fd5b506101e56107cf565b34801561029d57600080fd5b506101e56108a5565b3480156102b257600080fd5b506101b06102c1366004611e1c565b600460209081526000928352604080842090915290825290205460ff1681565b3480156102ed57600080fd5b506102f6610961565b6040516101bc9190611f4a565b34801561030f57600080fd5b5061022b7f095ea7b30000000000000000000000000000000000000000000000000000000081565b34801561034357600080fd5b506101b0610352366004611c27565b60036020526000908152604090205460ff1681565b34801561037357600080fd5b50610387610382366004611c41565b610991565b6040519081526020016101bc565b3480156103a157600080fd5b506000546103b5906001600160a01b031681565b6040516001600160a01b0390911681526020016101bc565b3480156103d957600080fd5b506101e56103e8366004611e1c565b610b0f565b3480156103f957600080fd5b506101b0610408366004611c41565b506000546001600160a01b0390811691161490565b34801561042957600080fd5b506101e5610438366004611de2565b610bda565b6101e561044b366004611e77565b610c42565b34801561045c57600080fd5b506101e561046b366004611c27565b61104f565b34801561047c57600080fd5b5061022b61048b366004611c73565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156104c157600080fd5b506001546103b5906001600160a01b031681565b3480156104e157600080fd5b507fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f860005260026020527fcb12253ebf62631b6bd57b44a6063538cd5b38bb493f10fcea7a14477e41e7a854610387565b34801561053e57600080fd5b5061022b61054d366004611d7f565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561058357600080fd5b506101e5610592366004611c27565b61110a565b3480156105a357600080fd5b506101b06105b2366004611c27565b611210565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000148061064a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061069657507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b92915050565b6000546001600160a01b031633146106fb5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0390911660009081526004602090815260408083207fffffffff0000000000000000000000000000000000000000000000000000000090941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000546001600160a01b031633146107c35760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6107cc8161124f565b50565b6001546001600160a01b031633146108295760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03841617909155169055565b6000546001600160a01b031633146108ff5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b606061098c7fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f86112b2565b905090565b600080546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b038216610a18575047610a12815a6001600160a01b0386169190611384565b50610abe565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610a7057600080fd5b505afa158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa89190611e5f565b9050610abe6001600160a01b03831684836113f0565b604080516001600160a01b038086168252841660208201529081018290527fbfd2431e6c719bec0308db4f4ed0afc39712d368867354c711a1ea1e384fa7819060600160405180910390a192915050565b6000546001600160a01b03163314610b695760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0390911660009081526004602090815260408083207fffffffff0000000000000000000000000000000000000000000000000000000090941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000546001600160a01b03163314610c345760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b610c3e8282611401565b5050565b33610c4c81611210565b610c985760405162461bcd60e51b815260206004820152600b60248201527f4e4f545f4d414e4147455200000000000000000000000000000000000000000060448201526064016106f2565b84610cdd600086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b6001600160a01b03821660009081526004602090815260408083207fffffffff000000000000000000000000000000000000000000000000000000008516845290915290205460ff16610d725760405162461bcd60e51b815260206004820152601260248201527f554e415554484f52495a45445f43414c4c45000000000000000000000000000060448201526064016106f2565b85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052507f095ea7b3000000000000000000000000000000000000000000000000000000009350610dd492508491506114a0565b7fffffffff00000000000000000000000000000000000000000000000000000000161415610e76576000610e098260106114c3565b6001600160a01b03811660009081526003602052604090205490915060ff16610e745760405162461bcd60e51b815260206004820152601c60248201527f415050524f56414c5f5350454e4445525f4e4f575f414c4c4f5745440000000060448201526064016106f2565b505b6000886001600160a01b0316868989604051610e93929190611f01565b60006040518083038185875af1925050503d8060008114610ed0576040519150601f19603f3d011682016040523d82523d6000602084013e610ed5565b606091505b505090508015610f93577fae8e3cedf7fc44ab393da64789fd4a4c8d85259cbc55a795a9fb630b893a55378a8a610f4660008c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b604080519384526001600160a01b0390921660208401527fffffffff00000000000000000000000000000000000000000000000000000000169082015260600160405180910390a1611043565b7f7af015e7613a8a9cf091f9a299aec7409798cb347db8e4b33807dc08e01afbcb8a8a610ffa60008c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114a09050565b604080519384526001600160a01b0390921660208401527fffffffff00000000000000000000000000000000000000000000000000000000169082015260600160405180910390a15b50505050505050505050565b6000546001600160a01b031633146110a95760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6110d37fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f8826114f6565b6040516001600160a01b038216907fef69f7d97228658c92417be1b16b19058315de71fecb435d07b7d23728b6bd3190600090a250565b6000546001600160a01b031633146111645760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0381161580159061118a57506000546001600160a01b03828116911614155b6111d65760405162461bcd60e51b815260206004820152600f60248201527f494e56414c49445f41444452455353000000000000000000000000000000000060448201526064016106f2565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6001600160a01b03811660009081527fcb12253ebf62631b6bd57b44a6063538cd5b38bb493f10fcea7a14477e41e7a760205260408120541515610696565b61127b7fae79206ff8d89355a31a27bc7df0c55f5fe15ce3ae94530629cd19b6712ea1f882600161173d565b6040516001600160a01b038216907f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a90600090a250565b6000818152600260208190526040909120805491810154606092146113195760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f4d41494e5441494e454400000000000000000000000000000000000060448201526064016106f2565b6000838152600260209081526040918290208054835181840281018401909452808452909183018282801561137757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611359575b5050505050915050919050565b600061139a6001600160a01b03851684846118e6565b9050806113e95760405162461bcd60e51b815260206004820152601060248201527f5452414e534645525f4641494c5552450000000000000000000000000000000060448201526064016106f2565b9392505050565b6113fc8383835a611954565b505050565b6001600160a01b0382166114575760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b0391909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60006114ad826004611fda565b835110156114ba57600080fd5b50016020015190565b60006114d0826014611fda565b835110156114dd57600080fd5b5001602001516c01000000000000000000000000900490565b60008281526002602090815260408083206001600160a01b038516845260018101909252909120548061156b5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f494e5f5345540000000000000000000000000000000000000000000060448201526064016106f2565b6001600160a01b03831660009081526001808401602052604082208290556002840180549192909161159e908490611ff2565b9091555050815415611737576000826000018360020154815481106115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912001546001600160a01b039081169150841681146116a557808361161a600185611ff2565b81548110611651577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055918316815260018501909152604090208290555b82548390806116dd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b50505050565b60008381526002602090815260408083206001600160a01b03861684526001810190925290912054156117b25760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f494e5f53455400000000000000000000000000000000000060448201526064016106f2565b811561185457600281015481541461180c5760405162461bcd60e51b815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c45440000000000000060448201526064016106f2565b80546001810182556000828152602090200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0385161790556118a3565b8054156118a35760405162461bcd60e51b815260206004820152600d60248201527f4d5553545f4d41494e5441494e0000000000000000000000000000000000000060448201526064016106f2565b60018160020160008282546118b89190611fda565b909155505060028101546001600160a01b039093166000908152600190910160205260409020919091555050565b6000826118f5575060016113e9565b6040516001600160a01b038516908190849086906000818181858888f193505050503d8060008114611943576040519150601f19603f3d011682016040523d82523d6000602084013e611948565b606091505b50909695505050505050565b611960848484846119ac565b6117375760405162461bcd60e51b815260206004820152601060248201527f5452414e534645525f4641494c5552450000000000000000000000000000000060448201526064016106f2565b604080516001600160a01b038581166024830152604480830186905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928391908816908590611a39908590611f11565b60006040518083038160008787f1925050503d8060008114611a77576040519150601f19603f3d011682016040523d82523d6000602084013e611a7c565b606091505b50509050611a8981611a94565b979650505050505050565b60008115611acb573d8015611ab45760208114611abd5760009250611ac9565b60019250611ac9565b60206000803e60005192505b505b5090565b80356001600160a01b0381168114611ae657600080fd5b919050565b600082601f830112611afb578081fd5b8135602067ffffffffffffffff821115611b1757611b17612038565b8160051b611b26828201611f8b565b838152828101908684018388018501891015611b40578687fd5b8693505b85841015611b62578035835260019390930192918401918401611b44565b50979650505050505050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081168114611ae657600080fd5b600082601f830112611bae578081fd5b813567ffffffffffffffff811115611bc857611bc8612038565b611bf960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611f8b565b818152846020838601011115611c0d578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611c38578081fd5b6113e982611acf565b60008060408385031215611c53578081fd5b611c5c83611acf565b9150611c6a60208401611acf565b90509250929050565b600080600080600060a08688031215611c8a578081fd5b611c9386611acf565b9450611ca160208701611acf565b9350604086013567ffffffffffffffff80821115611cbd578283fd5b611cc989838a01611aeb565b94506060880135915080821115611cde578283fd5b611cea89838a01611aeb565b93506080880135915080821115611cff578283fd5b50611d0c88828901611b9e565b9150509295509295909350565b60008060008060808587031215611d2e578384fd5b611d3785611acf565b9350611d4560208601611acf565b925060408501359150606085013567ffffffffffffffff811115611d67578182fd5b611d7387828801611b9e565b91505092959194509250565b600080600080600060a08688031215611d96578081fd5b611d9f86611acf565b9450611dad60208701611acf565b93506040860135925060608601359150608086013567ffffffffffffffff811115611dd6578182fd5b611d0c88828901611b9e565b60008060408385031215611df4578182fd5b611dfd83611acf565b915060208301358015158114611e11578182fd5b809150509250929050565b60008060408385031215611e2e578182fd5b611e3783611acf565b9150611c6a60208401611b6e565b600060208284031215611e56578081fd5b6113e982611b6e565b600060208284031215611e70578081fd5b5051919050565b600080600080600060808688031215611e8e578081fd5b85359450611e9e60208701611acf565b9350604086013567ffffffffffffffff80821115611eba578283fd5b818801915088601f830112611ecd578283fd5b813581811115611edb578384fd5b896020828501011115611eec578384fd5b96999598505060200195606001359392505050565b8183823760009101908152919050565b60008251815b81811015611f315760208186018101518583015201611f17565b81811115611f3f5782828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156119485783516001600160a01b031683529284019291840191600101611f66565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611fd257611fd2612038565b604052919050565b60008219821115611fed57611fed612009565b500190565b60008282101561200457612004612009565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220e4a76fc9c7411e572a5b534cffb4a8fa57bc7cc2903d24b0dbd2c10da76f3ddd64736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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