ETH Price: $3,089.58 (-0.53%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer153214752022-08-11 15:22:441247 days ago1660231364IN
0x00001b0f...07Bddaa6E
0.2 ETH0.0006664931.73770503

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60808060153035742022-08-08 19:59:001250 days ago1659988740  Contract Creation0 ETH
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthereumFeeCollector

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 19066 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import { BaseFeeCollector } from "./base/BaseFeeCollector.sol";

import {
    EthereumFeeCollectorInterface,
    WETHInterface
} from "./interfaces/EthereumFeeCollectorInterface.sol";

/**
 * @title   EthereumFeeCollector
 * @author  OpenSea Protocol Team
 * @notice  EthereumFeeCollector is a contract that is used as an
 *          implementation for a beacon proxy. It inherits the
 *          BaseFeeCollector allowing for native token and ERC20
 *          token withdrawals. In addition, allowing for unwrapping
 *          and transferring WETH.
 */
contract EthereumFeeCollector is
    BaseFeeCollector,
    EthereumFeeCollectorInterface
{
    constructor() BaseFeeCollector() {}

    /**
     * @notice Unwraps and withdraws the given amount of WETH tokens from the
     *         provided contract address. Requires the caller to have the
     *         operator role, and the withdrawal wallet to be in the
     *         allowlisted wallets.
     *
     * @param withdrawalWallet      The wallet to be used for withdrawal.
     * @param wrappedTokenContract  The token address to be unwrapped.
     * @param amount                The amount of tokens to be withdrawn.
     */
    function unwrapAndWithdraw(
        address withdrawalWallet,
        address wrappedTokenContract,
        uint256 amount
    ) external override isOperator {
        // Ensure the withdrawal wallet is in the withdrawal wallet mapping.
        if (_withdrawalWallets[withdrawalWallet] != true) {
            revert InvalidWithdrawalWallet(withdrawalWallet);
        }

        // Make the withdraw call on the provided wrapped token.
        (bool result, bytes memory data) = wrappedTokenContract.call(
            abi.encodeWithSelector(WETHInterface.withdraw.selector, amount)
        );

        // Revert if we have a false result.
        if (!result) {
            revert TokenTransferGenericFailure(
                wrappedTokenContract,
                withdrawalWallet,
                0,
                amount
            );
        }

        // Revert if we have a bad return value.
        if (data.length != 0 && data.length >= 32) {
            if (!abi.decode(data, (bool))) {
                revert BadReturnValueFromERC20OnTransfer(
                    wrappedTokenContract,
                    withdrawalWallet,
                    amount
                );
            }
        }

        // Transfer the now unwrapped tokens to the withdrawal address.
        payable(withdrawalWallet).transfer(amount);
    }

    /**
     * @notice Retrieve the name of this contract.
     *
     * @return The name of this contract.
     */
    function name() external pure override returns (string memory) {
        // Return the name of the contract.
        return "ethereum-fee-collector";
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import { TwoStepOwnable } from "../access/TwoStepOwnable.sol";

import {
    ERC20Interface,
    BaseFeeCollectorInterface
} from "../interfaces/BaseFeeCollectorInterface.sol";

import {
    BaseFeeCollectorEventsAndErrors
} from "../interfaces/BaseFeeCollectorEventsAndErrors.sol";

/**
 * @title   BaseFeeCollector
 * @author  OpenSea Protocol Team
 * @notice  BaseFeeCollector is a contract that is used as an implementation
 *          for a beacon proxy. Allows for withdrawal of the native token
 *          and all ERC20 standard tokens from the proxy. The contract
 *          inherits TwoStepOwnable to allow for ownership modifiers.
 */
contract BaseFeeCollector is
    TwoStepOwnable,
    BaseFeeCollectorInterface,
    BaseFeeCollectorEventsAndErrors
{
    // The operator address.
    address internal _operator;

    // Mapping of valid withdrawal wallets.
    mapping(address => bool) internal _withdrawalWallets;

    /**
     * @dev Throws if called by any account other than the owner or
     *      operator.
     */
    modifier isOperator() {
        if (msg.sender != _operator && msg.sender != owner()) {
            revert InvalidOperator();
        }
        _;
    }

    /**
     * @notice Creates the implementation.
     */
    constructor() {
        // Ensure the origin is an approved deployer.
        require(
            (tx.origin == address(0x939C8d89EBC11fA45e576215E2353673AD0bA18A) ||
                tx.origin ==
                address(0xe80a65eB7a3018DedA407e621Ef5fb5B416678CA) ||
                tx.origin ==
                address(0x86D26897267711ea4b173C8C124a0A73612001da) ||
                tx.origin ==
                address(0x3B52ad533687Ce908bA0485ac177C5fb42972962)),
            "Deployment must originate from an approved deployer."
        );
    }

    /**
     * @notice External initialization called by the proxy to set the
     *         owner. During upgrading, do not modify the original
     *         variables that were set in previous implementations.
     *
     * @param ownerToSet The address to be set as the owner.
     */
    function initialize(address ownerToSet) external {
        // Ensure the origin is an approved deployer.
        require(
            (tx.origin == address(0x939C8d89EBC11fA45e576215E2353673AD0bA18A) ||
                tx.origin ==
                address(0xe80a65eB7a3018DedA407e621Ef5fb5B416678CA) ||
                tx.origin ==
                address(0x86D26897267711ea4b173C8C124a0A73612001da) ||
                tx.origin ==
                address(0x3B52ad533687Ce908bA0485ac177C5fb42972962)) &&
                owner() == address(0),
            "Initialize must originate from an approved deployer, and the owner must not be set."
        );

        // Call initialize.
        _initialize(ownerToSet);
    }

    /**
     * @notice Internal initialization function to set the owner. During
     *         upgrading, do not modify the original variables that were set
     *         in the previous implementations. Requires this call to be inside
     *         the constructor.
     *
     * @param ownerToSet The address to be set as the owner.
     */
    function _initialize(address ownerToSet) internal {
        // Set the owner of the FeeCollector.
        _setInitialOwner(ownerToSet);
    }

    /**
     * @notice Withdrawals the given amount of ERC20 tokens from the provided
     *         contract address. Requires the caller to have the operator role,
     *         and the withdrawal wallet to be in the allowlisted wallets.
     *
     * @param withdrawalWallet The wallet to be used for withdrawal.
     * @param tokenContract    The ERC20 token address to be withdrawn.
     * @param amount           The amount of ERC20 tokens to be withdrawn.
     */
    function withdrawERC20Tokens(
        address withdrawalWallet,
        address tokenContract,
        uint256 amount
    ) external override isOperator {
        // Ensure the withdrawal wallet is in the withdrawal wallet mapping.
        if (_withdrawalWallets[withdrawalWallet] != true) {
            revert InvalidWithdrawalWallet(withdrawalWallet);
        }

        // Make the transfer call on the provided ERC20 token.
        (bool result, bytes memory data) = tokenContract.call(
            abi.encodeWithSelector(
                ERC20Interface.transfer.selector,
                withdrawalWallet,
                amount
            )
        );

        // Revert if we have a false result.
        if (!result) {
            revert TokenTransferGenericFailure(
                tokenContract,
                withdrawalWallet,
                0,
                amount
            );
        }

        // Revert if we have a bad return value.
        if (data.length != 0 && data.length >= 32) {
            if (!abi.decode(data, (bool))) {
                revert BadReturnValueFromERC20OnTransfer(
                    tokenContract,
                    withdrawalWallet,
                    amount
                );
            }
        }
    }

    /**
     * @notice Withdrawals the given amount of the native token from this
     *         contract to the withdrawal address. Requires the caller to
     *         have the operator role, and the withdrawal wallet to be in
     *         the allowlisted wallets.
     *
     * @param withdrawalWallet The wallet to be used for withdrawal.
     * @param amount           The amount of the native token to be withdrawn.
     */
    function withdraw(address withdrawalWallet, uint256 amount)
        external
        override
        isOperator
    {
        // Ensure the withdrawal wallet is in the withdrawal wallet mapping.
        if (_withdrawalWallets[withdrawalWallet] != true) {
            revert InvalidWithdrawalWallet(withdrawalWallet);
        }

        // Ensure the amount to withdraw is valid.
        if (amount > address(this).balance) {
            revert InvalidNativeTokenAmount(amount);
        }

        // Transfer the amount of the native token to the withdrawal address.
        payable(withdrawalWallet).transfer(amount);
    }

    /**
     * @notice Adds a new withdrawal address to the mapping. Requires
     *         the caller to be the owner and the withdrawal
     *         wallet to not be the null address.
     *
     * @param newWithdrawalWallet  The new withdrawal address.
     */
    function addWithdrawAddress(address newWithdrawalWallet)
        external
        override
        onlyOwner
    {
        // Ensure the new owner is not an invalid address.
        if (newWithdrawalWallet == address(0)) {
            revert NewWithdrawalWalletIsNullAddress();
        }

        // Set the new wallet address mapping.
        _setWithdrawalWallet(newWithdrawalWallet, true);
    }

    /**
     * @notice Removes the withdrawal address from the mapping. Requires
     *         the caller to be the owner.
     *
     * @param withdrawalWallet  The withdrawal address to
     *                             remove.
     */
    function removeWithdrawAddress(address withdrawalWallet)
        external
        override
        onlyOwner
    {
        // Set the withdrawal wallet to false.
        _setWithdrawalWallet(withdrawalWallet, false);
    }

    /**
     * @notice Assign the given address with the ability to operate the wallet.
     *         Requires caller to be the owner.
     *
     * @param operatorToAssign The address to assign the operator role.
     */
    function assignOperator(address operatorToAssign)
        external
        override
        onlyOwner
    {
        // Ensure the operator to assign is not an invalid address.
        if (operatorToAssign == address(0)) {
            revert OperatorIsNullAddress();
        }

        // Set the given account as the operator.
        _operator = operatorToAssign;

        // Emit an event indicating the operator has been assigned.
        emit OperatorUpdated(_operator);
    }

    /**
     * @notice An external view function that returns a boolean.
     *
     * @return A boolean that determines if the provided address is
     *         a valid withdrawal wallet.
     */
    function isWithdrawalWallet(address withdrawalWallet)
        external
        view
        override
        returns (bool)
    {
        // Return if the wallet is in the allow list.
        return _withdrawalWallets[withdrawalWallet];
    }

    /**
     * @notice Internal function to set the withdrawal wallet mapping.
     *
     * @param withdrawalAddress The address to be set as the withdrawal
     *                          wallet.
     * @param valueToSet        The boolean to set for the mapping.
     */
    function _setWithdrawalWallet(address withdrawalAddress, bool valueToSet)
        internal
    {
        // Set the withdrawal address mapping.
        _withdrawalWallets[withdrawalAddress] = valueToSet;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

interface WETHInterface {
    function withdraw(uint256 wad) external;
}

/**
 * @title   EthereumFeeCollectorInterface
 * @author  OpenSea Protocol Team
 * @notice  EthereumFeeCollectorInterface contains all external function
 *          interfaces for the fee collector implementation.
 */
interface EthereumFeeCollectorInterface {
    /**
     * @notice Unwraps and withdraws the given amount of WETH tokens from the
     *         provided contract address. Requires the caller to have the
     *         operator role, and the withdrawal wallet to be in the
     *         allowlisted wallets.
     *
     * @param withdrawalWallet The wallet to be used for withdrawal.
     * @param tokenContract    The WETH token address to be unwrapped.
     * @param amount           The amount of tokens to be withdrawn.
     */
    function unwrapAndWithdraw(
        address withdrawalWallet,
        address tokenContract,
        uint256 amount
    ) external;

    /**
     * @notice Retrieve the name of this contract.
     *
     * @return The name of this contract.
     */
    function name() external pure returns (string memory);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "../interfaces/TwoStepOwnableInterface.sol";

/**
 * @title   TwoStepOwnable
 * @author  OpenSea Protocol Team
 * @notice  TwoStepOwnable is a module which provides access control
 *          where the ownership of a contract can be exchanged via a
 *          two step process. A potential owner is set by the current
 *          owner using transferOwnership, then accepted by the new
 *          potential owner using acceptOwnership.
 */
contract TwoStepOwnable is TwoStepOwnableInterface {
    // The address of the owner.
    address private _owner;

    // The address of the new potential owner.
    address private _potentialOwner;

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        // Ensure the caller is the owner.
        if (msg.sender != _owner) {
            revert CallerIsNotOwner();
        }
        // Continue with function execution.
        _;
    }

    /**
     * @notice Initiate ownership transfer by assigning a new potential owner
     *         to this contract. Once set, the new potential owner may call
     *         `acceptOwnership` to claim ownership. Only the owner may call
     *         this function.
     *
     * @param newPotentialOwner The address for which to initiate ownership
     *                          transfer to.
     */
    function transferOwnership(address newPotentialOwner)
        external
        override
        onlyOwner
    {
        // Ensure the new potential owner is not an invalid address.
        if (newPotentialOwner == address(0)) {
            revert NewPotentialOwnerIsNullAddress();
        }

        // Emit an event indicating that the potential owner has been updated.
        emit PotentialOwnerUpdated(newPotentialOwner);

        // Set the new potential owner as the potential owner.
        _potentialOwner = newPotentialOwner;
    }

    /**
     * @notice Clear the currently set potential owner, if any.
     *         Only the owner of this contract may call this function.
     */
    function cancelOwnershipTransfer() external override onlyOwner {
        // Emit an event indicating that the potential owner has been cleared.
        emit PotentialOwnerUpdated(address(0));

        // Clear the current new potential owner.
        delete _potentialOwner;
    }

    /**
     * @notice Accept ownership of this contract. Only the account that the
     *         current owner has set as the new potential owner may call this
     *         function.
     */
    function acceptOwnership() external override {
        // Ensure the caller is the potential owner.
        if (msg.sender != _potentialOwner) {
            // Revert, indicating that caller is not current potential owner.
            revert CallerIsNotNewPotentialOwner();
        }

        // Emit an event indicating that the potential owner has been cleared.
        emit PotentialOwnerUpdated(address(0));

        // Clear the current new potential owner.
        delete _potentialOwner;

        // Emit an event indicating ownership has been transferred.
        emit OwnershipTransferred(_owner, msg.sender);

        // Set the caller as the owner of this contract.
        _owner = msg.sender;
    }

    /**
     * @notice An external view function that returns the potential owner.
     *
     * @return The address of the potential owner.
     */
    function potentialOwner() external view override returns (address) {
        return _potentialOwner;
    }

    /**
     * @notice A public view function that returns the owner.
     *
     * @return The address of the owner.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     * @notice Internal function that sets the inital owner of the
     *         base contract. The initial owner must not be set
     *         previously.
     *
     * @param initialOwner The address to set for initial ownership.
     */
    function _setInitialOwner(address initialOwner) internal {
        // Ensure the initial owner is not an invalid address.
        if (initialOwner == address(0)) {
            revert InitialOwnerIsNullAddress();
        }

        // Ensure the owner has not already been set.
        if (_owner != address(0)) {
            revert OwnerAlreadySet(_owner);
        }

        // Emit an event indicating ownership has been set.
        emit OwnershipTransferred(address(0), initialOwner);

        // Set the initial owner.
        _owner = initialOwner;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

interface ERC20Interface {
    function transfer(address _to, uint256 _amount) external returns (bool);
}

/**
 * @title   BaseFeeCollectorInterface
 * @author  OpenSea Protocol Team
 * @notice  BaseFeeCollectorInterface contains all external function interfaces
 *          for the fee collector implementation.
 */
interface BaseFeeCollectorInterface {
    /**
     * @notice Withdrawals the given amount of ERC20 tokens from the provided
     *         contract address
     *
     * @param withdrawalWallet The wallet to be used for withdrawal.
     * @param tokenContract    The ERC20 token address to be withdrawn.
     * @param amount           The amount of ERC20 tokens to be withdrawn.
     */
    function withdrawERC20Tokens(
        address withdrawalWallet,
        address tokenContract,
        uint256 amount
    ) external;

    /**
     * @notice Withdrawals the given amount of the native token from this
     *         contract to the withdrawal address. Requires the caller to
     *         have the operator role, and the withdrawal wallet to be in
     *         the allowlisted wallets.
     *
     * @param withdrawalWallet The wallet to be used for withdrawal.
     * @param amount           The amount of the native token to be withdrawn.
     */
    function withdraw(address withdrawalWallet, uint256 amount) external;

    /**
     * @notice Adds a new withdrawal address to the mapping. Requires
     *         the caller to be the owner and the withdrawal
     *         wallet to not be the null address.
     *
     * @param newWithdrawalWallet  The new withdrawal address.
     */
    function addWithdrawAddress(address newWithdrawalWallet) external;

    /**
     * @notice Removes the withdrawal address from the mapping. Requires
     *         the caller to be the owner.
     *
     * @param withdrawalWallet  The withdrawal address to
     *                             remove.
     */
    function removeWithdrawAddress(address withdrawalWallet) external;

    /**
     * @notice Assign the given address with the ability to operate the wallet.
     *
     * @param operatorToAssign The address to assign the operator role.
     */
    function assignOperator(address operatorToAssign) external;

    /**
     * @notice An external view function that returns a boolean.
     *
     * @return A boolean that determines if the provided address is
     *         a valid withdrawal wallet.
     */
    function isWithdrawalWallet(address withdrawalWallet)
        external
        view
        returns (bool);
}

File 6 of 7 : BaseFeeCollectorEventsAndErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
 * @notice BaseFeeCollectorEventsAndErrors contains errors and events
 *         related to fee collector interaction.
 */
interface BaseFeeCollectorEventsAndErrors {
    /**
     * @dev Emit an event whenever the contract owner registers a
     *      new operator.
     *
     * @param newOperator The new operator of the contract.
     */
    event OperatorUpdated(address newOperator);

    /**
     * @dev Revert with an error when an ERC20 token transfer returns a falsey
     *      value.
     *
     * @param token      The token for which the ERC20 transfer was attempted.
     * @param to         The recipient of the attempted ERC20 transfer.
     * @param amount     The amount for the attempted ERC20 transfer.
     */
    error BadReturnValueFromERC20OnTransfer(
        address token,
        address to,
        uint256 amount
    );

    /**
     * @dev Revert with an error when attempting to withdrawal
     *      an amount greater than the current balance.
     */
    error InvalidNativeTokenAmount(uint256 amount);

    /**
     * @dev Revert with an error when attempting to initialize
     *      outside the constructor.
     */
    error InvalidInitialization();

    /**
     * @dev Revert with an error when attempting to call an operation
     *      while the caller is not the owner of the wallet.
     */
    error InvalidOperator();

    /**
     * @dev Revert with an error when attempting to call a withdrawal
     *      operation with an incorrect withdrawal wallet.
     */
    error InvalidWithdrawalWallet(address withdrawalWallet);

    /**
     * @dev Revert with an error when attempting to set a
     *      new withdrawal wallet and supplying the null address.
     */
    error NewWithdrawalWalletIsNullAddress();

    /**
     * @dev Revert with an error when attempting to set the
     *      new operator and supplying the null address.
     */
    error OperatorIsNullAddress();

    /**
     * @dev Revert with an error when an ERC20, ERC721, or ERC1155 token
     *      transfer reverts.
     *
     * @param token      The token for which the transfer was attempted.
     * @param to         The recipient of the attempted transfer.
     * @param identifier The identifier for the attempted transfer.
     * @param amount     The amount for the attempted transfer.
     */
    error TokenTransferGenericFailure(
        address token,
        address to,
        uint256 identifier,
        uint256 amount
    );
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
 * @title   TwoStepOwnableInterface
 * @author  OpenSea Protocol Team
 * @notice  TwoStepOwnableInterface contains all external function interfaces,
 *          events and errors for the two step ownable access control module.
 */
interface TwoStepOwnableInterface {
    /**
     * @dev Emit an event whenever the contract owner registers a
     *      new potential owner.
     *
     * @param newPotentialOwner The new potential owner of the contract.
     */
    event PotentialOwnerUpdated(address newPotentialOwner);

    /**
     * @dev Emit an event whenever contract ownership is transferred.
     *
     * @param previousOwner The previous owner of the contract.
     * @param newOwner      The new owner of the contract.
     */
    event OwnershipTransferred(address previousOwner, address newOwner);

    /**
     * @dev Revert with an error when attempting to set an owner
     *      that is already set.
     */
    error OwnerAlreadySet(address currentOwner);

    /**
     * @dev Revert with an error when attempting to set the initial
     *      owner and supplying the null address.
     */
    error InitialOwnerIsNullAddress();

    /**
     * @dev Revert with an error when attempting to call an operation
     *      while the caller is not the owner.
     */
    error CallerIsNotOwner();

    /**
     * @dev Revert with an error when attempting to register a new potential
     *      owner and supplying the null address.
     */
    error NewPotentialOwnerIsNullAddress();

    /**
     * @dev Revert with an error when attempting to claim ownership of the
     *      contract with a caller that is not the current potential owner.
     */
    error CallerIsNotNewPotentialOwner();

    /**
     * @notice Initiate ownership transfer by assigning a new potential owner
     *         to this contract. Once set, the new potential owner may call
     *         `acceptOwnership` to claim ownership. Only the owner may call
     *         this function.
     *
     * @param newPotentialOwner The address for which to initiate ownership
     *                          transfer to.
     */
    function transferOwnership(address newPotentialOwner) external;

    /**
     * @notice Clear the currently set potential owner, if any.
     *         Only the owner of this contract may call this function.
     */
    function cancelOwnershipTransfer() external;

    /**
     * @notice Accept ownership of this contract. Only the account that the
     *         current owner has set as the new potential owner may call this
     *         function.
     */
    function acceptOwnership() external;

    /**
     * @notice An external view function that returns the potential owner.
     *
     * @return The address of the potential owner.
     */
    function potentialOwner() external view returns (address);

    /**
     * @notice An external view function that returns the owner.
     *
     * @return The address of the owner.
     */
    function owner() external view returns (address);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BadReturnValueFromERC20OnTransfer","type":"error"},{"inputs":[],"name":"CallerIsNotNewPotentialOwner","type":"error"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"InitialOwnerIsNullAddress","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvalidNativeTokenAmount","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"}],"name":"InvalidWithdrawalWallet","type":"error"},{"inputs":[],"name":"NewPotentialOwnerIsNullAddress","type":"error"},{"inputs":[],"name":"NewWithdrawalWalletIsNullAddress","type":"error"},{"inputs":[],"name":"OperatorIsNullAddress","type":"error"},{"inputs":[{"internalType":"address","name":"currentOwner","type":"address"}],"name":"OwnerAlreadySet","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenTransferGenericFailure","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"PotentialOwnerUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWithdrawalWallet","type":"address"}],"name":"addWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operatorToAssign","type":"address"}],"name":"assignOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerToSet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"}],"name":"isWithdrawalWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"}],"name":"removeWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"},{"internalType":"address","name":"wrappedTokenContract","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unwrapAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawalWallet","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608080604052346101095773939c8d89ebc11fa45e576215e2353673ad0ba18a321480156100ec575b80156100cf575b80156100b2575b1561004a576040516110e6908161010f8239f35b62461bcd60e51b815260206004820152603460248201527f4465706c6f796d656e74206d757374206f726967696e6174652066726f6d206160448201527f6e20617070726f766564206465706c6f7965722e0000000000000000000000006064820152608490fd5b50733b52ad533687ce908ba0485ac177c5fb429729623214610036565b507386d26897267711ea4b173c8c124a0a73612001da321461002f565b5073e80a65eb7a3018deda407e621ef5fb5b416678ca3214610028565b600080fdfe60806040526004361015610013575b600080fd5b60003560e01c80630502e2221461012b57806306fdde031461012257806323452b9c14610119578063689e7835146101105780637762df251461010757806379ba5097146100fe57806384385c6f146100f55780638da5cb5b146100ec578063936bf30b146100e3578063bcdd1e13146100da578063c4d66de8146100d1578063e7850948146100c8578063f2fde38b146100bf5763f3fef3a3146100b757600080fd5b61000e610db7565b5061000e610cf1565b5061000e610c4c565b5061000e610ad1565b5061000e6108ac565b5061000e61085f565b5061000e61082a565b5061000e610767565b5061000e610657565b5061000e610622565b5061000e610382565b5061000e6102b5565b5061000e6101f3565b5061000e610157565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e57602060031936011261000e57610171610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c95716600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055005b60046040517f6db2465f000000000000000000000000000000000000000000000000000000008152fd5b503461000e57600060031936011261000e57604080519061021382610ed6565b6016825260207f657468657265756d2d6665652d636f6c6c6563746f720000000000000000000081840152815192818492835281519182828501526000915b83831061029d575050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092601f9211610290575b01168101030190f35b6000858286010152610287565b81830181015187840187015286945091820191610252565b503461000e5760008060031936011261033d5773ffffffffffffffffffffffffffffffffffffffff81541633036101c9577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a17fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155604051f35b80fd5b600319606091011261000e5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361000e5791602435908116810361000e579060443590565b503461000e5761039136610340565b9173ffffffffffffffffffffffffffffffffffffffff806002541633141580610614575b6105ea5760016103ef6103e88473ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b5460ff1690565b1515036105a3576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000006020820190815260248201869052939061045f81604481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610eff565b600080958192519082855af1610473610f40565b90156105465780518015158061053b575b6104c0575b50505082809481938293839183156104b6575b1690f1156104a957604051f35b6104b1610fc4565b604051f35b6108fc925061049c565b816020806104d5936104d99501019101610fac565b1590565b6104e4578080610489565b6040517fdca74beb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152921660248301525060448101839052606490fd5b506020811015610484565b6040517f2bc85fda00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152851660248201526000604482015260648101879052608490fd5b6040517f0bee607200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602490fd5b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b5080600054163314156103b5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e5760008060031936011261033d5760015473ffffffffffffffffffffffffffffffffffffffff90818116330361073d577f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0917fffffffffffffffffffffffff00000000000000000000000000000000000000006040927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da60208551888152a1166001558354168151908152336020820152a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604051f35b60046040517f356e0057000000000000000000000000000000000000000000000000000000008152fd5b503461000e57602060031936011261000e57610781610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610800576020817fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4927fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255604051908152a1005b60046040517f6d5b0ca5000000000000000000000000000000000000000000000000000000008152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57602060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff61088e610134565b166000526003602052602060ff604060002054166040519015158152f35b503461000e576108bb36610340565b73ffffffffffffffffffffffffffffffffffffffff80600254163314159081610ac2575b506105ea5760016109136103e88573ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b151503610a7b576040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff851660248301526044820183905260009182919061097b8160648101610433565b519082865af1610989610f40565b9015610a1d57805180151580610a12575b6109a1575b005b816020806104d5936109b69501019101610fac565b6109bc57005b6040517fdca74beb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529290911660248301526044820152606490fd5b50602081101561099a565b506040517f2bc85fda00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152929091166024830152600060448301526064820152608490fd5b6040517f0bee607200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602490fd5b905060005416331415386108df565b503461000e57602060031936011261000e57610aeb610134565b73939c8d89ebc11fa45e576215e2353673ad0ba18a32148015610c2f575b8015610c12575b8015610bf5575b80610bd5575b15610b2b5761099f90610fd1565b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f496e697469616c697a65206d757374206f726967696e6174652066726f6d206160448201527f6e20617070726f766564206465706c6f7965722c20616e6420746865206f776e60648201527f6572206d757374206e6f74206265207365742e000000000000000000000000006084820152fd5b5073ffffffffffffffffffffffffffffffffffffffff6000541615610b1d565b50733b52ad533687ce908ba0485ac177c5fb429729623214610b17565b507386d26897267711ea4b173c8c124a0a73612001da3214610b10565b5073e80a65eb7a3018deda407e621ef5fb5b416678ca3214610b09565b503461000e57602060031936011261000e57610c66610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610cc757600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b60046040517f0d78f1df000000000000000000000000000000000000000000000000000000008152fd5b503461000e57602060031936011261000e57610d0b610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610d8d577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a17fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001556000604051f35b60046040517f7621b061000000000000000000000000000000000000000000000000000000008152fd5b503461000e57604060031936011261000e57610dd1610134565b6024359073ffffffffffffffffffffffffffffffffffffffff806002541633141580610e98575b6105ea576001610e2b6103e88473ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b1515036105a357478311610e6657600080938193829383918315610e5c575b1690f115610e5457005b61099f610fc4565b6108fc9250610e4a565b6040517f4bac467800000000000000000000000000000000000000000000000000000000815260048101849052602490fd5b508060005416331415610df8565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610ef257604052565b610efa610ea6565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ef257604052565b3d15610fa7573d9067ffffffffffffffff8211610f9a575b60405191610f8e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610eff565b82523d6000602084013e565b610fa2610ea6565b610f58565b606090565b9081602091031261000e5751801515810361000e5790565b506040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff809116908115611086576000549081168061105557507fffffffffffffffffffffffff0000000000000000000000000000000000000000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06040805160008152856020820152a11617600055565b602490604051907f62c926120000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3bb4b2ba000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220db6979fe7dfff016cf22dca32e0e75c8fadd5de0ef39e0d99006006924e8ced264736f6c634300080e0033

Deployed Bytecode

0x60806040526004361015610013575b600080fd5b60003560e01c80630502e2221461012b57806306fdde031461012257806323452b9c14610119578063689e7835146101105780637762df251461010757806379ba5097146100fe57806384385c6f146100f55780638da5cb5b146100ec578063936bf30b146100e3578063bcdd1e13146100da578063c4d66de8146100d1578063e7850948146100c8578063f2fde38b146100bf5763f3fef3a3146100b757600080fd5b61000e610db7565b5061000e610cf1565b5061000e610c4c565b5061000e610ad1565b5061000e6108ac565b5061000e61085f565b5061000e61082a565b5061000e610767565b5061000e610657565b5061000e610622565b5061000e610382565b5061000e6102b5565b5061000e6101f3565b5061000e610157565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e57602060031936011261000e57610171610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c95716600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055005b60046040517f6db2465f000000000000000000000000000000000000000000000000000000008152fd5b503461000e57600060031936011261000e57604080519061021382610ed6565b6016825260207f657468657265756d2d6665652d636f6c6c6563746f720000000000000000000081840152815192818492835281519182828501526000915b83831061029d575050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092601f9211610290575b01168101030190f35b6000858286010152610287565b81830181015187840187015286945091820191610252565b503461000e5760008060031936011261033d5773ffffffffffffffffffffffffffffffffffffffff81541633036101c9577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a17fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155604051f35b80fd5b600319606091011261000e5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361000e5791602435908116810361000e579060443590565b503461000e5761039136610340565b9173ffffffffffffffffffffffffffffffffffffffff806002541633141580610614575b6105ea5760016103ef6103e88473ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b5460ff1690565b1515036105a3576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000006020820190815260248201869052939061045f81604481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610eff565b600080958192519082855af1610473610f40565b90156105465780518015158061053b575b6104c0575b50505082809481938293839183156104b6575b1690f1156104a957604051f35b6104b1610fc4565b604051f35b6108fc925061049c565b816020806104d5936104d99501019101610fac565b1590565b6104e4578080610489565b6040517fdca74beb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152921660248301525060448101839052606490fd5b506020811015610484565b6040517f2bc85fda00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152851660248201526000604482015260648101879052608490fd5b6040517f0bee607200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602490fd5b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b5080600054163314156103b5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e5760008060031936011261033d5760015473ffffffffffffffffffffffffffffffffffffffff90818116330361073d577f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0917fffffffffffffffffffffffff00000000000000000000000000000000000000006040927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da60208551888152a1166001558354168151908152336020820152a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055604051f35b60046040517f356e0057000000000000000000000000000000000000000000000000000000008152fd5b503461000e57602060031936011261000e57610781610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610800576020817fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec4927fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255604051908152a1005b60046040517f6d5b0ca5000000000000000000000000000000000000000000000000000000008152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57602060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff61088e610134565b166000526003602052602060ff604060002054166040519015158152f35b503461000e576108bb36610340565b73ffffffffffffffffffffffffffffffffffffffff80600254163314159081610ac2575b506105ea5760016109136103e88573ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b151503610a7b576040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff851660248301526044820183905260009182919061097b8160648101610433565b519082865af1610989610f40565b9015610a1d57805180151580610a12575b6109a1575b005b816020806104d5936109b69501019101610fac565b6109bc57005b6040517fdca74beb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529290911660248301526044820152606490fd5b50602081101561099a565b506040517f2bc85fda00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152929091166024830152600060448301526064820152608490fd5b6040517f0bee607200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602490fd5b905060005416331415386108df565b503461000e57602060031936011261000e57610aeb610134565b73939c8d89ebc11fa45e576215e2353673ad0ba18a32148015610c2f575b8015610c12575b8015610bf5575b80610bd5575b15610b2b5761099f90610fd1565b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f496e697469616c697a65206d757374206f726967696e6174652066726f6d206160448201527f6e20617070726f766564206465706c6f7965722c20616e6420746865206f776e60648201527f6572206d757374206e6f74206265207365742e000000000000000000000000006084820152fd5b5073ffffffffffffffffffffffffffffffffffffffff6000541615610b1d565b50733b52ad533687ce908ba0485ac177c5fb429729623214610b17565b507386d26897267711ea4b173c8c124a0a73612001da3214610b10565b5073e80a65eb7a3018deda407e621ef5fb5b416678ca3214610b09565b503461000e57602060031936011261000e57610c66610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610cc757600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b60046040517f0d78f1df000000000000000000000000000000000000000000000000000000008152fd5b503461000e57602060031936011261000e57610d0b610134565b73ffffffffffffffffffffffffffffffffffffffff90816000541633036101c957168015610d8d577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a17fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001556000604051f35b60046040517f7621b061000000000000000000000000000000000000000000000000000000008152fd5b503461000e57604060031936011261000e57610dd1610134565b6024359073ffffffffffffffffffffffffffffffffffffffff806002541633141580610e98575b6105ea576001610e2b6103e88473ffffffffffffffffffffffffffffffffffffffff166000526003602052604060002090565b1515036105a357478311610e6657600080938193829383918315610e5c575b1690f115610e5457005b61099f610fc4565b6108fc9250610e4a565b6040517f4bac467800000000000000000000000000000000000000000000000000000000815260048101849052602490fd5b508060005416331415610df8565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610ef257604052565b610efa610ea6565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ef257604052565b3d15610fa7573d9067ffffffffffffffff8211610f9a575b60405191610f8e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610eff565b82523d6000602084013e565b610fa2610ea6565b610f58565b606090565b9081602091031261000e5751801515810361000e5790565b506040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff809116908115611086576000549081168061105557507fffffffffffffffffffffffff0000000000000000000000000000000000000000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06040805160008152856020820152a11617600055565b602490604051907f62c926120000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3bb4b2ba000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220db6979fe7dfff016cf22dca32e0e75c8fadd5de0ef39e0d99006006924e8ced264736f6c634300080e0033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.