FrothMemeProtocolDeployer04
0xbe3b7aadbee8dbe71f0bfb4640a43dd8aaab59c9
Verification
Verified
v0.8.28+commit.7893614a
Type
Contract
15,954 bytes
ABI entries
19
15 read · 2 write
License
none
Contract information
- Address
- 0xbe3b7aadbee8dbe71f0bfb4640a43dd8aaab59c9
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.28+commit.7893614a
- Optimization
- Enabled
- Creator
- 0x3f96366920…bFf337C9B8
- Creation tx
- 0x55ee405321…fd41960015
Token
Not a token
This contract does not expose ERC-20 metadata.
Read contract (15)
BPS_DENOMINATOR() → uint256
CREATE_MEME_TOKEN_FEE_KEY() → bytes32
CREATOR_FEES_ON_BUYING_KEY() → bytes32
CREATOR_FEES_ON_SELLING_KEY() → bytes32
DEFAULT_MIN_CONTRIBUTION_AMOUNT() → uint256
GRADUATION_FEE_KEY() → bytes32
MAX_TOTAL_CONTRIBUTION() → uint256
MEME_TOKEN_CAP() → uint256
MEME_TOKEN_LIQUIDITY_AMOUNT() → uint256
RUG_FEE_KEY() → bytes32
TRADE_BUY_FEE_KEY() → bytes32
TRADE_SELL_FEE_KEY() → bytes32
printOutputParams(tuple)
toString(uint256) → string
toString(bytes32) → string
ABI
[
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "length",
"type": "uint256"
}
],
"name": "StringsInsufficientHexLength",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "UnauthorizedOrchestrator",
"type": "error"
},
{
"inputs": [],
"name": "BPS_DENOMINATOR",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CREATE_MEME_TOKEN_FEE_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CREATOR_FEES_ON_BUYING_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "CREATOR_FEES_ON_SELLING_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_MIN_CONTRIBUTION_AMOUNT",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GRADUATION_FEE_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_TOTAL_CONTRIBUTION",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MEME_TOKEN_CAP",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MEME_TOKEN_LIQUIDITY_AMOUNT",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RUG_FEE_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TRADE_BUY_FEE_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TRADE_SELL_FEE_KEY",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "initialAdminAndOperator",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveFactoryParams",
"name": "bondingCurveFactoryParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "initialVirtualNative",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "initialVirtualTokens",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxTokensSold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "targetGraduation",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveParams",
"name": "bondingCurveParams",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "A",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "B",
"type": "uint256"
},
{
"internalType": "address",
"name": "wrappedNative",
"type": "address"
},
{
"internalType": "address",
"name": "routerV2",
"type": "address"
},
{
"internalType": "address",
"name": "frothSwapV1Router",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapRouter",
"type": "address"
},
{
"internalType": "uint24",
"name": "frothV3FeeTier",
"type": "uint24"
},
{
"internalType": "address",
"name": "froth",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"components": [
{
"internalType": "uint256",
"name": "mintFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "creatorFeesOnBuyingFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "creatorFeesOnSellingFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tradeBuyFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tradeSellFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "graduationFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rugFee",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeParams",
"name": "feeParams",
"type": "tuple"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "teamWallet",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeDistributorParams",
"name": "feeDistributorParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.SaleMemeTokenManagerParams",
"name": "saleMemeTokenManagerParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"internalType": "address",
"name": "paymentToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "paymentAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "memeExpirationTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minContributionAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxTotalContribution",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothMemeFactoryParams",
"name": "frothMemeFactoryParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.CreatorFeesClaimerParams",
"name": "creatorFeesClaimerParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"internalType": "uint256",
"name": "minNativeAmount",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothBurnerParams",
"name": "frothBurnerParams",
"type": "tuple"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.InputParams",
"name": "_inputParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "bondingCurveFactory",
"type": "address"
},
{
"internalType": "address",
"name": "bondingCurve",
"type": "address"
},
{
"internalType": "address",
"name": "feeDistributor",
"type": "address"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "saleMemeTokenManager",
"type": "address"
},
{
"internalType": "address",
"name": "frothMemeFactory",
"type": "address"
},
{
"internalType": "address",
"name": "creatorFeesClaimer",
"type": "address"
},
{
"internalType": "address",
"name": "frothBurner",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapAdapter",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams",
"name": "_outputParams",
"type": "tuple"
}
],
"name": "configure",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "initialAdminAndOperator",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveFactoryParams",
"name": "bondingCurveFactoryParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "initialVirtualNative",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "initialVirtualTokens",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxTokensSold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "targetGraduation",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveParams",
"name": "bondingCurveParams",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "A",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "B",
"type": "uint256"
},
{
"internalType": "address",
"name": "wrappedNative",
"type": "address"
},
{
"internalType": "address",
"name": "routerV2",
"type": "address"
},
{
"internalType": "address",
"name": "frothSwapV1Router",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapRouter",
"type": "address"
},
{
"internalType": "uint24",
"name": "frothV3FeeTier",
"type": "uint24"
},
{
"internalType": "address",
"name": "froth",
"type": "address"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"components": [
{
"internalType": "uint256",
"name": "mintFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "creatorFeesOnBuyingFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "creatorFeesOnSellingFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tradeBuyFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tradeSellFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "graduationFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rugFee",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeParams",
"name": "feeParams",
"type": "tuple"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "teamWallet",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeDistributorParams",
"name": "feeDistributorParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.SaleMemeTokenManagerParams",
"name": "saleMemeTokenManagerParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"internalType": "address",
"name": "paymentToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "paymentAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "memeExpirationTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minContributionAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxTotalContribution",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothMemeFactoryParams",
"name": "frothMemeFactoryParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.CreatorFeesClaimerParams",
"name": "creatorFeesClaimerParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "finalAdmin",
"type": "address"
},
{
"internalType": "address",
"name": "finalOperator",
"type": "address"
},
{
"internalType": "uint256",
"name": "minNativeAmount",
"type": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothBurnerParams",
"name": "frothBurnerParams",
"type": "tuple"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.InputParams",
"name": "_inputParams",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "bondingCurveFactory",
"type": "address"
},
{
"internalType": "address",
"name": "bondingCurve",
"type": "address"
},
{
"internalType": "address",
"name": "feeDistributor",
"type": "address"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "saleMemeTokenManager",
"type": "address"
},
{
"internalType": "address",
"name": "frothMemeFactory",
"type": "address"
},
{
"internalType": "address",
"name": "creatorFeesClaimer",
"type": "address"
},
{
"internalType": "address",
"name": "frothBurner",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapAdapter",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams",
"name": "_outputParams",
"type": "tuple"
}
],
"name": "deploy",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "bondingCurveFactory",
"type": "address"
},
{
"internalType": "address",
"name": "bondingCurve",
"type": "address"
},
{
"internalType": "address",
"name": "feeDistributor",
"type": "address"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "saleMemeTokenManager",
"type": "address"
},
{
"internalType": "address",
"name": "frothMemeFactory",
"type": "address"
},
{
"internalType": "address",
"name": "creatorFeesClaimer",
"type": "address"
},
{
"internalType": "address",
"name": "frothBurner",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapAdapter",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams",
"name": "",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "bondingCurveFactory",
"type": "address"
},
{
"internalType": "address",
"name": "bondingCurve",
"type": "address"
},
{
"internalType": "address",
"name": "feeDistributor",
"type": "address"
},
{
"internalType": "address",
"name": "twapPool",
"type": "address"
},
{
"internalType": "address",
"name": "saleMemeTokenManager",
"type": "address"
},
{
"internalType": "address",
"name": "frothMemeFactory",
"type": "address"
},
{
"internalType": "address",
"name": "creatorFeesClaimer",
"type": "address"
},
{
"internalType": "address",
"name": "frothBurner",
"type": "address"
},
{
"internalType": "address",
"name": "uniswapV3SwapAdapter",
"type": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams",
"name": "outputParams",
"type": "tuple"
}
],
"name": "printOutputParams",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_uint256",
"type": "uint256"
}
],
"name": "toString",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "_bytes32",
"type": "bytes32"
}
],
"name": "toString",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {console} from "forge-std-1.9.4/src/console.sol";
import {CreatorFeesClaimer} from "../../src/CreatorFeesClaimer.sol";
import {BaseFrothMemeProtocolDeployer} from "./BaseFrothMemeProtocolDeployer.sol";
/// @dev The UniswapV3SwapAdapter and FrothBurner moved to FrothMemeProtocolDeployer05:
/// three embedded creation codes put this deployer over the EIP-170 size limit.
contract FrothMemeProtocolDeployer04 is BaseFrothMemeProtocolDeployer {
function deploy(InputParams memory _inputParams, OutputParams memory _outputParams)
external
override
onlyOrchestrator
returns (OutputParams memory)
{
_outputParams = _deployCreatorFeesClaimer(_inputParams, _outputParams);
return _outputParams;
}
function configure(InputParams calldata _inputParams, OutputParams calldata _outputParams)
external
override
onlyOrchestrator
{
_configureCreatorFeesClaimer(_inputParams, _outputParams);
}
function _deployCreatorFeesClaimer(InputParams memory inputParams, OutputParams memory outputParams)
internal
returns (OutputParams memory)
{
outputParams.creatorFeesClaimer = address(
new CreatorFeesClaimer(
outputParams.saleMemeTokenManager,
inputParams.wrappedNative,
inputParams.initialAdminAndOperator,
inputParams.initialAdminAndOperator
)
);
return outputParams;
}
function _configureCreatorFeesClaimer(InputParams memory inputParams, OutputParams memory outputParams) internal {
CreatorFeesClaimer creatorFeesClaimer = CreatorFeesClaimer(outputParams.creatorFeesClaimer);
creatorFeesClaimer.grantRole(creatorFeesClaimer.FEE_DISTRIBUTOR_ROLE(), outputParams.feeDistributor);
if (inputParams.initialAdminAndOperator != inputParams.creatorFeesClaimerParams.finalOperator) {
creatorFeesClaimer.grantRole(
creatorFeesClaimer.OPERATOR_ROLE(), inputParams.creatorFeesClaimerParams.finalOperator
);
creatorFeesClaimer.revokeRole(creatorFeesClaimer.OPERATOR_ROLE(), inputParams.initialAdminAndOperator);
// Hand the emergency pause lever (CLAIM_FEES) to the final operator; the constructor
// grants PAUSER to the ephemeral deployer.
creatorFeesClaimer.grantRole(
creatorFeesClaimer.PAUSER_ROLE(), inputParams.creatorFeesClaimerParams.finalOperator
);
creatorFeesClaimer.revokeRole(creatorFeesClaimer.PAUSER_ROLE(), inputParams.initialAdminAndOperator);
}
if (inputParams.initialAdminAndOperator != inputParams.creatorFeesClaimerParams.finalAdmin) {
creatorFeesClaimer.grantRole(
creatorFeesClaimer.DEFAULT_ADMIN_ROLE(), inputParams.creatorFeesClaimerParams.finalAdmin
);
creatorFeesClaimer.revokeRole(creatorFeesClaimer.DEFAULT_ADMIN_ROLE(), inputParams.initialAdminAndOperator);
}
}
function printOutputParams(OutputParams memory outputParams) external view {
_printOutputParams(outputParams);
}
}
Chain explorer1226msChain node81ms