Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GmBoostFactory
Compiler Version
v0.8.30+commit.73712a01
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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)
}
}
}// 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);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.