APE Price: $0.65 (-9.11%)

Contract

0x0000000000d132a69d773c838080dc4Fa478388F

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
75197512025-01-03 21:55:4133 days ago1735941341  Contract Creation0 APE

Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x00000000...dC7E06D0E
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ConduitCaptain

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2025-01-24
*/

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

/**
 * @title ConduitCaptainInterface
 * @author 0age
 * @notice ConduitCaptainInterface contains function endpoints, events, and error
 *         declarations for the ConduitCaptain contract.
 */
interface ConduitCaptainInterface {
    /**
     * @dev Emit an event whenever a revoker role is updated by the owner.
     *
     * @param revoker The address of the new revoker role.
     */
    event RevokerUpdated(address revoker);

    /**
     * @dev Revert with an error when attempting to set a conduit controller
     *      that does not contain contract code.
     */
    error InvalidConduitController(address conduitController);

    /**
     * @dev Revert with an error when attempting to call closeChannel from an
     *      account that does not currently hold the revoker role.
     */
    error InvalidRevoker();

    /**
     * @dev Revert with an error when attempting to register a revoker and
     *      supplying the null address.
     */
    error RevokerIsNullAddress();

    /**
     * @notice Initiate conduit ownership transfer by assigning a new potential
     *         owner for the given conduit. Only callable by the owner.
     *
     * @param conduit           The conduit for which to initiate ownership
     *                          transfer.
     * @param newPotentialOwner The new potential owner to set.
     */
    function transferConduitOwnership(
        address conduit,
        address newPotentialOwner
    ) external;

    /**
     * @notice Clear the currently set potential owner, if any, from a conduit.
     *         Only callable by the owner.
     *
     * @param conduit The conduit for which to cancel ownership transfer.
     */
    function cancelConduitOwnershipTransfer(address conduit) external;

    /**
     * @notice Accept ownership of a given conduit once this contract has been
     *         set as the current potential owner. Only callable by the owner.
     *
     * @param conduit The conduit for which to accept ownership transfer.
     */
    function acceptConduitOwnership(address conduit) external;

    /**
     * @notice Open or close a channel on a given conduit, thereby allowing the
     *         specified account to execute transfers against that conduit.
     *         Extreme care must be taken when updating channels, as malicious
     *         or vulnerable channels can transfer any ERC20, ERC721 and ERC1155
     *         tokens where the token holder has granted the conduit approval.
     *         Only the owner may call this function.
     *
     * @param conduit The conduit for which to open or close the channel.
     * @param channel The channel to open or close on the conduit.
     * @param isOpen  A boolean indicating whether to open or close the channel.
     */
    function updateChannel(
        address conduit,
        address channel,
        bool isOpen
    ) external;

    /**
     * @notice Close a channel on a given conduit, thereby preventing the
     *         specified account from executing transfers against that conduit.
     *         Only the designated revoker may call this function.
     *
     * @param conduit The conduit for which to close the channel.
     * @param channel The channel to close on the conduit.
     */
    function closeChannel(address conduit, address channel) external;

    /**
     * @notice Set a revoker role that can close channels. Only the owner may
     *         call this function.
     *
     * @param revoker The account to set as the revoker.
     */
    function updateRevoker(address revoker) external;

    /**
     * @notice External view function to retrieve the address of the revoker
     *         role that can close channels.
     *
     * @return revoker The account set as the revoker.
     */
    function getRevoker() external view returns (address revoker);

    /**
     * @notice External view function to retrieve the address of the
     *         ConduitController referenced by the contract
     *
     * @return conduitController The address of the ConduitController.
     */
    function getConduitController()
        external
        view
        returns (address conduitController);
}


/**
 * @title ConduitControllerInterface
 * @author 0age
 * @notice ConduitControllerInterface contains relevant external function
 *         interfaces for a conduit controller contract.
 */
interface ConduitControllerInterface {
    /**
     * @notice Initiate conduit ownership transfer by assigning a new potential
     *         owner for the given conduit. Once set, the new potential owner
     *         may call `acceptOwnership` to claim ownership of the conduit.
     *         Only the owner of the conduit in question may call this function.
     *
     * @param conduit The conduit for which to initiate ownership transfer.
     */
    function transferOwnership(address conduit, address newPotentialOwner)
        external;

    /**
     * @notice Clear the currently set potential owner, if any, from a conduit.
     *         Only the owner of the conduit in question may call this function.
     *
     * @param conduit The conduit for which to cancel ownership transfer.
     */
    function cancelOwnershipTransfer(address conduit) external;

    /**
     * @notice Accept ownership of a supplied conduit. Only accounts that the
     *         current owner has set as the new potential owner may call this
     *         function.
     *
     * @param conduit The conduit for which to accept ownership.
     */
    function acceptOwnership(address conduit) external;

    /**
     * @notice Open or close a channel on a given conduit, thereby allowing the
     *         specified account to execute transfers against that conduit.
     *         Extreme care must be taken when updating channels, as malicious
     *         or vulnerable channels can transfer any ERC20, ERC721 and ERC1155
     *         tokens where the token holder has granted the conduit approval.
     *         Only the owner of the conduit in question may call this function.
     *
     * @param conduit The conduit for which to open or close the channel.
     * @param channel The channel to open or close on the conduit.
     * @param isOpen  A boolean indicating whether to open or close the channel.
     */
    function updateChannel(
        address conduit,
        address channel,
        bool isOpen
    ) external;
}


/**
 * @title   TwoStepOwnableInterface
 * @author  OpenSea Protocol
 * @notice  TwoStepOwnableInterface contains all external function interfaces,
 *          events and errors for the TwoStepOwnable contract.
 */
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 initial owner when
     *      one has already been set.
     */
    error OwnerAlreadySet(address currentOwner);

    /**
     * @dev Revert with an error when attempting to call a function with the
     *      onlyOwner modifier from an account other than that of the owner.
     */
    error CallerIsNotOwner();

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

    /**
     * @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);
}


/**
 * @title   TwoStepOwnable
 * @author  OpenSea Protocol Team
 * @notice  TwoStepOwnable provides access control for inheriting contracts,
 *          where the ownership of the contract can be exchanged via a two step
 *          process. A potential owner is set by the current owner by calling
 *          `transferOwnership`, then accepted by the new potential owner by
 *          calling `acceptOwnership`.
 */
abstract 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 that 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;

        // Set the caller as the owner of this contract.
        _setOwner(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 already be set.
     *         To be called in the constructor or when initializing a proxy.
     *
     * @param initialOwner The address to set for initial ownership.
     */
    function _setInitialOwner(address initialOwner) internal {
        // Ensure that an initial owner has been supplied.
        if (initialOwner == address(0)) {
            revert InitialOwnerIsNullAddress();
        }

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

        // Set the initial owner.
        _setOwner(initialOwner);
    }

    /**
     * @notice Private function that sets a new owner and emits a corresponding
     *         event.
     *
     * @param newOwner The address to assign as the new owner.
     */
    function _setOwner(address newOwner) private {
        // Emit an event indicating that the new owner has been set.
        emit OwnershipTransferred(_owner, newOwner);

        // Set the new owner.
        _owner = newOwner;
    }
}


/**
 * @title ConduitCaptain
 * @author 0age
 * @notice ConduitCaptain is an owned contract where the owner can in turn update
 *         conduits that are owned by the contract. It allows for designating an
 *         account that may revoke channels from conduits.
 */
contract ConduitCaptain is TwoStepOwnable, ConduitCaptainInterface {
    // Set the conduit controller as an immutable argument.
    ConduitControllerInterface private immutable _CONDUIT_CONTROLLER;

    // Designate a storage variable for the revoker role.
    address private _revoker;

    /**
     * @dev Initialize contract by setting the conduit controller, the initial
     *      owner, and the initial revoker role.
     */
    constructor(
        address conduitController,
        address initialOwner,
        address initialRevoker
    ) {
        // Ensure that a contract is deployed to the given conduit controller.
        if (conduitController.code.length == 0) {
            revert InvalidConduitController(conduitController);
        }

        // Set the conduit controller as an immutable argument.
        _CONDUIT_CONTROLLER = ConduitControllerInterface(conduitController);

        // Set the initial owner.
        _setInitialOwner(initialOwner);

        // Set the initial revoker.
        _setRevoker(initialRevoker);
    }

    /**
     * @notice Initiate conduit ownership transfer by assigning a new potential
     *         owner for the given conduit. Only callable by the owner.
     *
     * @param conduit           The conduit for which to initiate ownership
     *                          transfer.
     * @param newPotentialOwner The new potential owner to set.
     */
    function transferConduitOwnership(
        address conduit,
        address newPotentialOwner
    ) external override onlyOwner {
        // Call the conduit controller to transfer conduit ownership.
        _CONDUIT_CONTROLLER.transferOwnership(conduit, newPotentialOwner);
    }

    /**
     * @notice Clear the currently set potential owner, if any, from a conduit.
     *         Only callable by the owner.
     *
     * @param conduit The conduit for which to cancel ownership transfer.
     */
    function cancelConduitOwnershipTransfer(address conduit)
        external
        override
        onlyOwner
    {
        // Call the conduit controller to cancel conduit ownership transfer.
        _CONDUIT_CONTROLLER.cancelOwnershipTransfer(conduit);
    }

    /**
     * @notice Accept ownership of a given conduit once this contract has been
     *         set as the current potential owner. Only callable by the owner.
     *
     * @param conduit The conduit for which to accept ownership transfer.
     */
    function acceptConduitOwnership(address conduit)
        external
        override
        onlyOwner
    {
        // Call the conduit controller to accept conduit ownership.
        _CONDUIT_CONTROLLER.acceptOwnership(conduit);
    }

    /**
     * @notice Open or close a channel on a given conduit, thereby allowing the
     *         specified account to execute transfers against that conduit.
     *         Extreme care must be taken when updating channels, as malicious
     *         or vulnerable channels can transfer any ERC20, ERC721 and ERC1155
     *         tokens where the token holder has granted the conduit approval.
     *         Only the owner may call this function.
     *
     * @param conduit The conduit for which to open or close the channel.
     * @param channel The channel to open or close on the conduit.
     * @param isOpen  A boolean indicating whether to open or close the channel.
     */
    function updateChannel(
        address conduit,
        address channel,
        bool isOpen
    ) external override onlyOwner {
        // Call the conduit controller to update channel status on the conduit.
        _CONDUIT_CONTROLLER.updateChannel(conduit, channel, isOpen);
    }

    /**
     * @notice Close a channel on a given conduit, thereby preventing the
     *         specified account from executing transfers against that conduit.
     *         Only the designated revoker may call this function.
     *
     * @param conduit The conduit for which to close the channel.
     * @param channel The channel to close on the conduit.
     */
    function closeChannel(address conduit, address channel) external override {
        // Revert if the caller is not the revoker.
        if (msg.sender != _revoker) {
            revert InvalidRevoker();
        }

        // Call the conduit controller to close the channel on the conduit.
        _CONDUIT_CONTROLLER.updateChannel(conduit, channel, false);
    }

    /**
     * @notice Set a revoker role that can close channels. Only the owner may
     *         call this function.
     *
     * @param revoker The account to set as the revoker.
     */
    function updateRevoker(address revoker) external override onlyOwner {
        // Assign the new revoker role.
        _setRevoker(revoker);
    }

    /**
     * @notice External view function to retrieve the address of the revoker
     *         role that can close channels.
     *
     * @return revoker The account set as the revoker.
     */
    function getRevoker() external view override returns (address revoker) {
        return _revoker;
    }

    /**
     * @notice External view function to retrieve the address of the
     *         ConduitController referenced by the contract
     *
     * @return conduitController The address of the ConduitController.
     */
    function getConduitController()
        external
        view
        override
        returns (address conduitController)
    {
        return address(_CONDUIT_CONTROLLER);
    }

    /**
     * @notice Internal function to set a revoker role that can close channels.
     *
     * @param revoker The account to set as the revoker.
     */
    function _setRevoker(address revoker) internal {
        // Revert if no address is supplied for the revoker role.
        if (revoker == address(0)) {
            revert RevokerIsNullAddress();
        }

        // Assign the new revoker role.
        _revoker = revoker;
        emit RevokerUpdated(revoker);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"conduitController","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"initialRevoker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerIsNotNewPotentialOwner","type":"error"},{"inputs":[],"name":"CallerIsNotOwner","type":"error"},{"inputs":[],"name":"InitialOwnerIsNullAddress","type":"error"},{"inputs":[{"internalType":"address","name":"conduitController","type":"address"}],"name":"InvalidConduitController","type":"error"},{"inputs":[],"name":"InvalidRevoker","type":"error"},{"inputs":[],"name":"NewPotentialOwnerIsNullAddress","type":"error"},{"inputs":[{"internalType":"address","name":"currentOwner","type":"address"}],"name":"OwnerAlreadySet","type":"error"},{"inputs":[],"name":"RevokerIsNullAddress","type":"error"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"revoker","type":"address"}],"name":"RevokerUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"conduit","type":"address"}],"name":"acceptConduitOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"conduit","type":"address"}],"name":"cancelConduitOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"conduit","type":"address"},{"internalType":"address","name":"channel","type":"address"}],"name":"closeChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getConduitController","outputs":[{"internalType":"address","name":"conduitController","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevoker","outputs":[{"internalType":"address","name":"revoker","type":"address"}],"stateMutability":"view","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":"conduit","type":"address"},{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"transferConduitOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"conduit","type":"address"},{"internalType":"address","name":"channel","type":"address"},{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"updateChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"revoker","type":"address"}],"name":"updateRevoker","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638da5cb5b1161008c578063cf72618e11610066578063cf72618e1461017f578063d792782414610192578063ef316365146101a3578063f2fde38b146101c957600080fd5b80638da5cb5b14610148578063bed6304114610159578063cc6b2d721461016c57600080fd5b806313ad9cab146100d457806323452b9c146100e95780632db71ae1146100f15780635bb05674146101045780637762df251461011757806379ba509714610140575b600080fd5b6100e76100e23660046107c7565b6101dc565b005b6100e7610297565b6100e76100ff366004610813565b610308565b6100e7610112366004610846565b6103bb565b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b6100e7610465565b6000546001600160a01b0316610124565b6100e7610167366004610813565b6104df565b6100e761017a366004610846565b610567565b6100e761018d366004610846565b6105e0565b6002546001600160a01b0316610124565b7f00000000000000000000000000000000f9490004c11cef243f5400493c00ad63610124565b6100e76101d7366004610846565b610617565b6000546001600160a01b0316331461020757604051636db2465f60e01b815260040160405180910390fd5b6040516313ad9cab60e01b81526001600160a01b038481166004830152838116602483015282151560448301527f00000000000000000000000000000000f9490004c11cef243f5400493c00ad6316906313ad9cab90606401600060405180830381600087803b15801561027a57600080fd5b505af115801561028e573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031633146102c257604051636db2465f60e01b815260040160405180910390fd5b604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da9060200160405180910390a1600180546001600160a01b0319169055565b6000546001600160a01b0316331461033357604051636db2465f60e01b815260040160405180910390fd5b604051636d43542160e01b81526001600160a01b03838116600483015282811660248301527f00000000000000000000000000000000f9490004c11cef243f5400493c00ad631690636d435421906044015b600060405180830381600087803b15801561039f57600080fd5b505af11580156103b3573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146103e657604051636db2465f60e01b815260040160405180910390fd5b604051637b37e56160e01b81526001600160a01b0382811660048301527f00000000000000000000000000000000f9490004c11cef243f5400493c00ad631690637b37e561906024015b600060405180830381600087803b15801561044a57600080fd5b505af115801561045e573d6000803e3d6000fd5b5050505050565b6001546001600160a01b031633146104905760405163356e005760e01b815260040160405180910390fd5b604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da9060200160405180910390a1600180546001600160a01b03191690556104dd336106c7565b565b6002546001600160a01b0316331461050a57604051632c8c06e360e11b815260040160405180910390fd5b6040516313ad9cab60e01b81526001600160a01b0383811660048301528281166024830152600060448301527f00000000000000000000000000000000f9490004c11cef243f5400493c00ad6316906313ad9cab90606401610385565b6000546001600160a01b0316331461059257604051636db2465f60e01b815260040160405180910390fd5b6040516351710e4560e01b81526001600160a01b0382811660048301527f00000000000000000000000000000000f9490004c11cef243f5400493c00ad6316906351710e4590602401610430565b6000546001600160a01b0316331461060b57604051636db2465f60e01b815260040160405180910390fd5b61061481610730565b50565b6000546001600160a01b0316331461064257604051636db2465f60e01b815260040160405180910390fd5b6001600160a01b03811661066957604051637621b06160e01b815260040160405180910390fd5b6040516001600160a01b03821681527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da9060200160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166107575760405163a23a682f60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f5549026e79f4449c2656308378875b265aaf4002b1ef696785f9439da13d4e369060200160405180910390a150565b80356001600160a01b03811681146107c257600080fd5b919050565b6000806000606084860312156107dc57600080fd5b6107e5846107ab565b92506107f3602085016107ab565b91506040840135801515811461080857600080fd5b809150509250925092565b6000806040838503121561082657600080fd5b61082f836107ab565b915061083d602084016107ab565b90509250929050565b60006020828403121561085857600080fd5b610861826107ab565b939250505056fea26469706673582212207240b240728dd6b724a39b8d7d9bf8f2ef40fc1eaf27821ac8ed2a76cd09fdc864736f6c634300080f0033

Deployed Bytecode Sourcemap

15005:6111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18470:291;;;;;;:::i;:::-;;:::i;:::-;;11905:286;;;:::i;16460:::-;;;;;;:::i;:::-;;:::i;16980:266::-;;;;;;:::i;:::-;;:::i;13165:108::-;13250:15;;-1:-1:-1;;;;;13250:15:0;13165:108;;;-1:-1:-1;;;;;1238:32:1;;;1220:51;;1208:2;1193:18;13165:108:0;;;;;;;12399:604;;;:::i;13412:88::-;13459:7;13486:6;-1:-1:-1;;;;;13486:6:0;13412:88;;19146:371;;;;;;:::i;:::-;;:::i;17515:241::-;;;;;;:::i;:::-;;:::i;19724:148::-;;;;;;:::i;:::-;;:::i;20086:105::-;20175:8;;-1:-1:-1;;;;;20175:8:0;20086:105;;20428:186;20586:19;20428:186;;11187:555;;;;;;:::i;:::-;;:::i;18470:291::-;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;18694:59:::1;::::0;-1:-1:-1;;;18694:59:0;;-1:-1:-1;;;;;1534:15:1;;;18694:59:0::1;::::0;::::1;1516:34:1::0;1586:15;;;1566:18;;;1559:43;1645:14;;1638:22;1618:18;;;1611:50;18694:19:0::1;:33;::::0;::::1;::::0;1451:18:1;;18694:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18470:291:::0;;;:::o;11905:286::-;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;12064:33:::1;::::0;12094:1:::1;1220:51:1::0;;12064:33:0::1;::::0;1208:2:1;1193:18;12064:33:0::1;;;;;;;12168:15;12161:22:::0;;-1:-1:-1;;;;;;12161:22:0::1;::::0;;11905:286::o;16460:::-;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;16673:65:::1;::::0;-1:-1:-1;;;16673:65:0;;-1:-1:-1;;;;;1902:15:1;;;16673:65:0::1;::::0;::::1;1884:34:1::0;1954:15;;;1934:18;;;1927:43;16673:19:0::1;:37;::::0;::::1;::::0;1819:18:1;;16673:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16460:286:::0;;:::o;16980:266::-;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;17186:52:::1;::::0;-1:-1:-1;;;17186:52:0;;-1:-1:-1;;;;;1238:32:1;;;17186:52:0::1;::::0;::::1;1220:51:1::0;17186:19:0::1;:43;::::0;::::1;::::0;1193:18:1;;17186:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16980:266:::0;:::o;12399:604::-;12527:15;;-1:-1:-1;;;;;12527:15:0;12513:10;:29;12509:178;;12645:30;;-1:-1:-1;;;12645:30:0;;;;;;;;;;;12509:178;12784:33;;12814:1;1220:51:1;;12784:33:0;;1208:2:1;1193:18;12784:33:0;;;;;;;12888:15;12881:22;;-1:-1:-1;;;;;;12881:22:0;;;12974:21;12984:10;12974:9;:21::i;:::-;12399:604::o;19146:371::-;19302:8;;-1:-1:-1;;;;;19302:8:0;19288:10;:22;19284:78;;19334:16;;-1:-1:-1;;;19334:16:0;;;;;;;;;;;19284:78;19451:58;;-1:-1:-1;;;19451:58:0;;-1:-1:-1;;;;;1534:15:1;;;19451:58:0;;;1516:34:1;1586:15;;;1566:18;;;1559:43;19503:5:0;1618:18:1;;;1611:50;19451:19:0;:33;;;;1451:18:1;;19451:58:0;1282:385:1;17515:241:0;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;17704:44:::1;::::0;-1:-1:-1;;;17704:44:0;;-1:-1:-1;;;;;1238:32:1;;;17704:44:0::1;::::0;::::1;1220:51:1::0;17704:19:0::1;:35;::::0;::::1;::::0;1193:18:1;;17704:44:0::1;1074:203:1::0;19724:148:0;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;19844:20:::1;19856:7;19844:11;:20::i;:::-;19724:148:::0;:::o;11187:555::-;10638:6;;-1:-1:-1;;;;;10638:6:0;10624:10;:20;10620:78;;10668:18;;-1:-1:-1;;;10668:18:0;;;;;;;;;;;10620:78;-1:-1:-1;;;;;11386:31:0;::::1;11382:103;;11441:32;;-1:-1:-1::0;;;11441:32:0::1;;;;;;;;;;;11382:103;11582:40;::::0;-1:-1:-1;;;;;1238:32:1;;1220:51;;11582:40:0::1;::::0;1208:2:1;1193:18;11582:40:0::1;;;;;;;11699:15;:35:::0;;-1:-1:-1;;;;;;11699:35:0::1;-1:-1:-1::0;;;;;11699:35:0;;;::::1;::::0;;;::::1;::::0;;11187:555::o;14480:238::-;14632:6;;14611:38;;;-1:-1:-1;;;;;14632:6:0;;;1884:34:1;;1954:15;;;1949:2;1934:18;;1927:43;14611:38:0;;1819:18:1;14611:38:0;;;;;;;14693:6;:17;;-1:-1:-1;;;;;;14693:17:0;-1:-1:-1;;;;;14693:17:0;;;;;;;;;;14480:238::o;20787:326::-;-1:-1:-1;;;;;20916:21:0;;20912:83;;20961:22;;-1:-1:-1;;;20961:22:0;;;;;;;;;;;20912:83;21048:8;:18;;-1:-1:-1;;;;;;21048:18:0;-1:-1:-1;;;;;21048:18:0;;;;;;;;21082:23;;1220:51:1;;;21082:23:0;;1208:2:1;1193:18;21082:23:0;;;;;;;20787:326;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:421::-;266:6;274;282;335:2;323:9;314:7;310:23;306:32;303:52;;;351:1;348;341:12;303:52;374:29;393:9;374:29;:::i;:::-;364:39;;422:38;456:2;445:9;441:18;422:38;:::i;:::-;412:48;;510:2;499:9;495:18;482:32;557:5;550:13;543:21;536:5;533:32;523:60;;579:1;576;569:12;523:60;602:5;592:15;;;192:421;;;;;:::o;618:260::-;686:6;694;747:2;735:9;726:7;722:23;718:32;715:52;;;763:1;760;753:12;715:52;786:29;805:9;786:29;:::i;:::-;776:39;;834:38;868:2;857:9;853:18;834:38;:::i;:::-;824:48;;618:260;;;;;:::o;883:186::-;942:6;995:2;983:9;974:7;970:23;966:32;963:52;;;1011:1;1008;1001:12;963:52;1034:29;1053:9;1034:29;:::i;:::-;1024:39;883:186;-1:-1:-1;;;883:186:1:o

Swarm Source

ipfs://7240b240728dd6b724a39b8d7d9bf8f2ef40fc1eaf27821ac8ed2a76cd09fdc8

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
[ 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.