FRAX Price: $0.97 (-4.14%)

Contract

0x26F230BCa86f02E73B487f583f9D98D54266b3B5

Overview

FRAX Balance | FXTL Balance

0 FRAX | 23 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction and 1 Token Transfer found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
165351902025-02-18 12:18:11340 days ago1739881091
0x26F230BC...54266b3B5
 Contract Creation0 FRAX

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FusionProxyFactory

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 800 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

import "./FusionProxy.sol";
import "../external/FusionContext.sol";
import "../base/Verifier.sol";
import "../libraries/Conversion.sol";
import "../interfaces/IFusion.sol";
import "../libraries/Conversion.sol";

/**
 * @title Fusion Proxy Factory - Allows to create a new proxy contract and execute a message call to the new proxy within one transaction.
 * @author Anoy Roy Chowdhury - <[email protected]>
 */

contract FusionProxyFactory {
    event ProxyCreation(FusionProxy indexed proxy, address singleton);

    /// @dev Allows to retrieve the creation code used for the Proxy deployment. With this it is easily possible to calculate predicted address.
    function proxyCreationCode() public pure returns (bytes memory) {
        return type(FusionProxy).creationCode;
    }

    /**
     * @notice Internal method to create a new proxy contract using CREATE2.
     * @param Singleton Address of the singleton contract.
     * @param TxHash The common public input for proof verification.
     * @param TxVerifier Address of the TxVerifier contract.
     * @param TxHash The common public input for proof verification.
     * @param salt Create2 salt to use for calculating the address of the new proxy contract.
     * @param to Contract address for optional delegate call.
     * @param data Data payload for optional delegate call.
     * @return proxy Address of the new proxy contract.
     */
    function deployProxy(
        address Singleton,
        bytes32 TxHash,
        address TxVerifier,
        bytes32 salt,
        address to,
        bytes calldata data
    ) internal returns (FusionProxy proxy) {
        require(isContract(Singleton), "Singleton contract not deployed");

        bytes memory deploymentData = abi.encodePacked(
            type(FusionProxy).creationCode,
            uint256(uint160(Singleton))
        );
        // solhint-disable-next-line no-inline-assembly
        assembly {
            proxy := create2(
                0x0,
                add(0x20, deploymentData),
                mload(deploymentData),
                salt
            )
        }
        require(address(proxy) != address(0), "Create2 call failed");

        bytes memory initializer = getInitializer(TxVerifier, TxHash, to, data);

        // solhint-disable-next-line no-inline-assembly
        assembly {
            if eq(
                call(
                    gas(),
                    proxy,
                    0,
                    add(initializer, 0x20),
                    mload(initializer),
                    0,
                    0
                ),
                0
            ) {
                revert(0, 0)
            }
        }
    }

    /**
     * @notice Deploys a new proxy with the current singleton.
     * @param RegistryData Data payload for the registry.
     * @param to Contract address for optional delegate call.
     * @param data Data payload for optional delegate call.
     */
    function createProxyWithTxHash(
        bytes calldata RegistryData,
        address to,
        bytes calldata data
    ) public returns (FusionProxy proxy) {
        (address Singleton, bytes32 TxHash, address _txVerifier) = abi.decode(
            RegistryData,
            (address, bytes32, address)
        );

        proxy = _createProxyWithTxHash(
            Singleton,
            TxHash,
            _txVerifier,
            to,
            data
        );
    }

    /**
     * @notice Deploys a new proxy with `_singleton` singleton.
     * @param _singleton Address of the singleton contract.
     * @param _txHash The common public input for proof verification.
     * @param _txVerifier Address of the TxVerifier contract.
     * @param to Contract address for optional delegate call.
     * @param data Data payload for optional delegate call.
     * @dev The domain name is used to calculate the salt for the CREATE2 call.
     */
    function _createProxyWithTxHash(
        address _singleton,
        bytes32 _txHash,
        address _txVerifier,
        address to,
        bytes calldata data
    ) internal returns (FusionProxy proxy) {
        // If the domain changes the proxy address should change too.
        bytes32 salt = keccak256(abi.encodePacked(_txHash, _txVerifier));

        proxy = deployProxy(_singleton, _txHash, _txVerifier, salt, to, data);

        emit ProxyCreation(proxy, _singleton);
    }

    /**
     * @notice Returns true if `account` is a contract.
     * @dev This function will return false if invoked during the constructor of a contract,
     *      as the code is not actually created until after the constructor finishes.
     * @param account The address being queried
     * @return True if `account` is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @notice Returns the initializer for the Fusion contract.
     * @param _txVerifier  The address of the TxVerifier contract.
     * @param _txHash The common public input for proof verification.
     * @param _to Contract address for optional delegate call.
     * @param _data Data payload for optional delegate call.
     */
    function getInitializer(
        address _txVerifier,
        bytes32 _txHash,
        address _to,
        bytes calldata _data
    ) internal pure returns (bytes memory) {
        return
            abi.encodeWithSelector(
                IFusion.setupFusion.selector,
                _txVerifier,
                _txHash,
                _to,
                _data
            );
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

/**
 * @title UltraVerifierInterface - Interface for verification of proofs
 * @author Anoy Roy Chowdhury - <[email protected]>
 * @notice This Interface is used to verify proofs using UltraVerifier
 */
interface UltraVerifierInterface {
    function verify(
        bytes calldata _proof,
        bytes32[] calldata _publicInputs
    ) external view returns (bool);
}

/**
 * @title Verifier - Base contract for verification of proofs
 * @dev This contract is used to verify proofs using UltraVerifier
 */
abstract contract Verifier {
    /**
     * @notice Verifies the proof and returns the result of verification.
     * @param _proof The proof inputs
     * @param _publicInputs The public inputs
     * @param _verifier The address of the verifier contract
     */
    function verifyProof(
        bytes calldata _proof,
        bytes32[] memory _publicInputs,
        address _verifier
    ) internal view returns (bool) {
        return UltraVerifierInterface(_verifier).verify(_proof, _publicInputs);
    }
}

File 5 of 11 : FusionContext.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0 <0.9.0;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

/**
 * @dev FusionContext - A contract that charges fees for the transaction.
 * @author Anoy Roy Chowdhury - <[email protected]>
 */

abstract contract FusionContext {
    /**
     * @notice Charges the fees for the transaction.
     * @param startGas Gas used before calling the function
     * @param gasPrice gas price of the transaction
     * @param baseGas base gas deducted by the relayer
     * @param GasTank address of the GasTank
     * @param token address of the token
     */
    function chargeFees(
        uint256 startGas,
        uint256 gasPrice,
        uint256 baseGas,
        address GasTank,
        address token
    ) internal {
        uint256 gasUsed = startGas - gasleft();
        uint256 gasFee = (gasUsed + baseGas) * gasPrice;

        if (token != address(0)) {
            uint8 decimals = IERC20Metadata(token).decimals();
            uint256 transferAmount = gasFee / 10 ** (18 - decimals);

            // Low-level call with additional check for tokens without return value
            (bool success, bytes memory data) = token.call(
                abi.encodeWithSelector(
                    IERC20.transfer.selector,
                    GasTank,
                    transferAmount
                )
            );

            bool transferSucceeded = success &&
                (data.length == 0 || abi.decode(data, (bool)));

            if (!transferSucceeded) {
                revert("Fusion: fee transfer failed");
            }
        } else {
            (bool success, ) = GasTank.call{value: gasFee}("");
            if (!success) {
                revert("Fusion: fee transfer failed");
            }
        }
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

import {Enum} from "../libraries/Enum.sol";
import {Transaction} from "../libraries/Transaction.sol";
import {Quote} from "../libraries/Quote.sol";

/**
 * @title IFusion - Fusion Wallet Interface
 * @author Anoy Roy Chowdhury - <[email protected]>
 */

interface IFusion {
    event SetupFusion(address txVerifier, bytes32 txHash);

    /**
     * @notice Initializes the Fusion Wallet
     * @param _txVerifier The address of the Noir based ZK-SNARK verifier contract
     * @param _txHash The hash used as a public inputs for verifiers
     * @param to The destination address of the call to execute
     * @param data The data of the call to
     */
    function setupFusion(
        address _txVerifier,
        bytes32 _txHash,
        address to,
        bytes calldata data
    ) external;

    /**
     * @notice Executes a transaction
     * @param _proof The zk-SNARK proof
     * @param txData call to perform
     */
    function executeTx(
        bytes calldata _proof,
        Transaction.TransactionData calldata txData
    ) external payable returns (bool success);

    /**
     * @notice Executes a batch of transactions
     * @param _proof The zk-SNARK proof
     * @param transactions Array of Transaction objects
     */
    function executeBatchTx(
        bytes calldata _proof,
        Transaction.TransactionData[] calldata transactions
    ) external payable;

    /**
     * @notice Executes a transaction with a trusted forwarder
     * @param _proof The zk-SNARK proof
     * @param txData call to perform
     * @param quote The gas quote
     */
    function executeTxWithProvider(
        bytes calldata _proof,
        Transaction.TransactionData calldata txData,
        Quote.GasQuote calldata quote
    ) external payable;

    /**
     * @notice Executes a batch of transactions with a trusted forwarder
     * @param _proof The zk-SNARK proof
     * @param transactions Array of Transaction objects
     * @param quote The gas quote
     */
    function executeBatchTxWithProvider(
        bytes calldata _proof,
        Transaction.TransactionData[] calldata transactions,
        Quote.GasQuote calldata quote
    ) external payable;

    /**
     * @notice Verifies if the proof is valid or not
     * @param _hash the message which is used to verify zero-knowledge proof
     * @param _signature Noir based zero-knowledge proof
     * @return magicValue The magic value indicating if the signature is valid
     */
    function isValidSignature(
        bytes32 _hash,
        bytes calldata _signature
    ) external view returns (bytes4 magicValue);

    /**
     * @notice Returns the nonce of the Fusion Wallet
     * @return The current nonce value
     */
    function getNonce() external view returns (uint256);

    /**
     * @notice Returns the version of the contract
     * @return The version string
     */
    function VERSION() external view returns (string memory);

    /**
     * @notice Returns the address of the transaction verifier
     * @return The address of the verifier contract
     */
    function TxVerifier() external view returns (address);

    /**
     * @notice Returns the transaction hash used as public input
     * @return The transaction hash
     */
    function TxHash() external view returns (bytes32);
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Conversion - A contract that can convert to publicInputs compatible with UltraVerifier
 * @notice This contract is a library that provides functions to convert between different types
 * @author Anoy Roy Chowdhury - <[email protected]>
 */

library Conversion {
    /**
     * @notice Convert a bytes32 value to a padded bytes32 value
     * @param value The value to be converted to bytes32
     */
    function convertToPaddedByte32(
        bytes32 value
    ) internal pure returns (bytes32) {
        bytes32 paddedValue;
        paddedValue = bytes32(uint256(value) >> (31 * 8));
        return paddedValue;
    }

    /**
     * @notice Convert the message hash to public inputs
     * @param _message  The message hash
     * @param _hash  The hash of the user that verifies the proof
     */
    function convertToInputs(
        bytes32 _message,
        bytes32 _hash
    ) internal pure returns (bytes32[] memory) {
        bytes32[] memory byte32Inputs = new bytes32[](33);
        bytes32 messageHash = getEthSignedMessageHash(_message);
        for (uint256 i = 0; i < 32; i++) {
            byte32Inputs[i] = convertToPaddedByte32(messageHash[i]);
        }
        byte32Inputs[32] = _hash;

        return byte32Inputs;
    }

    /**
     * @notice Get the hash of a message that was signed
     * @param _messageHash The hash of the message that was signed
     */
    function getEthSignedMessageHash(
        bytes32 _messageHash
    ) public pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    _messageHash
                )
            );
    }
}

File 8 of 11 : Enum.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Enum - Collection of enums used in Fusion contracts.
 * @author Anoy Roy Chowdhury - <[email protected]>
 */
library Enum {
    enum Operation {
        Call,
        DelegateCall
    }
}

File 9 of 11 : Quote.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Quote - Collection of structs used in Fusion gas quotes.
 * @author Anoy Roy Chowdhury - <[email protected]>
 */
library Quote {
    // GasQuote struct
    struct GasQuote {
        address token;
        uint256 gasPrice;
        uint256 baseGas;
        uint256 estimatedFees;
        address gasRecipient;
        uint48 deadline;
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

import {Enum} from "./Enum.sol";

/**
 * @title Transaction - Library for handling transactions in Fusion Wallet
 * @author Anoy Roy Chowdhury - <[email protected]>
 */
library Transaction {
    struct TransactionData {
        address to;
        uint256 value;
        bytes data;
        Enum.Operation operation;
        uint256 gasLimit;
    }

    /**
     * @notice Encode the transaction data with nonce
     * @param _tx  The transaction data
     * @param _nonce The nonce of the Fusion Wallet
     * @param _chainId The chain id of the network
     * @param _token The token address
     * @param _gasPrice The gas price
     * @param _baseGas The base gas
     */
    function encodeWithNonce(
        TransactionData memory _tx,
        uint256 _nonce,
        uint256 _chainId,
        address _token,
        uint256 _gasPrice,
        uint256 _baseGas,
        uint48 _deadline
    ) internal pure returns (bytes memory) {
        return
            abi.encode(
                _tx.to,
                _tx.value,
                _tx.data,
                uint8(_tx.operation),
                _nonce,
                _chainId,
                _token,
                _gasPrice,
                _baseGas,
                _deadline,
                _tx.gasLimit
            );
    }

    /**
     * @notice Get the hash of a transaction
     * @param _tx  The transaction data
     * @param _nonce  The nonce of the Fusion Wallet
     * @param _chainId  The chain id of the network
     * @param _token The token address
     * @param _gasPrice The gas price
     * @param _baseGas The base gas
     */
    function getTxHash(
        TransactionData memory _tx,
        uint256 _nonce,
        uint256 _chainId,
        address _token,
        uint256 _gasPrice,
        uint256 _baseGas,
        uint48 _deadline
    ) internal pure returns (bytes32) {
        return
            keccak256(
                encodeWithNonce(
                    _tx,
                    _nonce,
                    _chainId,
                    _token,
                    _gasPrice,
                    _baseGas,
                    _deadline
                )
            );
    }

    /**
     * @notice Get the hash of a batch of transactions
     * @param _txs All the transactions in the batch
     * @param _nonce The nonce of the Fusion Wallet
     * @param _chainId The chain id of the network
     * @param _token The token address
     * @param _gasPrice The gas price
     * @param _baseGas The base gas
     */
    function getTxBatchHash(
        TransactionData[] memory _txs,
        uint256 _nonce,
        uint256 _chainId,
        address _token,
        uint256 _gasPrice,
        uint256 _baseGas,
        uint48 _deadline
    ) internal pure returns (bytes32) {
        bytes memory txsData;
        for (uint256 i = 0; i < _txs.length; i++) {
            txsData = abi.encodePacked(
                txsData,
                encodeWithNonce(
                    _txs[i],
                    _nonce,
                    _chainId,
                    _token,
                    _gasPrice,
                    _baseGas,
                    _deadline
                )
            );
        }
        return keccak256(txsData);
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

/**
 * @title IProxy - Helper interface to access the singleton address of the Proxy on-chain.
 * @author Richard Meissner - <[email protected]>
 */
interface IProxy {
    function masterCopy() external view returns (address);
}

/**
 * @title FusionProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.
 * @author Stefan George - <[email protected]>
 * @author Richard Meissner - <[email protected]>
 * @author Anoy Roy Chowdhury - <[email protected]>
 */
contract FusionProxy {
    // Singleton always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.
    // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`
    address internal singleton;

    /**
     * @notice Constructor function sets address of singleton contract.
     * @param _singleton Singleton address.
     */
    constructor(address _singleton) {
        require(_singleton != address(0), "Invalid singleton address provided");
        singleton = _singleton;
    }

    /// @dev Fallback function forwards all transactions and returns all received return data.
    fallback() external payable {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            let _singleton := and(
                sload(0),
                0xffffffffffffffffffffffffffffffffffffffff
            )
            // 0xa619486e == keccak("masterCopy()"). The value is right padded to 32-bytes with 0s
            if eq(
                calldataload(0),
                0xa619486e00000000000000000000000000000000000000000000000000000000
            ) {
                mstore(0, _singleton)
                return(0, 0x20)
            }
            calldatacopy(0, 0, calldatasize())
            let success := delegatecall(
                gas(),
                _singleton,
                0,
                calldatasize(),
                0,
                0
            )
            returndatacopy(0, 0, returndatasize())
            if eq(success, 0) {
                revert(0, returndatasize())
            }
            return(0, returndatasize())
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 800,
    "details": {
      "yulDetails": {
        "optimizerSteps": "u"
      }
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract FusionProxy","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"singleton","type":"address"}],"name":"ProxyCreation","type":"event"},{"inputs":[{"internalType":"bytes","name":"RegistryData","type":"bytes"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createProxyWithTxHash","outputs":[{"internalType":"contract FusionProxy","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxyCreationCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"}]

60806040523461001a5760405161098f610020823961098f90f35b600080fdfe608060405260043610156200001357600080fd5b60003560e01c806353e5d93514620000365763d1d34a8a0362000048576200020f565b620000c5565b60009103126200004857565b600080fd5b60005b838110620000615750506000910152565b818101518382015260200162000050565b62000097620000a1602093620000ab936200008b815190565b80835293849260200190565b958691016200004d565b601f01601f191690565b0190565b6020808252620000c29291019062000072565b90565b346200004857620000d83660046200003c565b620000f3620000e662000297565b60405191829182620000af565b0390f35b909182601f83011215620000485781359167ffffffffffffffff8311620000485760200192600183028401116200004857565b6001600160a01b031690565b6001600160a01b0381165b036200004857565b90503590620001588262000136565b565b91906060838203126200004857823567ffffffffffffffff811162000048578162000187918501620000f7565b92909362000199836020830162000149565b92604082013567ffffffffffffffff81116200004857620001bb9201620000f7565b9091565b6200012a620000c2620000c2926001600160a01b031690565b620000c290620001bf565b620000c290620001d8565b620001f990620001e3565b9052565b602081019291620001589190620001ee565b346200004857620000f3620002346200022a3660046200015a565b9392909262000305565b60405191829182620001fd565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176200027a57604052565b62000241565b90620001586200028f60405190565b928362000257565b610259620002a86020820162000280565b9080825262000701602083013990565b8062000141565b905035906200015882620002b8565b90916060828403126200004857620000c2620002eb848462000149565b936040620002fd8260208701620002bf565b940162000149565b620003386200032d6200033f92620000c29796959462000323600090565b50810190620002ce565b9391929092620001e3565b92620001e3565b9162000363565b620001f9906001600160a01b031660601b90565b01809262000346565b95949290620003c8949262000376600090565b50604051620003ab81602081016200039e8587836020816200035a620000ab93601496959052565b9081038252038262000257565b620003bf620003b8825190565b9160200190565b2091886200052b565b917f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2356200041b620003f985620001e3565b926200040460405190565b918291826001600160a01b03909116815260200190565b0390a2565b156200042857565b60405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f796564006044820152606490fd5b620000c2620000c2620000c2926001600160a01b031690565b620000ab620004a1926020926200049b815190565b94859290565b938491016200004d565b620004be620000ab916020949362000486565b918252565b6200012a620000c2620000c29290565b620000c290620004c3565b15620004e657565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b95620005f7936200039e620005b0620005fd94989a999795976200054d600090565b50620005636200055d8262000623565b62000420565b6200059662000590610259926200057d6020850162000280565b93808552620007016020860139620001d8565b6200046d565b90620005a160405190565b938492602084019283620004ab565b8051906020016000f597620005c589620001e3565b93600097889788978897620005ef620005e26200012a8b620004d3565b916001600160a01b031690565b1415620004de565b620006bc565b60208151910182885af114620006105750565b80fd5b620000c2620000c2620000c29290565b3b6200063862000634600062000613565b9190565b1190565b90826000939282370152565b9190620000a1816200066281620000ab9560209181520190565b80956200063c565b909391620000c295936200069e620006ae9262000697608086019860008701906001600160a01b03169052565b6020850152565b6001600160a01b03166040830152565b606081850391015262000648565b9193620000c293620006f09295620006d2606090565b5060405163e4d52aa760e01b6020820152968795602487016200066a565b602082018103825203826200025756fe608060405234610028576100196100146100c0565b6101a1565b604051608b6101ce8239608b90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006457604052565b61002d565b9061007d61007660405190565b9283610043565b565b6001600160a01b031690565b90565b6001600160a01b0381160361002857565b9050519061007d8261008e565b906020828203126100285761008b9161009f565b61008b610259803803806100d381610069565b9283398101906100ac565b61007f61008b61008b9290565b61008b906100de565b156100fb57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b6064820152608490fd5b61008b9061007f906001600160a01b031682565b61008b9061014b565b61008b9061015f565b9061018161008b61019d92610168565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b61007d906101c66101b561007f60006100eb565b6001600160a01b03831614156100f4565b600061017156fe60806040526000805473ffffffffffffffffffffffffffffffffffffffff16903563530ca43760e11b14604c576000808092368280378136915af43d82803e146047573d6000f35b3d6000fd5b60005260206000f3fea264697066735822122080910b9407e55bea2fc5c4480d166cebd732618c84af8d8238f8c4ccc7d9955764736f6c63430008180033a2646970667358221220a7e4947857ef61a221b7336525f9f87bd79af5d7c03a1e1974802101603f37e364736f6c63430008180033

Deployed Bytecode

0x608060405260043610156200001357600080fd5b60003560e01c806353e5d93514620000365763d1d34a8a0362000048576200020f565b620000c5565b60009103126200004857565b600080fd5b60005b838110620000615750506000910152565b818101518382015260200162000050565b62000097620000a1602093620000ab936200008b815190565b80835293849260200190565b958691016200004d565b601f01601f191690565b0190565b6020808252620000c29291019062000072565b90565b346200004857620000d83660046200003c565b620000f3620000e662000297565b60405191829182620000af565b0390f35b909182601f83011215620000485781359167ffffffffffffffff8311620000485760200192600183028401116200004857565b6001600160a01b031690565b6001600160a01b0381165b036200004857565b90503590620001588262000136565b565b91906060838203126200004857823567ffffffffffffffff811162000048578162000187918501620000f7565b92909362000199836020830162000149565b92604082013567ffffffffffffffff81116200004857620001bb9201620000f7565b9091565b6200012a620000c2620000c2926001600160a01b031690565b620000c290620001bf565b620000c290620001d8565b620001f990620001e3565b9052565b602081019291620001589190620001ee565b346200004857620000f3620002346200022a3660046200015a565b9392909262000305565b60405191829182620001fd565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176200027a57604052565b62000241565b90620001586200028f60405190565b928362000257565b610259620002a86020820162000280565b9080825262000701602083013990565b8062000141565b905035906200015882620002b8565b90916060828403126200004857620000c2620002eb848462000149565b936040620002fd8260208701620002bf565b940162000149565b620003386200032d6200033f92620000c29796959462000323600090565b50810190620002ce565b9391929092620001e3565b92620001e3565b9162000363565b620001f9906001600160a01b031660601b90565b01809262000346565b95949290620003c8949262000376600090565b50604051620003ab81602081016200039e8587836020816200035a620000ab93601496959052565b9081038252038262000257565b620003bf620003b8825190565b9160200190565b2091886200052b565b917f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2356200041b620003f985620001e3565b926200040460405190565b918291826001600160a01b03909116815260200190565b0390a2565b156200042857565b60405162461bcd60e51b815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f796564006044820152606490fd5b620000c2620000c2620000c2926001600160a01b031690565b620000ab620004a1926020926200049b815190565b94859290565b938491016200004d565b620004be620000ab916020949362000486565b918252565b6200012a620000c2620000c29290565b620000c290620004c3565b15620004e657565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b95620005f7936200039e620005b0620005fd94989a999795976200054d600090565b50620005636200055d8262000623565b62000420565b6200059662000590610259926200057d6020850162000280565b93808552620007016020860139620001d8565b6200046d565b90620005a160405190565b938492602084019283620004ab565b8051906020016000f597620005c589620001e3565b93600097889788978897620005ef620005e26200012a8b620004d3565b916001600160a01b031690565b1415620004de565b620006bc565b60208151910182885af114620006105750565b80fd5b620000c2620000c2620000c29290565b3b6200063862000634600062000613565b9190565b1190565b90826000939282370152565b9190620000a1816200066281620000ab9560209181520190565b80956200063c565b909391620000c295936200069e620006ae9262000697608086019860008701906001600160a01b03169052565b6020850152565b6001600160a01b03166040830152565b606081850391015262000648565b9193620000c293620006f09295620006d2606090565b5060405163e4d52aa760e01b6020820152968795602487016200066a565b602082018103825203826200025756fe608060405234610028576100196100146100c0565b6101a1565b604051608b6101ce8239608b90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006457604052565b61002d565b9061007d61007660405190565b9283610043565b565b6001600160a01b031690565b90565b6001600160a01b0381160361002857565b9050519061007d8261008e565b906020828203126100285761008b9161009f565b61008b610259803803806100d381610069565b9283398101906100ac565b61007f61008b61008b9290565b61008b906100de565b156100fb57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b6064820152608490fd5b61008b9061007f906001600160a01b031682565b61008b9061014b565b61008b9061015f565b9061018161008b61019d92610168565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b61007d906101c66101b561007f60006100eb565b6001600160a01b03831614156100f4565b600061017156fe60806040526000805473ffffffffffffffffffffffffffffffffffffffff16903563530ca43760e11b14604c576000808092368280378136915af43d82803e146047573d6000f35b3d6000fd5b60005260206000f3fea264697066735822122080910b9407e55bea2fc5c4480d166cebd732618c84af8d8238f8c4ccc7d9955764736f6c63430008180033a2646970667358221220a7e4947857ef61a221b7336525f9f87bd79af5d7c03a1e1974802101603f37e364736f6c63430008180033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.