编译器
0.8.27+commit.40a35a09
文件 1 的 26:AccessControl.sol
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
文件 2 的 26:AccessControlDefaultAdminRules.sol
pragma solidity ^0.8.20;
import {IAccessControlDefaultAdminRules} from "./IAccessControlDefaultAdminRules.sol";
import {AccessControl, IAccessControl} from "../AccessControl.sol";
import {SafeCast} from "../../utils/math/SafeCast.sol";
import {Math} from "../../utils/math/Math.sol";
import {IERC5313} from "../../interfaces/IERC5313.sol";
abstract contract AccessControlDefaultAdminRules is IAccessControlDefaultAdminRules, IERC5313, AccessControl {
address private _pendingDefaultAdmin;
uint48 private _pendingDefaultAdminSchedule;
uint48 private _currentDelay;
address private _currentDefaultAdmin;
uint48 private _pendingDelay;
uint48 private _pendingDelaySchedule;
constructor(uint48 initialDelay, address initialDefaultAdmin) {
if (initialDefaultAdmin == address(0)) {
revert AccessControlInvalidDefaultAdmin(address(0));
}
_currentDelay = initialDelay;
_grantRole(DEFAULT_ADMIN_ROLE, initialDefaultAdmin);
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlDefaultAdminRules).interfaceId || super.supportsInterface(interfaceId);
}
function owner() public view virtual returns (address) {
return defaultAdmin();
}
function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
if (role == DEFAULT_ADMIN_ROLE) {
revert AccessControlEnforcedDefaultAdminRules();
}
super.grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
if (role == DEFAULT_ADMIN_ROLE) {
revert AccessControlEnforcedDefaultAdminRules();
}
super.revokeRole(role, account);
}
function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
(address newDefaultAdmin, uint48 schedule) = pendingDefaultAdmin();
if (newDefaultAdmin != address(0) || !_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
revert AccessControlEnforcedDefaultAdminDelay(schedule);
}
delete _pendingDefaultAdminSchedule;
}
super.renounceRole(role, account);
}
function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
if (role == DEFAULT_ADMIN_ROLE) {
if (defaultAdmin() != address(0)) {
revert AccessControlEnforcedDefaultAdminRules();
}
_currentDefaultAdmin = account;
}
return super._grantRole(role, account);
}
function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
if (role == DEFAULT_ADMIN_ROLE && account == defaultAdmin()) {
delete _currentDefaultAdmin;
}
return super._revokeRole(role, account);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual override {
if (role == DEFAULT_ADMIN_ROLE) {
revert AccessControlEnforcedDefaultAdminRules();
}
super._setRoleAdmin(role, adminRole);
}
function defaultAdmin() public view virtual returns (address) {
return _currentDefaultAdmin;
}
function pendingDefaultAdmin() public view virtual returns (address newAdmin, uint48 schedule) {
return (_pendingDefaultAdmin, _pendingDefaultAdminSchedule);
}
function defaultAdminDelay() public view virtual returns (uint48) {
uint48 schedule = _pendingDelaySchedule;
return (_isScheduleSet(schedule) && _hasSchedulePassed(schedule)) ? _pendingDelay : _currentDelay;
}
function pendingDefaultAdminDelay() public view virtual returns (uint48 newDelay, uint48 schedule) {
schedule = _pendingDelaySchedule;
return (_isScheduleSet(schedule) && !_hasSchedulePassed(schedule)) ? (_pendingDelay, schedule) : (0, 0);
}
function defaultAdminDelayIncreaseWait() public view virtual returns (uint48) {
return 5 days;
}
function beginDefaultAdminTransfer(address newAdmin) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
_beginDefaultAdminTransfer(newAdmin);
}
function _beginDefaultAdminTransfer(address newAdmin) internal virtual {
uint48 newSchedule = SafeCast.toUint48(block.timestamp) + defaultAdminDelay();
_setPendingDefaultAdmin(newAdmin, newSchedule);
emit DefaultAdminTransferScheduled(newAdmin, newSchedule);
}
function cancelDefaultAdminTransfer() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
_cancelDefaultAdminTransfer();
}
function _cancelDefaultAdminTransfer() internal virtual {
_setPendingDefaultAdmin(address(0), 0);
}
function acceptDefaultAdminTransfer() public virtual {
(address newDefaultAdmin, ) = pendingDefaultAdmin();
if (_msgSender() != newDefaultAdmin) {
revert AccessControlInvalidDefaultAdmin(_msgSender());
}
_acceptDefaultAdminTransfer();
}
function _acceptDefaultAdminTransfer() internal virtual {
(address newAdmin, uint48 schedule) = pendingDefaultAdmin();
if (!_isScheduleSet(schedule) || !_hasSchedulePassed(schedule)) {
revert AccessControlEnforcedDefaultAdminDelay(schedule);
}
_revokeRole(DEFAULT_ADMIN_ROLE, defaultAdmin());
_grantRole(DEFAULT_ADMIN_ROLE, newAdmin);
delete _pendingDefaultAdmin;
delete _pendingDefaultAdminSchedule;
}
function changeDefaultAdminDelay(uint48 newDelay) public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
_changeDefaultAdminDelay(newDelay);
}
function _changeDefaultAdminDelay(uint48 newDelay) internal virtual {
uint48 newSchedule = SafeCast.toUint48(block.timestamp) + _delayChangeWait(newDelay);
_setPendingDelay(newDelay, newSchedule);
emit DefaultAdminDelayChangeScheduled(newDelay, newSchedule);
}
function rollbackDefaultAdminDelay() public virtual onlyRole(DEFAULT_ADMIN_ROLE) {
_rollbackDefaultAdminDelay();
}
function _rollbackDefaultAdminDelay() internal virtual {
_setPendingDelay(0, 0);
}
function _delayChangeWait(uint48 newDelay) internal view virtual returns (uint48) {
uint48 currentDelay = defaultAdminDelay();
return
newDelay > currentDelay
? uint48(Math.min(newDelay, defaultAdminDelayIncreaseWait()))
: currentDelay - newDelay;
}
function _setPendingDefaultAdmin(address newAdmin, uint48 newSchedule) private {
(, uint48 oldSchedule) = pendingDefaultAdmin();
_pendingDefaultAdmin = newAdmin;
_pendingDefaultAdminSchedule = newSchedule;
if (_isScheduleSet(oldSchedule)) {
emit DefaultAdminTransferCanceled();
}
}
function _setPendingDelay(uint48 newDelay, uint48 newSchedule) private {
uint48 oldSchedule = _pendingDelaySchedule;
if (_isScheduleSet(oldSchedule)) {
if (_hasSchedulePassed(oldSchedule)) {
_currentDelay = _pendingDelay;
} else {
emit DefaultAdminDelayChangeCanceled();
}
}
_pendingDelay = newDelay;
_pendingDelaySchedule = newSchedule;
}
function _isScheduleSet(uint48 schedule) private pure returns (bool) {
return schedule != 0;
}
function _hasSchedulePassed(uint48 schedule) private view returns (bool) {
return schedule < block.timestamp;
}
}
文件 3 的 26:AuthorityModel.sol
pragma solidity 0.8.27;
import {AccessControlDefaultAdminRules} from "@openzeppelin/contracts/access/extensions/AccessControlDefaultAdminRules.sol";
contract AuthorityModel is AccessControlDefaultAdminRules {
bytes32 public constant PLATFORM_ADMIN_ROLE =
keccak256("PLATFORM_ADMIN_ROLE");
bytes32 public constant COLLECT_ADMIN_ROLE = keccak256("COLLECT_ADMIN_ROLE");
bytes32 public constant RESCUE_ADMIN_ROLE = keccak256("RESCUE_ADMIN_ROLE");
modifier onlyDefaultAdmin() {
_checkRole(DEFAULT_ADMIN_ROLE);
_;
}
modifier onlyPlatformAdmin() {
_checkRole(PLATFORM_ADMIN_ROLE);
_;
}
modifier onlyCollectAdmin() {
_checkRole(COLLECT_ADMIN_ROLE);
_;
}
modifier onlyRescueAdmin() {
_checkRole(RESCUE_ADMIN_ROLE);
_;
}
constructor(
uint48 initialDelay_,
address initialDefaultAdmin_,
address[] memory initialPlatformAdmins_
) AccessControlDefaultAdminRules(initialDelay_, initialDefaultAdmin_) {
for (uint256 i = 0; i < initialPlatformAdmins_.length; ) {
_grantRole(PLATFORM_ADMIN_ROLE, initialPlatformAdmins_[i]);
unchecked {
++i;
}
}
}
}
文件 4 的 26:BaseFactory.sol
pragma solidity 0.8.27;
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {Decommissionable} from "./Decommissionable.sol";
import {AuthorityModel} from "./AuthorityModel.sol";
import {IBaseFactory} from "./IBaseFactory.sol";
abstract contract BaseFactory is
IBaseFactory,
AuthorityModel,
Decommissionable,
Pausable
{
address internal _singleton;
constructor(
address defaultAdmin_,
address[] memory platformAdmins_,
address singleton_
) AuthorityModel(1 days, defaultAdmin_, platformAdmins_) {
_singleton = singleton_;
}
function setSingleton(address newSingleton_) external onlyPlatformAdmin {
if (newSingleton_ == address(0)) {
revert SingletonCannotBeZeroAddress();
}
address previousSingleton = _singleton;
_singleton = newSingleton_;
emit SingletonUpdated(previousSingleton, newSingleton_);
}
function decommission() external onlyPlatformAdmin {
_decommission();
}
function pause() external onlyPlatformAdmin {
_pause();
}
function unpause() external onlyPlatformAdmin {
_unpause();
}
function singleton() external view returns (address) {
return _singleton;
}
}
文件 5 的 26:Clones.sol
pragma solidity ^0.8.20;
library Clones {
error ERC1167FailedCreateClone();
function clone(address implementation) internal returns (address instance) {
assembly {
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
if (instance == address(0)) {
revert ERC1167FailedCreateClone();
}
}
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
assembly {
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
if (instance == address(0)) {
revert ERC1167FailedCreateClone();
}
}
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly {
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 := keccak256(add(ptr, 0x43), 0x55)
}
}
function predictDeterministicAddress(
address implementation,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddress(implementation, salt, address(this));
}
}
文件 6 的 26:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 7 的 26:Decommissionable.sol
pragma solidity 0.8.27;
abstract contract Decommissionable {
bool private _decommissioned;
event Decommissioned();
error ContractIsDecommissioned();
modifier whenNotDecommissioned() {
if (_decommissioned) {
revert ContractIsDecommissioned();
}
_;
}
function _decommission() internal {
if (_decommissioned) {
revert ContractIsDecommissioned();
}
_decommissioned = true;
emit Decommissioned();
}
function isDecommissioned() public view returns (bool) {
return _decommissioned;
}
}
文件 8 的 26:ECDSA.sol
pragma solidity ^0.8.20;
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS
}
error ECDSAInvalidSignature();
error ECDSAInvalidSignatureLength(uint256 length);
error ECDSAInvalidSignatureS(bytes32 s);
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
}
}
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
_throwError(error, errorArg);
return recovered;
}
function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
unchecked {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
}
function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
_throwError(error, errorArg);
return recovered;
}
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError, bytes32) {
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS, s);
}
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature, bytes32(0));
}
return (signer, RecoverError.NoError, bytes32(0));
}
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
_throwError(error, errorArg);
return recovered;
}
function _throwError(RecoverError error, bytes32 errorArg) private pure {
if (error == RecoverError.NoError) {
return;
} else if (error == RecoverError.InvalidSignature) {
revert ECDSAInvalidSignature();
} else if (error == RecoverError.InvalidSignatureLength) {
revert ECDSAInvalidSignatureLength(uint256(errorArg));
} else if (error == RecoverError.InvalidSignatureS) {
revert ECDSAInvalidSignatureS(errorArg);
}
}
}
文件 9 的 26:ERC165.sol
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 10 的 26:IAccessControl.sol
pragma solidity ^0.8.20;
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
文件 11 的 26:IAccessControlDefaultAdminRules.sol
pragma solidity ^0.8.20;
import {IAccessControl} from "../IAccessControl.sol";
interface IAccessControlDefaultAdminRules is IAccessControl {
error AccessControlInvalidDefaultAdmin(address defaultAdmin);
error AccessControlEnforcedDefaultAdminRules();
error AccessControlEnforcedDefaultAdminDelay(uint48 schedule);
event DefaultAdminTransferScheduled(address indexed newAdmin, uint48 acceptSchedule);
event DefaultAdminTransferCanceled();
event DefaultAdminDelayChangeScheduled(uint48 newDelay, uint48 effectSchedule);
event DefaultAdminDelayChangeCanceled();
function defaultAdmin() external view returns (address);
function pendingDefaultAdmin() external view returns (address newAdmin, uint48 acceptSchedule);
function defaultAdminDelay() external view returns (uint48);
function pendingDefaultAdminDelay() external view returns (uint48 newDelay, uint48 effectSchedule);
function beginDefaultAdminTransfer(address newAdmin) external;
function cancelDefaultAdminTransfer() external;
function acceptDefaultAdminTransfer() external;
function changeDefaultAdminDelay(uint48 newDelay) external;
function rollbackDefaultAdminDelay() external;
function defaultAdminDelayIncreaseWait() external view returns (uint48);
}
文件 12 的 26:IBaseFactory.sol
pragma solidity 0.8.27;
interface IBaseFactory {
error SingletonCannotBeZeroAddress();
event SingletonUpdated(address previousSingleton, address newSingleton);
event ProxyCreated(address indexed proxy);
function setSingleton(address) external;
function singleton() external view returns (address);
}
文件 13 的 26:IERC1271.sol
pragma solidity ^0.8.20;
interface IERC1271 {
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}
文件 14 的 26:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 15 的 26:IERC5313.sol
pragma solidity ^0.8.20;
interface IERC5313 {
function owner() external view returns (address);
}
文件 16 的 26:IMoonThatCommunityLaunch.sol
pragma solidity 0.8.27;
import {IMoonThatUniswapV3Utility} from "../lib/IMoonThatUniswapV3Utility.sol";
interface IMoonThatCommunityLaunch {
enum State {
NotStarted,
Open,
ReadyToEnableTrading,
TradingEnabled,
Refunding
}
struct Contribution {
address participant;
uint256 etherContributed;
uint256 tokensClaimed;
uint256 etherRefunded;
}
struct InitializeParams {
address deployerAddress;
string name;
string symbol;
uint256 etherContributionCap;
uint256 contributionAmount;
uint256 maxDuration;
uint256 enableTradingTimeoutWindow;
}
error StartTimeInPast();
error InvalidContributionAmount();
error ContributionPeriodEnded();
error AlreadyContributed();
error InitialBuyNotExecuted();
error NotContributed();
error NoEtherContributed();
error TransferFailed();
error ContributionPeriodNotEnded();
error AlreadyInitialized();
error ReceiveNotAllowed();
error FallbackNotAllowed();
error ContributionPeriodNotStarted();
error CannotBeZeroAddress();
error TooFewLiquidityRanges();
error OwnableExpired();
error CannotBeZeroBytes32();
error TradingAlreadyEnabled();
error InvalidState(State expected, State actual);
error AlreadyClaimedTokens();
error AlreadyClaimedRefund();
event InitialBuyExecuted(uint256 etherUsed, uint256 tokenProceeds);
event UserContributed(
bytes32 indexed userId,
address indexed participant,
uint256 etherAmount
);
event TokensClaimed(
bytes32 indexed userId,
address indexed participant,
uint256 tokenAmount
);
event TokenCreated(address tokenAddress);
event RefundClaimed(
bytes32 indexed userId,
address indexed participant,
uint256 etherAmount
);
function contributionAmount() external view returns (uint256);
function maxDuration() external view returns (uint256);
function etherContributionCap() external view returns (uint256);
function PLATFORM_TREASURY() external view returns (address);
function PLATFORM_SHARE_OF_CONTRIBUTED_ETHER_BASIS_POINTS()
external
view
returns (uint256);
function MOONTHAT_TOKEN_SINGLETON() external view returns (address);
function totalEtherContributed() external view returns (uint256);
function totalParticipants() external view returns (uint256);
function startTime() external view returns (uint256);
function tokenAddress() external view returns (address);
function tokenProceedsFromInitialBuy() external view returns (uint256);
function moonThatUniswapV3Utility() external view returns (address);
function initialize(InitializeParams memory params_) external;
function endTime() external view returns (uint256);
function hasStarted() external view returns (bool);
function hasEnded() external view returns (bool);
function contribute(
bytes32 userId_,
uint256 messageTimestamp_,
bytes32 messageHash_,
bytes calldata messageSignature_
) external payable;
function claimTokens(bytes32 userId_) external;
function claimRefund(bytes32 userId_) external;
function enableTrading() external;
function rescueERC20(address token_, address to_, uint256 amount_) external;
function rescueETH(address to_, uint256 amount_) external;
}
文件 17 的 26:IMoonThatCommunityLaunchFactory.sol
pragma solidity 0.8.27;
import {IMoonThatUniswapV3Utility} from "../lib/IMoonThatUniswapV3Utility.sol";
import {IBaseFactory} from "../lib/IBaseFactory.sol";
import {LiquidityProfileManager} from "../lib/LiquidityProfileManager.sol";
interface IMoonThatCommunityLaunchFactory is IBaseFactory {
struct MoonThatCommunityLaunchFactoryConstructorParams {
address singleton;
address defaultAdmin;
address[] platformAdmins;
address oracleAddress;
uint256 oracleMessageValidity;
LiquidityProfileManager.LiquidityProfileManagerParams liquidityProfileManagerParams;
uint256 deployCooldownPeriod;
uint256 deployerAllocation;
uint256 contributionAmount;
uint256 maxDuration;
uint256 etherContributionCap;
uint256 tokensToLockup;
uint256 enableTradingTimeoutWindow;
}
error UserInCooldownPeriod();
error InvalidTokenDistribution(bool tokenIsToken0, uint256 totalTokenSupply);
event CommunityLaunchCreated(
address indexed singleton,
bytes32 indexed coinId,
address indexed proxy
);
event DeployCooldownPeriodUpdated(
uint256 previousDeployCooldownPeriod,
uint256 newDeployCooldownPeriod
);
event ContributionAmountUpdated(
uint256 previousContributionAmount,
uint256 newContributionAmount
);
event MaxDurationUpdated(uint256 previousMaxDuration, uint256 newMaxDuration);
event EtherContributionCapUpdated(
uint256 previousEtherContributionCap,
uint256 newEtherContributionCap
);
event DeployerAllocationUpdated(
uint256 previousDeployerAllocation,
uint256 newDeployerAllocation
);
event TokensToLockupUpdated(
uint256 previousTokensToLockup,
uint256 newTokensToLockup
);
event EnableTradingTimeoutWindowUpdated(
uint256 previousEnableTradingTimeoutWindow,
uint256 newEnableTradingTimeoutWindow
);
function createProxy(
string memory name_,
string memory symbol_,
bytes32 coinId_,
bytes32 deployerUserId_,
uint256 messageTimestamp_,
bytes32 messageHash_,
bytes calldata messageSignature_
) external returns (address);
function setDefaultInitialSqrtPriceX96(
uint160 initialSqrtPriceX96AsToken0_,
uint160 initialSqrtPriceX96AsToken1_
) external;
function setDefaultLiquidityRanges(
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken0_,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken1_
) external;
function setDeployCooldownPeriod(uint256 deployCooldownPeriod_) external;
function setDeployerAllocation(uint256 deployerAllocation_) external;
function setTokensToLockup(uint256 tokensToLockup_) external;
function setEtherContributionCap(uint256 etherContributionCap_) external;
function setContributionAmount(uint256 contributionAmount_) external;
function setEnableTradingTimeoutWindow(
uint256 enableTradingTimeoutWindow_
) external;
function userIsInDeployCooldownPeriod(
bytes32 userId_
) external view returns (bool);
function lastDeployByUserId(bytes32 userId_) external view returns (uint256);
function deployerAllocation() external view returns (uint256);
function contributionAmount() external view returns (uint256);
function etherContributionCap() external view returns (uint256);
function maxDuration() external view returns (uint256);
function tokensToLockup() external view returns (uint256);
function enableTradingTimeoutWindow() external view returns (uint256);
}
文件 18 的 26:IMoonThatUniswapV3Utility.sol
pragma solidity 0.8.27;
interface IMoonThatUniswapV3Utility {
error InvalidSqrtPriceX96();
error ReceiveNotAllowed();
error FallbackNotAllowed();
struct UniswapV3LiquidityRange {
int24 tickLower;
int24 tickUpper;
uint256 tokenAmount;
}
function uniswapSwapRouter() external view returns (address);
function uniswapSwapRouter02() external view returns (address);
function uniswapUniversalRouter() external view returns (address);
function uniswapV3NonfungiblePositionManager()
external
view
returns (address);
function moonThatUniswapV3Vault() external view returns (address);
function WETH() external view returns (address);
function uniswapV3Factory() external view returns (address);
function sortedTokens(
address token_
) external view returns (address token0, address token1);
function createUniswapV3Pool(
address token_,
uint24 feeTier_,
uint160 sqrtPriceX96_
) external returns (address uniswapV3Pool);
function getPool(
address token_,
uint24 feeTier_
) external view returns (address);
function calculateUniswapV3PoolAddress(
address token_,
uint24 feeTier_
) external view returns (address);
function feeTiers() external view returns (uint24[] memory);
}
文件 19 的 26:IOracleSigned.sol
pragma solidity 0.8.27;
interface IOracleSigned {
error InvalidOracleSignature();
error MessageHashIntegrityCheckFailed();
error OracleSignatureHasExpired();
error OracleCannotBeZeroAddress();
error OracleMessageValidityCannotBeZero();
event OracleUpdated(address previousOracle, address newOracle);
event OracleMessageValidityUpdated(
uint256 previousOracleMessageValidity,
uint256 newOracleMessageValidity
);
struct SignedMessage {
uint256 messageTimestamp;
bytes32 messageHash;
bytes messageSignature;
}
function oracle() external view returns (address);
function oracleMessageValidity() external view returns (uint256);
function checkValidSignedMessage(
bytes32 derivedMessageHash,
bytes32 messageHash,
bytes calldata messageSignature,
uint256 messageTimestamp
) external view;
}
文件 20 的 26:LiquidityProfileManager.sol
pragma solidity 0.8.27;
import {IMoonThatUniswapV3Utility} from "./IMoonThatUniswapV3Utility.sol";
abstract contract LiquidityProfileManager {
struct LiquidityProfileManagerParams {
uint160 defaultInitialSqrtPriceX96AsToken0;
uint160 defaultInitialSqrtPriceX96AsToken1;
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] defaultLiquidityRangesAsToken0;
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] defaultLiquidityRangesAsToken1;
}
event DefaultInitialSqrtPriceX96Updated(
uint160 previousInitialSqrtPriceX96AsToken0,
uint160 previousInitialSqrtPriceX96AsToken1,
uint160 newInitialSqrtPriceX96AsToken0,
uint160 newInitialSqrtPriceX96AsToken1
);
event DefaultLiquidityRangesUpdated(
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] previousLiquidityRangesAsToken0,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] previousLiquidityRangesAsToken1,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] newLiquidityRangesAsToken0,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] newLiquidityRangesAsToken1
);
uint160 internal _defaultInitialSqrtPriceX96AsToken0;
uint160 internal _defaultInitialSqrtPriceX96AsToken1;
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
internal _defaultLiquidityRangesAsToken0;
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
internal _defaultLiquidityRangesAsToken1;
constructor(LiquidityProfileManagerParams memory params_) {
_setDefaultInitialSqrtPriceX96(
params_.defaultInitialSqrtPriceX96AsToken0,
params_.defaultInitialSqrtPriceX96AsToken1
);
_setDefaultLiquidityRanges(
params_.defaultLiquidityRangesAsToken0,
params_.defaultLiquidityRangesAsToken1
);
}
function defaultInitialSqrtPriceX96AsToken0() public view returns (uint160) {
return _defaultInitialSqrtPriceX96AsToken0;
}
function defaultInitialSqrtPriceX96AsToken1() public view returns (uint160) {
return _defaultInitialSqrtPriceX96AsToken1;
}
function defaultLiquidityRangesAsToken0()
public
view
returns (IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] memory)
{
return _defaultLiquidityRangesAsToken0;
}
function defaultLiquidityRangesAsToken1()
public
view
returns (IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[] memory)
{
return _defaultLiquidityRangesAsToken1;
}
function _setDefaultInitialSqrtPriceX96(
uint160 initialSqrtPriceX96AsToken0_,
uint160 initialSqrtPriceX96AsToken1_
) internal {
uint160 previousInitialSqrtPriceX96AsToken0 = _defaultInitialSqrtPriceX96AsToken0;
uint160 previousInitialSqrtPriceX96AsToken1 = _defaultInitialSqrtPriceX96AsToken1;
_defaultInitialSqrtPriceX96AsToken0 = initialSqrtPriceX96AsToken0_;
_defaultInitialSqrtPriceX96AsToken1 = initialSqrtPriceX96AsToken1_;
emit DefaultInitialSqrtPriceX96Updated(
previousInitialSqrtPriceX96AsToken0,
previousInitialSqrtPriceX96AsToken1,
initialSqrtPriceX96AsToken0_,
initialSqrtPriceX96AsToken1_
);
}
function _setDefaultLiquidityRanges(
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken0_,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken1_
) internal {
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory previousLiquidityRangesAsToken0 = _defaultLiquidityRangesAsToken0;
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory previousLiquidityRangesAsToken1 = _defaultLiquidityRangesAsToken1;
delete _defaultLiquidityRangesAsToken0;
delete _defaultLiquidityRangesAsToken1;
for (uint256 i = 0; i < liquidityRangesAsToken0_.length; ) {
_defaultLiquidityRangesAsToken0.push(liquidityRangesAsToken0_[i]);
unchecked {
++i;
}
}
for (uint256 i = 0; i < liquidityRangesAsToken1_.length; ) {
_defaultLiquidityRangesAsToken1.push(liquidityRangesAsToken1_[i]);
unchecked {
++i;
}
}
emit DefaultLiquidityRangesUpdated(
previousLiquidityRangesAsToken0,
previousLiquidityRangesAsToken1,
liquidityRangesAsToken0_,
liquidityRangesAsToken1_
);
}
}
文件 21 的 26:Math.sol
pragma solidity ^0.8.20;
library Math {
error MathOverflowedMulDiv();
enum Rounding {
Floor,
Ceil,
Trunc,
Expand
}
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
return a / b;
}
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
uint256 prod0 = x * y;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (0 - denominator);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
文件 22 的 26:MoonThatCommunityLaunchFactory.sol
pragma solidity 0.8.27;
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {IMoonThatCommunityLaunch} from "./IMoonThatCommunityLaunch.sol";
import {IMoonThatCommunityLaunchFactory} from "./IMoonThatCommunityLaunchFactory.sol";
import {IMoonThatUniswapV3Utility} from "../lib/IMoonThatUniswapV3Utility.sol";
import {OracleSigned} from "../lib/OracleSigned.sol";
import {LiquidityProfileManager} from "../lib/LiquidityProfileManager.sol";
import {BaseFactory} from "../lib/BaseFactory.sol";
contract MoonThatCommunityLaunchFactory is
IMoonThatCommunityLaunchFactory,
BaseFactory,
OracleSigned,
LiquidityProfileManager
{
uint256 internal constant _TOKEN_TOTAL_SUPPLY = 1_000_000_000 ether;
mapping(bytes32 => uint256) internal _lastDeployByUserId;
uint256 internal _deployCooldownPeriod;
uint256 internal _deployerAllocation;
uint256 internal _tokensToLockup;
uint256 internal _contributionAmount;
uint256 internal _maxDuration;
uint256 internal _etherContributionCap;
uint256 internal _enableTradingTimeoutWindow;
constructor(
MoonThatCommunityLaunchFactoryConstructorParams memory params_
)
BaseFactory(params_.defaultAdmin, params_.platformAdmins, params_.singleton)
OracleSigned(params_.oracleAddress, params_.oracleMessageValidity)
LiquidityProfileManager(params_.liquidityProfileManagerParams)
{
_deployCooldownPeriod = params_.deployCooldownPeriod;
_deployerAllocation = params_.deployerAllocation;
_contributionAmount = params_.contributionAmount;
_maxDuration = params_.maxDuration;
_etherContributionCap = params_.etherContributionCap;
_tokensToLockup = params_.tokensToLockup;
_enableTradingTimeoutWindow = params_.enableTradingTimeoutWindow;
}
function createProxy(
string memory name_,
string memory symbol_,
bytes32 coinId_,
bytes32 deployerUserId_,
uint256 messageTimestamp_,
bytes32 messageHash_,
bytes calldata messageSignature_
) external whenNotPaused whenNotDecommissioned returns (address proxy) {
_checkTokenDistribution();
bytes32 derivedMessageHash = _deriveMessageHash(
deployerUserId_,
coinId_,
messageTimestamp_
);
checkValidSignedMessage(
derivedMessageHash,
messageHash_,
messageSignature_,
messageTimestamp_
);
if (_userIsInDeployCooldownPeriod(deployerUserId_)) {
revert UserInCooldownPeriod();
}
_lastDeployByUserId[deployerUserId_] = block.timestamp;
proxy = Clones.clone(_singleton);
emit ProxyCreated(proxy);
emit CommunityLaunchCreated(_singleton, coinId_, proxy);
IMoonThatCommunityLaunch.InitializeParams
memory initializeParams = IMoonThatCommunityLaunch.InitializeParams({
deployerAddress: msg.sender,
name: name_,
symbol: symbol_,
contributionAmount: _contributionAmount,
maxDuration: _maxDuration,
etherContributionCap: _etherContributionCap,
enableTradingTimeoutWindow: _enableTradingTimeoutWindow
});
IMoonThatCommunityLaunch(proxy).initialize(initializeParams);
}
function lastDeployByUserId(bytes32 userId_) external view returns (uint256) {
return _lastDeployByUserId[userId_];
}
function deployCooldownPeriod() external view returns (uint256) {
return _deployCooldownPeriod;
}
function userIsInDeployCooldownPeriod(
bytes32 userId_
) external view returns (bool) {
return _userIsInDeployCooldownPeriod(userId_);
}
function deployerAllocation() external view returns (uint256) {
return _deployerAllocation;
}
function tokensToLockup() external view returns (uint256) {
return _tokensToLockup;
}
function etherContributionCap() external view returns (uint256) {
return _etherContributionCap;
}
function contributionAmount() external view returns (uint256) {
return _contributionAmount;
}
function maxDuration() external view returns (uint256) {
return _maxDuration;
}
function enableTradingTimeoutWindow() external view returns (uint256) {
return _enableTradingTimeoutWindow;
}
function setOracle(address oracle_) external onlyPlatformAdmin {
_setOracle(oracle_);
}
function setDeployCooldownPeriod(
uint256 deployCooldownPeriod_
) external onlyPlatformAdmin {
uint256 previousDeployCooldownPeriod = _deployCooldownPeriod;
_deployCooldownPeriod = deployCooldownPeriod_;
emit DeployCooldownPeriodUpdated(
previousDeployCooldownPeriod,
deployCooldownPeriod_
);
}
function setMaxDuration(uint256 maxDuration_) external onlyPlatformAdmin {
uint256 previousMaxDuration = _maxDuration;
_maxDuration = maxDuration_;
emit MaxDurationUpdated(previousMaxDuration, maxDuration_);
}
function setDeployerAllocation(
uint256 deployerAllocation_
) external onlyPlatformAdmin {
uint256 previousDeployerAllocation = _deployerAllocation;
_deployerAllocation = deployerAllocation_;
emit DeployerAllocationUpdated(
previousDeployerAllocation,
deployerAllocation_
);
}
function setTokensToLockup(
uint256 tokensToLockup_
) external onlyPlatformAdmin {
uint256 previousTokensToLockup = _tokensToLockup;
_tokensToLockup = tokensToLockup_;
emit TokensToLockupUpdated(previousTokensToLockup, tokensToLockup_);
}
function setEtherContributionCap(
uint256 etherContributionCap_
) external onlyPlatformAdmin {
uint256 previousEtherContributionCap = _etherContributionCap;
_etherContributionCap = etherContributionCap_;
emit EtherContributionCapUpdated(
previousEtherContributionCap,
etherContributionCap_
);
}
function setContributionAmount(
uint256 contributionAmount_
) external onlyPlatformAdmin {
uint256 previousContributionAmount = _contributionAmount;
_contributionAmount = contributionAmount_;
emit ContributionAmountUpdated(
previousContributionAmount,
contributionAmount_
);
}
function setOracleMessageValidity(
uint256 oracleMessageValidity_
) external onlyPlatformAdmin {
_setOracleMessageValidity(oracleMessageValidity_);
}
function setDefaultInitialSqrtPriceX96(
uint160 initialSqrtPriceX96AsToken0_,
uint160 initialSqrtPriceX96AsToken1_
) external onlyPlatformAdmin {
_setDefaultInitialSqrtPriceX96(
initialSqrtPriceX96AsToken0_,
initialSqrtPriceX96AsToken1_
);
}
function setDefaultLiquidityRanges(
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken0_,
IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]
memory liquidityRangesAsToken1_
) external onlyPlatformAdmin {
_setDefaultLiquidityRanges(
liquidityRangesAsToken0_,
liquidityRangesAsToken1_
);
}
function setEnableTradingTimeoutWindow(
uint256 enableTradingTimeoutWindow_
) external onlyPlatformAdmin {
uint256 previousEnableTradingTimeoutWindow = _enableTradingTimeoutWindow;
_enableTradingTimeoutWindow = enableTradingTimeoutWindow_;
emit EnableTradingTimeoutWindowUpdated(
previousEnableTradingTimeoutWindow,
enableTradingTimeoutWindow_
);
}
function _deriveMessageHash(
bytes32 deployerUserId_,
bytes32 coinId_,
uint256 messageTimestamp_
) internal view returns (bytes32) {
return
keccak256(
abi.encode(
msg.sender,
deployerUserId_,
address(this),
coinId_,
messageTimestamp_
)
);
}
function _userIsInDeployCooldownPeriod(
bytes32 userId_
) internal view returns (bool) {
return
_lastDeployByUserId[userId_] + _deployCooldownPeriod > block.timestamp;
}
function _checkTokenDistribution() internal view {
uint256 totalLiquidityAsToken0 = 0;
for (uint256 i = 0; i < _defaultLiquidityRangesAsToken0.length; ) {
totalLiquidityAsToken0 += _defaultLiquidityRangesAsToken0[i].tokenAmount;
unchecked {
++i;
}
}
uint256 totalLiquidityAsToken1 = 0;
for (uint256 i = 0; i < _defaultLiquidityRangesAsToken1.length; ) {
totalLiquidityAsToken1 += _defaultLiquidityRangesAsToken1[i].tokenAmount;
unchecked {
++i;
}
}
uint256 totalTokenSupplyAsToken0 = totalLiquidityAsToken0 +
_deployerAllocation +
_tokensToLockup;
if (_TOKEN_TOTAL_SUPPLY != totalTokenSupplyAsToken0) {
revert InvalidTokenDistribution(true, totalTokenSupplyAsToken0);
}
uint256 totalTokenSupplyAsToken1 = totalLiquidityAsToken1 +
_deployerAllocation +
_tokensToLockup;
if (_TOKEN_TOTAL_SUPPLY != totalTokenSupplyAsToken1) {
revert InvalidTokenDistribution(false, totalTokenSupplyAsToken1);
}
}
}
文件 23 的 26:OracleSigned.sol
pragma solidity 0.8.27;
import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
import {IOracleSigned} from "./IOracleSigned.sol";
abstract contract OracleSigned is IOracleSigned {
address private _oracle;
uint256 private _oracleMessageValidity;
constructor(address oracle_, uint256 oracleMessageValidity_) {
_setOracle(oracle_);
_setOracleMessageValidity(oracleMessageValidity_);
}
function checkValidSignedMessage(
bytes32 derivedMessageHash_,
bytes32 providedMessageHash_,
bytes memory messageSignature_,
uint256 messageTimestamp_
) public view {
_checkValidSignature(derivedMessageHash_, messageSignature_);
_checkSignatureExpiry(messageTimestamp_);
_checkMessageHashIntegrity(derivedMessageHash_, providedMessageHash_);
}
function oracle() public view returns (address) {
return _oracle;
}
function oracleMessageValidity() public view returns (uint256) {
return _oracleMessageValidity;
}
function _setOracle(address newOracle_) internal {
if (newOracle_ == address(0)) {
revert OracleCannotBeZeroAddress();
}
address previousOracle = _oracle;
_oracle = newOracle_;
emit OracleUpdated(previousOracle, newOracle_);
}
function _setOracleMessageValidity(
uint256 newOracleMessageValidity_
) internal {
if (newOracleMessageValidity_ == 0) {
revert OracleMessageValidityCannotBeZero();
}
uint256 previousOracleMessageValidity = _oracleMessageValidity;
_oracleMessageValidity = newOracleMessageValidity_;
emit OracleMessageValidityUpdated(
previousOracleMessageValidity,
newOracleMessageValidity_
);
}
function _isValidSignature(
bytes32 messageHash_,
bytes memory messageSignature_
) private view returns (bool) {
bytes32 signedMessageHash = keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash_)
);
return (
SignatureChecker.isValidSignatureNow(
_oracle,
signedMessageHash,
messageSignature_
)
);
}
function _checkValidSignature(
bytes32 messageHash_,
bytes memory messageSignature_
) private view {
if (!_isValidSignature(messageHash_, messageSignature_)) {
revert InvalidOracleSignature();
}
}
function _checkSignatureExpiry(uint256 messageTimestamp_) private view {
if (messageTimestamp_ + _oracleMessageValidity < block.timestamp) {
revert OracleSignatureHasExpired();
}
}
function _checkMessageHashIntegrity(
bytes32 generatedMessageHash_,
bytes32 expectedMessageHash_
) private pure {
if (generatedMessageHash_ != expectedMessageHash_) {
revert MessageHashIntegrityCheckFailed();
}
}
}
文件 24 的 26:Pausable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Pausable is Context {
bool private _paused;
event Paused(address account);
event Unpaused(address account);
error EnforcedPause();
error ExpectedPause();
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 25 的 26:SafeCast.sol
pragma solidity ^0.8.20;
library SafeCast {
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
error SafeCastOverflowedIntToUint(int256 value);
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
error SafeCastOverflowedUintToInt(uint256 value);
function toUint248(uint256 value) internal pure returns (uint248) {
if (value > type(uint248).max) {
revert SafeCastOverflowedUintDowncast(248, value);
}
return uint248(value);
}
function toUint240(uint256 value) internal pure returns (uint240) {
if (value > type(uint240).max) {
revert SafeCastOverflowedUintDowncast(240, value);
}
return uint240(value);
}
function toUint232(uint256 value) internal pure returns (uint232) {
if (value > type(uint232).max) {
revert SafeCastOverflowedUintDowncast(232, value);
}
return uint232(value);
}
function toUint224(uint256 value) internal pure returns (uint224) {
if (value > type(uint224).max) {
revert SafeCastOverflowedUintDowncast(224, value);
}
return uint224(value);
}
function toUint216(uint256 value) internal pure returns (uint216) {
if (value > type(uint216).max) {
revert SafeCastOverflowedUintDowncast(216, value);
}
return uint216(value);
}
function toUint208(uint256 value) internal pure returns (uint208) {
if (value > type(uint208).max) {
revert SafeCastOverflowedUintDowncast(208, value);
}
return uint208(value);
}
function toUint200(uint256 value) internal pure returns (uint200) {
if (value > type(uint200).max) {
revert SafeCastOverflowedUintDowncast(200, value);
}
return uint200(value);
}
function toUint192(uint256 value) internal pure returns (uint192) {
if (value > type(uint192).max) {
revert SafeCastOverflowedUintDowncast(192, value);
}
return uint192(value);
}
function toUint184(uint256 value) internal pure returns (uint184) {
if (value > type(uint184).max) {
revert SafeCastOverflowedUintDowncast(184, value);
}
return uint184(value);
}
function toUint176(uint256 value) internal pure returns (uint176) {
if (value > type(uint176).max) {
revert SafeCastOverflowedUintDowncast(176, value);
}
return uint176(value);
}
function toUint168(uint256 value) internal pure returns (uint168) {
if (value > type(uint168).max) {
revert SafeCastOverflowedUintDowncast(168, value);
}
return uint168(value);
}
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) {
revert SafeCastOverflowedUintDowncast(160, value);
}
return uint160(value);
}
function toUint152(uint256 value) internal pure returns (uint152) {
if (value > type(uint152).max) {
revert SafeCastOverflowedUintDowncast(152, value);
}
return uint152(value);
}
function toUint144(uint256 value) internal pure returns (uint144) {
if (value > type(uint144).max) {
revert SafeCastOverflowedUintDowncast(144, value);
}
return uint144(value);
}
function toUint136(uint256 value) internal pure returns (uint136) {
if (value > type(uint136).max) {
revert SafeCastOverflowedUintDowncast(136, value);
}
return uint136(value);
}
function toUint128(uint256 value) internal pure returns (uint128) {
if (value > type(uint128).max) {
revert SafeCastOverflowedUintDowncast(128, value);
}
return uint128(value);
}
function toUint120(uint256 value) internal pure returns (uint120) {
if (value > type(uint120).max) {
revert SafeCastOverflowedUintDowncast(120, value);
}
return uint120(value);
}
function toUint112(uint256 value) internal pure returns (uint112) {
if (value > type(uint112).max) {
revert SafeCastOverflowedUintDowncast(112, value);
}
return uint112(value);
}
function toUint104(uint256 value) internal pure returns (uint104) {
if (value > type(uint104).max) {
revert SafeCastOverflowedUintDowncast(104, value);
}
return uint104(value);
}
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) {
revert SafeCastOverflowedUintDowncast(96, value);
}
return uint96(value);
}
function toUint88(uint256 value) internal pure returns (uint88) {
if (value > type(uint88).max) {
revert SafeCastOverflowedUintDowncast(88, value);
}
return uint88(value);
}
function toUint80(uint256 value) internal pure returns (uint80) {
if (value > type(uint80).max) {
revert SafeCastOverflowedUintDowncast(80, value);
}
return uint80(value);
}
function toUint72(uint256 value) internal pure returns (uint72) {
if (value > type(uint72).max) {
revert SafeCastOverflowedUintDowncast(72, value);
}
return uint72(value);
}
function toUint64(uint256 value) internal pure returns (uint64) {
if (value > type(uint64).max) {
revert SafeCastOverflowedUintDowncast(64, value);
}
return uint64(value);
}
function toUint56(uint256 value) internal pure returns (uint56) {
if (value > type(uint56).max) {
revert SafeCastOverflowedUintDowncast(56, value);
}
return uint56(value);
}
function toUint48(uint256 value) internal pure returns (uint48) {
if (value > type(uint48).max) {
revert SafeCastOverflowedUintDowncast(48, value);
}
return uint48(value);
}
function toUint40(uint256 value) internal pure returns (uint40) {
if (value > type(uint40).max) {
revert SafeCastOverflowedUintDowncast(40, value);
}
return uint40(value);
}
function toUint32(uint256 value) internal pure returns (uint32) {
if (value > type(uint32).max) {
revert SafeCastOverflowedUintDowncast(32, value);
}
return uint32(value);
}
function toUint24(uint256 value) internal pure returns (uint24) {
if (value > type(uint24).max) {
revert SafeCastOverflowedUintDowncast(24, value);
}
return uint24(value);
}
function toUint16(uint256 value) internal pure returns (uint16) {
if (value > type(uint16).max) {
revert SafeCastOverflowedUintDowncast(16, value);
}
return uint16(value);
}
function toUint8(uint256 value) internal pure returns (uint8) {
if (value > type(uint8).max) {
revert SafeCastOverflowedUintDowncast(8, value);
}
return uint8(value);
}
function toUint256(int256 value) internal pure returns (uint256) {
if (value < 0) {
revert SafeCastOverflowedIntToUint(value);
}
return uint256(value);
}
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(248, value);
}
}
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(240, value);
}
}
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(232, value);
}
}
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(224, value);
}
}
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(216, value);
}
}
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(208, value);
}
}
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(200, value);
}
}
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(192, value);
}
}
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(184, value);
}
}
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(176, value);
}
}
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(168, value);
}
}
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(160, value);
}
}
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(152, value);
}
}
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(144, value);
}
}
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(136, value);
}
}
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(128, value);
}
}
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(120, value);
}
}
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(112, value);
}
}
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(104, value);
}
}
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(96, value);
}
}
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(88, value);
}
}
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(80, value);
}
}
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(72, value);
}
}
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(64, value);
}
}
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(56, value);
}
}
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(48, value);
}
}
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(40, value);
}
}
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(32, value);
}
}
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(24, value);
}
}
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(16, value);
}
}
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(8, value);
}
}
function toInt256(uint256 value) internal pure returns (int256) {
if (value > uint256(type(int256).max)) {
revert SafeCastOverflowedUintToInt(value);
}
return int256(value);
}
}
文件 26 的 26:SignatureChecker.sol
pragma solidity ^0.8.20;
import {ECDSA} from "./ECDSA.sol";
import {IERC1271} from "../../interfaces/IERC1271.sol";
library SignatureChecker {
function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {
(address recovered, ECDSA.RecoverError error, ) = ECDSA.tryRecover(hash, signature);
return
(error == ECDSA.RecoverError.NoError && recovered == signer) ||
isValidERC1271SignatureNow(signer, hash, signature);
}
function isValidERC1271SignatureNow(
address signer,
bytes32 hash,
bytes memory signature
) internal view returns (bool) {
(bool success, bytes memory result) = signer.staticcall(
abi.encodeCall(IERC1271.isValidSignature, (hash, signature))
);
return (success &&
result.length >= 32 &&
abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));
}
}
{
"compilationTarget": {
"contracts/launch/MoonThatCommunityLaunchFactory.sol": "MoonThatCommunityLaunchFactory"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"components":[{"internalType":"address","name":"singleton","type":"address"},{"internalType":"address","name":"defaultAdmin","type":"address"},{"internalType":"address[]","name":"platformAdmins","type":"address[]"},{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"uint256","name":"oracleMessageValidity","type":"uint256"},{"components":[{"internalType":"uint160","name":"defaultInitialSqrtPriceX96AsToken0","type":"uint160"},{"internalType":"uint160","name":"defaultInitialSqrtPriceX96AsToken1","type":"uint160"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"defaultLiquidityRangesAsToken0","type":"tuple[]"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"defaultLiquidityRangesAsToken1","type":"tuple[]"}],"internalType":"struct LiquidityProfileManager.LiquidityProfileManagerParams","name":"liquidityProfileManagerParams","type":"tuple"},{"internalType":"uint256","name":"deployCooldownPeriod","type":"uint256"},{"internalType":"uint256","name":"deployerAllocation","type":"uint256"},{"internalType":"uint256","name":"contributionAmount","type":"uint256"},{"internalType":"uint256","name":"maxDuration","type":"uint256"},{"internalType":"uint256","name":"etherContributionCap","type":"uint256"},{"internalType":"uint256","name":"tokensToLockup","type":"uint256"},{"internalType":"uint256","name":"enableTradingTimeoutWindow","type":"uint256"}],"internalType":"struct IMoonThatCommunityLaunchFactory.MoonThatCommunityLaunchFactoryConstructorParams","name":"params_","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"uint48","name":"schedule","type":"uint48"}],"name":"AccessControlEnforcedDefaultAdminDelay","type":"error"},{"inputs":[],"name":"AccessControlEnforcedDefaultAdminRules","type":"error"},{"inputs":[{"internalType":"address","name":"defaultAdmin","type":"address"}],"name":"AccessControlInvalidDefaultAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ContractIsDecommissioned","type":"error"},{"inputs":[],"name":"ERC1167FailedCreateClone","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidOracleSignature","type":"error"},{"inputs":[{"internalType":"bool","name":"tokenIsToken0","type":"bool"},{"internalType":"uint256","name":"totalTokenSupply","type":"uint256"}],"name":"InvalidTokenDistribution","type":"error"},{"inputs":[],"name":"MessageHashIntegrityCheckFailed","type":"error"},{"inputs":[],"name":"OracleCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"OracleMessageValidityCannotBeZero","type":"error"},{"inputs":[],"name":"OracleSignatureHasExpired","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[],"name":"SingletonCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"UserInCooldownPeriod","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"singleton","type":"address"},{"indexed":true,"internalType":"bytes32","name":"coinId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"proxy","type":"address"}],"name":"CommunityLaunchCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousContributionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newContributionAmount","type":"uint256"}],"name":"ContributionAmountUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Decommissioned","type":"event"},{"anonymous":false,"inputs":[],"name":"DefaultAdminDelayChangeCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint48","name":"newDelay","type":"uint48"},{"indexed":false,"internalType":"uint48","name":"effectSchedule","type":"uint48"}],"name":"DefaultAdminDelayChangeScheduled","type":"event"},{"anonymous":false,"inputs":[],"name":"DefaultAdminTransferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint48","name":"acceptSchedule","type":"uint48"}],"name":"DefaultAdminTransferScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"previousInitialSqrtPriceX96AsToken0","type":"uint160"},{"indexed":false,"internalType":"uint160","name":"previousInitialSqrtPriceX96AsToken1","type":"uint160"},{"indexed":false,"internalType":"uint160","name":"newInitialSqrtPriceX96AsToken0","type":"uint160"},{"indexed":false,"internalType":"uint160","name":"newInitialSqrtPriceX96AsToken1","type":"uint160"}],"name":"DefaultInitialSqrtPriceX96Updated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"indexed":false,"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"previousLiquidityRangesAsToken0","type":"tuple[]"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"indexed":false,"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"previousLiquidityRangesAsToken1","type":"tuple[]"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"indexed":false,"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"newLiquidityRangesAsToken0","type":"tuple[]"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"indexed":false,"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"newLiquidityRangesAsToken1","type":"tuple[]"}],"name":"DefaultLiquidityRangesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousDeployCooldownPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeployCooldownPeriod","type":"uint256"}],"name":"DeployCooldownPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousDeployerAllocation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeployerAllocation","type":"uint256"}],"name":"DeployerAllocationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousEnableTradingTimeoutWindow","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEnableTradingTimeoutWindow","type":"uint256"}],"name":"EnableTradingTimeoutWindowUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousEtherContributionCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEtherContributionCap","type":"uint256"}],"name":"EtherContributionCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMaxDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxDuration","type":"uint256"}],"name":"MaxDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousOracleMessageValidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newOracleMessageValidity","type":"uint256"}],"name":"OracleMessageValidityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"OracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxy","type":"address"}],"name":"ProxyCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousSingleton","type":"address"},{"indexed":false,"internalType":"address","name":"newSingleton","type":"address"}],"name":"SingletonUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousTokensToLockup","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokensToLockup","type":"uint256"}],"name":"TokensToLockupUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"COLLECT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PLATFORM_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESCUE_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptDefaultAdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"beginDefaultAdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelDefaultAdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"newDelay","type":"uint48"}],"name":"changeDefaultAdminDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"derivedMessageHash_","type":"bytes32"},{"internalType":"bytes32","name":"providedMessageHash_","type":"bytes32"},{"internalType":"bytes","name":"messageSignature_","type":"bytes"},{"internalType":"uint256","name":"messageTimestamp_","type":"uint256"}],"name":"checkValidSignedMessage","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contributionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"bytes32","name":"coinId_","type":"bytes32"},{"internalType":"bytes32","name":"deployerUserId_","type":"bytes32"},{"internalType":"uint256","name":"messageTimestamp_","type":"uint256"},{"internalType":"bytes32","name":"messageHash_","type":"bytes32"},{"internalType":"bytes","name":"messageSignature_","type":"bytes"}],"name":"createProxy","outputs":[{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultAdminDelay","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultAdminDelayIncreaseWait","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultInitialSqrtPriceX96AsToken0","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultInitialSqrtPriceX96AsToken1","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultLiquidityRangesAsToken0","outputs":[{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultLiquidityRangesAsToken1","outputs":[{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployCooldownPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployerAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTradingTimeoutWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"etherContributionCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDecommissioned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"userId_","type":"bytes32"}],"name":"lastDeployByUserId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleMessageValidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingDefaultAdmin","outputs":[{"internalType":"address","name":"newAdmin","type":"address"},{"internalType":"uint48","name":"schedule","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingDefaultAdminDelay","outputs":[{"internalType":"uint48","name":"newDelay","type":"uint48"},{"internalType":"uint48","name":"schedule","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rollbackDefaultAdminDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"contributionAmount_","type":"uint256"}],"name":"setContributionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"initialSqrtPriceX96AsToken0_","type":"uint160"},{"internalType":"uint160","name":"initialSqrtPriceX96AsToken1_","type":"uint160"}],"name":"setDefaultInitialSqrtPriceX96","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"liquidityRangesAsToken0_","type":"tuple[]"},{"components":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"internalType":"struct IMoonThatUniswapV3Utility.UniswapV3LiquidityRange[]","name":"liquidityRangesAsToken1_","type":"tuple[]"}],"name":"setDefaultLiquidityRanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deployCooldownPeriod_","type":"uint256"}],"name":"setDeployCooldownPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deployerAllocation_","type":"uint256"}],"name":"setDeployerAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"enableTradingTimeoutWindow_","type":"uint256"}],"name":"setEnableTradingTimeoutWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"etherContributionCap_","type":"uint256"}],"name":"setEtherContributionCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxDuration_","type":"uint256"}],"name":"setMaxDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracle_","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oracleMessageValidity_","type":"uint256"}],"name":"setOracleMessageValidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSingleton_","type":"address"}],"name":"setSingleton","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensToLockup_","type":"uint256"}],"name":"setTokensToLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singleton","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToLockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"userId_","type":"bytes32"}],"name":"userIsInDeployCooldownPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]