ETH Price: $3,093.06 (-2.19%)

Contract

0x129674A91Cbc4582e0dce1465665B1Abf21a6F7B

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

ContractCreator

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GmBoostFactory

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;

import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {IFeeManager} from "./IFeeManager.sol";

/// @title IGmBoostInit - Minimal initializer interface for GmBoost clones
/// @author GmBoost Team
/// @notice Used by the factory to initialize freshly cloned contracts.
interface IGmBoostInit {
    /// @notice Initialize the clone with owner and fee manager.
    /// @param owner_ Address of the clone owner.
    /// @param feeManager_ Address of the FeeManager used for config.
    function initialize(address owner_, address feeManager_) external;
}

/// @title GmBoostFactory - Deploys minimal-proxy GmBoost clones for users
/// @author GmBoost Team
/// @notice Emits events to attribute each deployed GM contract to its owner.
/// @dev Charges a deployment fee (configured in FeeManager) and forwards 100% to platform treasury.
contract GmBoostFactory {
    using Clones for address;

    // ---------------------------- Storage ------------------------------
    /// @notice Implementation contract address used for cloning.
    address public immutable GMBOOST_IMPLEMENTATION;
    /// @notice Shared FeeManager per chain.
    address public immutable FEE_MANAGER;

    // ---------------------------- Events -------------------------------
    /// @notice Emitted when a new user GM clone is deployed.
    /// @param owner           The user who owns the new GM contract.
    /// @param contractAddress The address of the deployed GM clone.
    event GMContractCreated(
        address indexed owner,
        address indexed contractAddress
    );

    /// @notice Emitted when deployment fee is received and forwarded to treasury.
    /// @param deployer The user who deployed the contract.
    /// @param clone    The address of the deployed clone.
    /// @param fee      The deployment fee paid.
    event DeploymentFeeReceived(
        address indexed deployer,
        address indexed clone,
        uint256 fee
    );

    // -------------------------- Custom Errors --------------------------
    error ZeroAddress();
    error InsufficientDeploymentFee();
    error TransferFailed();

    // --------------------------- Constructor ---------------------------
    /// @notice Creates the factory with implementation and fee manager addresses.
    /// @dev Both addresses are immutable after deployment.
    /// @param gmBoostImpl_   Address of the deployed GmBoost implementation (logic).
    /// @param feeManager_ Address of the shared FeeManager for this chain.
    constructor(address gmBoostImpl_, address feeManager_) {
        if (gmBoostImpl_ == address(0) || feeManager_ == address(0)) {
            revert ZeroAddress();
        }
        GMBOOST_IMPLEMENTATION = gmBoostImpl_;
        FEE_MANAGER = feeManager_;
    }

    // ----------------------------- API --------------------------------
    /// @notice Deploy a new GmBoost clone for the caller and initialize it.
    /// @dev Requires payment of deployFeeWei (from FeeManager). Tips allowed. Forwards 100% to treasury.
    /// @return clone Address of the newly deployed GM contract.
    function createGmBoost() external payable returns (address clone) {
        // Read deployment fee configuration
        (uint256 deployFee, address treasury) = IFeeManager(FEE_MANAGER).getDeployConfig();

        // Extra safety: treasury should never be zero (guarded in FeeManager) but validate here
        if (treasury == address(0)) revert ZeroAddress();

        // Validate payment (tips allowed)
        if (msg.value < deployFee) revert InsufficientDeploymentFee();

        // Create and initialize clone
        clone = GMBOOST_IMPLEMENTATION.clone();
        IGmBoostInit(clone).initialize(msg.sender, FEE_MANAGER);

        // Forward deployment fee to treasury (100%)
        if (msg.value > 0) {
            // Safe: treasury from FeeManager (Safe multisig controlled, not user input)
            // CEI pattern enforced, clone created before transfer, explicit error handling
            (bool success, ) = payable(treasury).call{value: msg.value}("");
            if (!success) revert TransferFailed();
        }

        // Emit events
        emit GMContractCreated(msg.sender, clone);
        emit DeploymentFeeReceived(msg.sender, clone, msg.value);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (proxy/Clones.sol)

pragma solidity ^0.8.20;

import {Create2} from "../utils/Create2.sol";
import {Errors} from "../utils/Errors.sol";

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 */
library Clones {
    error CloneArgumentsTooLong();

    /**
     * @dev Deploys and returns the address of a clone that mimics the behavior of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     */
    function clone(address implementation) internal returns (address instance) {
        return clone(implementation, 0);
    }

    /**
     * @dev Same as {xref-Clones-clone-address-}[clone], but with a `value` parameter to send native currency
     * to the new contract.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function clone(address implementation, uint256 value) internal returns (address instance) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        assembly ("memory-safe") {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create(value, 0x09, 0x37)
        }
        if (instance == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behavior of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple times will revert, since
     * the clones cannot be deployed twice at the same address.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        return cloneDeterministic(implementation, salt, 0);
    }

    /**
     * @dev Same as {xref-Clones-cloneDeterministic-address-bytes32-}[cloneDeterministic], but with
     * a `value` parameter to send native currency to the new contract.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function cloneDeterministic(
        address implementation,
        bytes32 salt,
        uint256 value
    ) internal returns (address instance) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        assembly ("memory-safe") {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create2(value, 0x09, 0x37, salt)
        }
        if (instance == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly ("memory-safe") {
            let ptr := mload(0x40)
            mstore(add(ptr, 0x38), deployer)
            mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
            mstore(add(ptr, 0x14), implementation)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
            mstore(add(ptr, 0x58), salt)
            mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
            predicted := and(keccak256(add(ptr, 0x43), 0x55), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt
    ) internal view returns (address predicted) {
        return predictDeterministicAddress(implementation, salt, address(this));
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
     * immutable arguments. These are provided through `args` and cannot be changed after deployment. To
     * access the arguments within the implementation, use {fetchCloneArgs}.
     *
     * This function uses the create opcode, which should never revert.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     */
    function cloneWithImmutableArgs(address implementation, bytes memory args) internal returns (address instance) {
        return cloneWithImmutableArgs(implementation, args, 0);
    }

    /**
     * @dev Same as {xref-Clones-cloneWithImmutableArgs-address-bytes-}[cloneWithImmutableArgs], but with a `value`
     * parameter to send native currency to the new contract.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function cloneWithImmutableArgs(
        address implementation,
        bytes memory args,
        uint256 value
    ) internal returns (address instance) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
        assembly ("memory-safe") {
            instance := create(value, add(bytecode, 0x20), mload(bytecode))
        }
        if (instance == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
     * immutable arguments. These are provided through `args` and cannot be changed after deployment. To
     * access the arguments within the implementation, use {fetchCloneArgs}.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy the clone. Using the same
     * `implementation`, `args` and `salt` multiple times will revert, since the clones cannot be deployed twice
     * at the same address.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     */
    function cloneDeterministicWithImmutableArgs(
        address implementation,
        bytes memory args,
        bytes32 salt
    ) internal returns (address instance) {
        return cloneDeterministicWithImmutableArgs(implementation, args, salt, 0);
    }

    /**
     * @dev Same as {xref-Clones-cloneDeterministicWithImmutableArgs-address-bytes-bytes32-}[cloneDeterministicWithImmutableArgs],
     * but with a `value` parameter to send native currency to the new contract.
     *
     * WARNING: This function does not check if `implementation` has code. A clone that points to an address
     * without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
     * have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function cloneDeterministicWithImmutableArgs(
        address implementation,
        bytes memory args,
        bytes32 salt,
        uint256 value
    ) internal returns (address instance) {
        bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
        return Create2.deploy(value, salt, bytecode);
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
     */
    function predictDeterministicAddressWithImmutableArgs(
        address implementation,
        bytes memory args,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
        return Create2.computeAddress(salt, keccak256(bytecode), deployer);
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
     */
    function predictDeterministicAddressWithImmutableArgs(
        address implementation,
        bytes memory args,
        bytes32 salt
    ) internal view returns (address predicted) {
        return predictDeterministicAddressWithImmutableArgs(implementation, args, salt, address(this));
    }

    /**
     * @dev Get the immutable args attached to a clone.
     *
     * - If `instance` is a clone that was deployed using `clone` or `cloneDeterministic`, this
     *   function will return an empty array.
     * - If `instance` is a clone that was deployed using `cloneWithImmutableArgs` or
     *   `cloneDeterministicWithImmutableArgs`, this function will return the args array used at
     *   creation.
     * - If `instance` is NOT a clone deployed using this library, the behavior is undefined. This
     *   function should only be used to check addresses that are known to be clones.
     */
    function fetchCloneArgs(address instance) internal view returns (bytes memory) {
        bytes memory result = new bytes(instance.code.length - 45); // revert if length is too short
        assembly ("memory-safe") {
            extcodecopy(instance, add(result, 32), 45, mload(result))
        }
        return result;
    }

    /**
     * @dev Helper that prepares the initcode of the proxy with immutable args.
     *
     * An assembly variant of this function requires copying the `args` array, which can be efficiently done using
     * `mcopy`. Unfortunately, that opcode is not available before cancun. A pure solidity implementation using
     * abi.encodePacked is more expensive but also more portable and easier to review.
     *
     * NOTE: https://eips.ethereum.org/EIPS/eip-170[EIP-170] limits the length of the contract code to 24576 bytes.
     * With the proxy code taking 45 bytes, that limits the length of the immutable args to 24531 bytes.
     */
    function _cloneCodeWithImmutableArgs(
        address implementation,
        bytes memory args
    ) private pure returns (bytes memory) {
        if (args.length > 24531) revert CloneArgumentsTooLong();
        return
            abi.encodePacked(
                hex"61",
                uint16(args.length + 45),
                hex"3d81600a3d39f3363d3d373d3d3d363d73",
                implementation,
                hex"5af43d82803e903d91602b57fd5bf3",
                args
            );
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)

pragma solidity ^0.8.20;

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

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev There's no code to deploy.
     */
    error Create2EmptyBytecode();

    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}.
     *
     * The bytecode for a contract can be obtained from Solidity with
     * `type(contractName).creationCode`.
     *
     * Requirements:
     *
     * - `bytecode` must not be empty.
     * - `salt` must have not been used for `bytecode` already.
     * - the factory must have a balance of at least `amount`.
     * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
     */
    function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }
        if (bytecode.length == 0) {
            revert Create2EmptyBytecode();
        }
        assembly ("memory-safe") {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
            // if no address was created, and returndata is not empty, bubble revert
            if and(iszero(addr), not(iszero(returndatasize()))) {
                let p := mload(0x40)
                returndatacopy(p, 0, returndatasize())
                revert(p, returndatasize())
            }
        }
        if (addr == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
     * `bytecodeHash` or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
        assembly ("memory-safe") {
            let ptr := mload(0x40) // Get free memory pointer

            // |                   | ↓ ptr ...  ↓ ptr + 0x0B (start) ...  ↓ ptr + 0x20 ...  ↓ ptr + 0x40 ...   |
            // |-------------------|---------------------------------------------------------------------------|
            // | bytecodeHash      |                                                        CCCCCCCCCCCCC...CC |
            // | salt              |                                      BBBBBBBBBBBBB...BB                   |
            // | deployer          | 000000...0000AAAAAAAAAAAAAAAAAAA...AA                                     |
            // | 0xFF              |            FF                                                             |
            // |-------------------|---------------------------------------------------------------------------|
            // | memory            | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
            // | keccak(start, 85) |            ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |

            mstore(add(ptr, 0x40), bytecodeHash)
            mstore(add(ptr, 0x20), salt)
            mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
            let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
            mstore8(start, 0xff)
            addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }
}

File 4 of 5 : Errors.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 *
 * _Available since v5.1._
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

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

/// @title IFeeManager - Interface for reading the current GM payout/fee config
/// @author GmBoost Team
/// @notice Exposes read-only accessors for GM fee and deployment settings.
interface IFeeManager {
    /// @notice Returns the current configuration used by GM contracts.
    /// @return ethFeeWei  The minimum ETH required to call onChainGM (tips allowed).
    /// @return ownerShareBps  The owner's share in basis points (0..10_000).
    /// @return feeRecipient  The platform treasury receiving the platform share.
    function getConfig()
        external
        view
        returns (uint256 ethFeeWei, uint16 ownerShareBps, address feeRecipient);

    /// @notice Returns deployment configuration used by the Factory.
    /// @return deployFeeWei  The ETH fee required to deploy a GM contract (tips allowed).
    /// @return feeRecipient  The platform treasury receiving deployment fees.
    function getDeployConfig()
        external
        view
        returns (uint256 deployFeeWei, address feeRecipient);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"gmBoostImpl_","type":"address"},{"internalType":"address","name":"feeManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InsufficientDeploymentFee","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":true,"internalType":"address","name":"clone","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"DeploymentFeeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"GMContractCreated","type":"event"},{"inputs":[],"name":"FEE_MANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GMBOOST_IMPLEMENTATION","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createGmBoost","outputs":[{"internalType":"address","name":"clone","type":"address"}],"stateMutability":"payable","type":"function"}]

60c060405234801561001057600080fd5b5060405161056f38038061056f83398101604081905261002f9161009d565b6001600160a01b038216158061004c57506001600160a01b038116155b1561006a5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b039182166080521660a0526100d0565b80516001600160a01b038116811461009857600080fd5b919050565b600080604083850312156100b057600080fd5b6100b983610081565b91506100c760208401610081565b90509250929050565b60805160a0516104686101076000396000818160a30152818160cc01526101e6015260008181604b015261019c01526104686000f3fe6080604052600436106100345760003560e01c8063a0a20f7414610039578063aec101df14610089578063ea26266c14610091575b600080fd5b34801561004557600080fd5b5061006d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100c5565b34801561009d57600080fd5b5061006d7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316625002a86040518163ffffffff1660e01b81526004016040805180830381865afa158015610126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014a91906103f5565b90925090506001600160a01b0381166101765760405163d92e233d60e01b815260040160405180910390fd5b81341015610197576040516354605d0160e11b815260040160405180910390fd5b6101c97f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610348565b60405163485cc95560e01b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301529194509084169063485cc95590604401600060405180830381600087803b15801561023657600080fd5b505af115801561024a573d6000803e3d6000fd5b5050505060003411156102cd576000816001600160a01b03163460405160006040518083038185875af1925050503d80600081146102a4576040519150601f19603f3d011682016040523d82523d6000602084013e6102a9565b606091505b50509050806102cb576040516312171d8360e31b815260040160405180910390fd5b505b6040516001600160a01b0384169033907f5a7c446ab532e3c66b861cde69d36857b2aef11778ea17a47d61c5057d25773390600090a36040513481526001600160a01b0384169033907fbddb815938b3f24a163f97e0efc4860bef4770ce186d76c2a5560dde95bfa5bb9060200160405180910390a3505090565b600061035582600061035b565b92915050565b60008147101561038b5760405163cf47918160e01b81524760048201526024810183905260440160405180910390fd5b763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b176020526037600983f090506001600160a01b0381166103555760405163b06ebf3d60e01b815260040160405180910390fd5b6000806040838503121561040857600080fd5b825160208401519092506001600160a01b038116811461042757600080fd5b80915050925092905056fea2646970667358221220541b3478558a4564c8f5cd5b0f5d66867a4f862b71036b3d7cf6ce9a8a44870c64736f6c634300081e0033000000000000000000000000c6781ee67cc92569a7790d95d3a55750f221f6f30000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a25

Deployed Bytecode

0x6080604052600436106100345760003560e01c8063a0a20f7414610039578063aec101df14610089578063ea26266c14610091575b600080fd5b34801561004557600080fd5b5061006d7f000000000000000000000000c6781ee67cc92569a7790d95d3a55750f221f6f381565b6040516001600160a01b03909116815260200160405180910390f35b61006d6100c5565b34801561009d57600080fd5b5061006d7f0000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a2581565b60008060007f0000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a256001600160a01b0316625002a86040518163ffffffff1660e01b81526004016040805180830381865afa158015610126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014a91906103f5565b90925090506001600160a01b0381166101765760405163d92e233d60e01b815260040160405180910390fd5b81341015610197576040516354605d0160e11b815260040160405180910390fd5b6101c97f000000000000000000000000c6781ee67cc92569a7790d95d3a55750f221f6f36001600160a01b0316610348565b60405163485cc95560e01b81523360048201526001600160a01b037f0000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a25811660248301529194509084169063485cc95590604401600060405180830381600087803b15801561023657600080fd5b505af115801561024a573d6000803e3d6000fd5b5050505060003411156102cd576000816001600160a01b03163460405160006040518083038185875af1925050503d80600081146102a4576040519150601f19603f3d011682016040523d82523d6000602084013e6102a9565b606091505b50509050806102cb576040516312171d8360e31b815260040160405180910390fd5b505b6040516001600160a01b0384169033907f5a7c446ab532e3c66b861cde69d36857b2aef11778ea17a47d61c5057d25773390600090a36040513481526001600160a01b0384169033907fbddb815938b3f24a163f97e0efc4860bef4770ce186d76c2a5560dde95bfa5bb9060200160405180910390a3505090565b600061035582600061035b565b92915050565b60008147101561038b5760405163cf47918160e01b81524760048201526024810183905260440160405180910390fd5b763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b176020526037600983f090506001600160a01b0381166103555760405163b06ebf3d60e01b815260040160405180910390fd5b6000806040838503121561040857600080fd5b825160208401519092506001600160a01b038116811461042757600080fd5b80915050925092905056fea2646970667358221220541b3478558a4564c8f5cd5b0f5d66867a4f862b71036b3d7cf6ce9a8a44870c64736f6c634300081e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c6781ee67cc92569a7790d95d3a55750f221f6f30000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a25

-----Decoded View---------------
Arg [0] : gmBoostImpl_ (address): 0xC6781ee67Cc92569a7790D95D3A55750f221f6F3
Arg [1] : feeManager_ (address): 0x6eBb63DeB7efdfF79615e8c3eA4BF2D38Ce77a25

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c6781ee67cc92569a7790d95d3a55750f221f6f3
Arg [1] : 0000000000000000000000006ebb63deb7efdff79615e8c3ea4bf2d38ce77a25


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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