Source Code
Latest 20 from a total of 20 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create Campaign | 47571442 | 131 days ago | IN | 0 S | 0.06301053 | ||||
| Create Campaign | 47568472 | 131 days ago | IN | 0 S | 0.06301053 | ||||
| Create Campaign | 47568399 | 131 days ago | IN | 0 S | 0.0095854 | ||||
| Create Campaign | 47568364 | 131 days ago | IN | 0 S | 0.0095854 | ||||
| Create Campaign | 47552535 | 131 days ago | IN | 0 S | 0.06301053 | ||||
| Create Campaign | 47490556 | 132 days ago | IN | 0 S | 0.06296235 | ||||
| Create Campaign | 47484598 | 132 days ago | IN | 0 S | 0.06296235 | ||||
| Create Campaign | 47288671 | 134 days ago | IN | 0 S | 0.06309198 | ||||
| Create Campaign | 47279591 | 134 days ago | IN | 0 S | 0.06309198 | ||||
| Create Campaign | 47252410 | 134 days ago | IN | 0 S | 0.06309198 | ||||
| Create Campaign | 46392185 | 142 days ago | IN | 0 S | 0.06309198 | ||||
| Create Campaign | 45531384 | 149 days ago | IN | 0 S | 0.06309198 | ||||
| Create Campaign | 45531209 | 149 days ago | IN | 0 S | 0.06309242 | ||||
| Create Campaign | 45487589 | 150 days ago | IN | 0 S | 0.06497298 | ||||
| Set Creator Appr... | 45487306 | 150 days ago | IN | 0 S | 0.00267168 | ||||
| Set Creator Cap ... | 45485847 | 150 days ago | IN | 0 S | 0.01459117 | ||||
| Set Tiers | 45485839 | 150 days ago | IN | 0 S | 0.01331841 | ||||
| Update Config | 45485836 | 150 days ago | IN | 0 S | 0.01298979 | ||||
| Set Campaign Imp... | 45485832 | 150 days ago | IN | 0 S | 0.00277491 | ||||
| Set Aux Factorie... | 45485827 | 150 days ago | IN | 0 S | 0.00416867 |
Latest 12 internal transactions
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 47571442 | 131 days ago | Contract Creation | 0 S | |||
| 47568472 | 131 days ago | Contract Creation | 0 S | |||
| 47552535 | 131 days ago | Contract Creation | 0 S | |||
| 47490556 | 132 days ago | Contract Creation | 0 S | |||
| 47484598 | 132 days ago | Contract Creation | 0 S | |||
| 47288671 | 134 days ago | Contract Creation | 0 S | |||
| 47279591 | 134 days ago | Contract Creation | 0 S | |||
| 47252410 | 134 days ago | Contract Creation | 0 S | |||
| 46392185 | 142 days ago | Contract Creation | 0 S | |||
| 45531384 | 149 days ago | Contract Creation | 0 S | |||
| 45531209 | 149 days ago | Contract Creation | 0 S | |||
| 45487589 | 150 days ago | Contract Creation | 0 S |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BurnToFunFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 999 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import { Clones } from "@openzeppelin/contracts/proxy/Clones.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/// Minimal veFIVE interface for gating public creators
interface IMasterFarmer {
function getVeFive(address user, uint256 timestamp) external view returns (uint256);
function getVeFivePower(address user, uint256 timestamp) external view returns (uint256);
}
/// Campaign clone initializer interface (must match the clone's initializer)
interface IBurnToFunCampaign {
struct Tier {
uint256 veFiveThreshold; // required veFIVE
uint256 maxBurnAmount; // absolute FIVE limit for this tier (wei)
uint256 bonusMultiplier;
}
function initialize(
address factory,
address creator,
address fiveToken,
address masterFarmer,
address deFiveRouter,
uint256 baseBurnRatio,
uint256 startTime,
uint256 endTime,
uint256 softCap,
uint256 hardCap,
uint256 creatorTokenPercent,
uint256 devPercent,
uint256 lpTokenPercent,
uint256 lpFivePercent,
string calldata tokenName,
string calldata tokenSymbol,
string calldata metadataURI,
Tier[] calldata tiers,
uint256 campaignId,
uint256 vestingCliff,
uint256 vestingEnd,
bytes calldata extraInitData
) external;
}
/// Token/Vesting factories (admin-gated `setAuthorizedCampaign`)
interface IBurnToFunTokenFactory {
function setAuthorizedCampaign(address campaign, bool authorized) external;
function predictTokenAddress(address campaign) external view returns (address);
}
interface IBurnToFunVestingFactory {
function setAuthorizedCampaign(address campaign, bool authorized) external;
function predictVestingAddress(address campaign) external view returns (address);
}
/// @title BurnToFunFactory
/// @notice Deploys deterministic campaign clones (CREATE2), validates params/names,
/// converts tier percents to absolute burn caps, and authorizes the new
/// campaign in the Token/Vesting factories.
contract BurnToFunFactory is ReentrancyGuard {
using Clones for address;
// ----------------- Errors -----------------
error InvalidParams();
error NotAdmin();
error NotDev();
error NotAuthorized();
error InvalidTierConfig();
error InvalidCreatorCapLevelConfig();
error NoCreatorCapLevelConfigured();
error InvalidName();
error InvalidSymbol();
error InvalidMetadataURI();
error InvalidTokenomics();
error SymbolAlreadyUsed();
error InvalidAddress();
error Paused();
error ImplementationNotSet();
error FactoriesNotSet();
error CloneAddressMismatch();
error TransferFailed();
error NotCampaign();
// ----------------- Events -----------------
event FactoryBootstrapped(
address admin,
address devTreasury,
uint256 devPercent,
bool publicCreationEnabled,
bool paused,
address fiveToken,
address masterFarmer,
address deFiveRouter,
address tokenFactory,
address vestingFactory,
uint256 campaignNonce,
uint256 successfulCampaignNonce
);
event CampaignCreated(
uint256 id,
uint8 indexed kind,
address indexed campaign,
address indexed creator,
// --- router ---
address deFiveRouter,
// --- timing ---
uint256 startTime,
uint256 endTime,
uint256 vestingCliff,
uint256 vestingEnd,
// --- caps & ratios ---
uint256 softCap,
uint256 hardCap,
uint256 baseBurnRatio,
// --- tokenomics ---
uint256 creatorTokenPercent,
uint256 devPercent,
uint256 lpTokenPercent,
uint256 lpFivePercent,
// --- token meta ---
string tokenName,
string tokenSymbol,
string metadataURI,
// --- predictions ---
address predictedToken,
address predictedVesting,
// --- passthrough ---
bytes extraInitData
);
event TiersConfiguredSnapshot(
uint256[] veFiveThresholds,
uint256[] maxPercents,
uint256[] bonusMultipliers,
uint256 tiersLength,
bytes32 tiersHash
);
event CreatorCapLevelsConfiguredSnapshot(
uint256[] minSuccesses,
uint256[] maxCreatorPercents,
uint256 levelsLength,
bytes32 levelsHash
);
event CampaignTiersSnapshot(
uint256 indexed id,
address indexed campaign,
uint256[] veFiveThresholds,
uint256[] maxBurnAmounts,
uint256[] bonusMultipliers,
uint256 tiersLength
);
event ConfigUpdated(Config newConfig);
event AdminChanged(address newAdmin);
event CreatorAccessChanged(address indexed user, bool isApproved);
event PublicCreationToggled(bool enabled);
event FactoryPaused(bool status);
event CoreContractsUpdated(address fiveToken, address masterFarmer, address deFiveRouter);
event AuxFactoriesUpdated(address tokenFactory, address vestingFactory);
event CampaignImplementationUpdated(uint8 indexed kind, address implementation);
event UserContributionRecorded(address indexed campaign, address indexed user, uint256 amount);
event CreatorContributionRecorded(address indexed campaign, address indexed creator, uint256 amount);
event DevTreasuryUpdated(address indexed treasury, uint256 percent);
event DevTokensClaimed(address indexed token, uint256 amount, address indexed to);
event NativeSwept(address indexed to, uint256 amount);
// ----------------- Structs -----------------
struct Config {
uint256 minStartDelay;
uint256 maxStartDelay;
uint256 minDuration;
uint256 maxDuration;
uint256 lpTokenPercent;
uint256 lpRatio; // (token:five)
uint256 goal; // default target used in tier cap calc
uint256 requiredVeBalance; // gate for public creation
uint256 requiredVePower; // gate for public creation
uint256 vestingCliff; // relative seconds
uint256 vestingEnd; // relative seconds
}
/// Factory tier config (percentages)
struct TierConfig {
uint256 veFiveThreshold;
uint256 maxPercent;
uint256 bonusMultiplier;
}
/// dynamic creator cap tiers
struct CreatorCapLevel {
uint256 minSuccesses; // inclusive threshold
uint256 maxCreatorPercent; // 1e18 = 100%, MUST be <= MAX_CREATOR_PCT (10%)
}
// ----------------- Constants -----------------
uint256 private constant ONE = 1e18;
uint256 private constant MAX_DEV_PCT = 1e16;
uint256 private constant MAX_OTHER_PCT = 8e17;
uint256 private constant MAX_CREATOR_PCT = 1e17;
// ----------------- State -----------------
address public admin;
address public devTreasury;
// share for devs per campaign
uint256 public devPercent;
// core external contracts
address public fiveToken;
address public masterFarmer;
address public deFiveRouter;
// aux factories (must grant this factory admin on both)
IBurnToFunTokenFactory public tokenFactory;
IBurnToFunVestingFactory public vestingFactory;
// campaign clone implementations
mapping(uint8 => address) public implementationOfKind; // kind => impl
// config & tiers
Config public config;
TierConfig[] public tiers;
CreatorCapLevel[] public creatorCapLevels;
// creator gating
bool public publicCreationEnabled = false;
mapping(address => bool) public approvedCreators;
// status & registry
bool public paused;
uint256 public campaignNonce;
uint256 public successfulCampaignNonce;
mapping(uint256 => address) public campaigns;
mapping(address => bool) public isCampaign;
mapping(address => address[]) private creatorCampaigns;
mapping(address => mapping(address => uint256)) private creatorCampaignAmount;
mapping(address => uint256) private creatorSuccessfulCampaignsCount;
mapping(address => address[]) private userCampaigns; // user => successful campaigns they claimed (recorded on claim by campaign)
mapping(address => mapping(address => uint256)) private userCampaignAmount; // user => campaign => burned amount (0 if refunded)
mapping(string => bool) private usedSymbols;
// ----------------- Constructor -----------------
constructor(address _fiveToken, address _masterFarmer, address _deFiveRouter) {
if (_fiveToken == address(0) || _masterFarmer == address(0) || _deFiveRouter == address(0)) {
revert InvalidAddress();
}
admin = msg.sender;
devTreasury = msg.sender;
devPercent = MAX_DEV_PCT;
fiveToken = _fiveToken;
masterFarmer = _masterFarmer;
deFiveRouter = _deFiveRouter;
emit FactoryBootstrapped(
admin,
devTreasury,
devPercent,
publicCreationEnabled,
paused,
fiveToken,
masterFarmer,
deFiveRouter,
address(tokenFactory),
address(vestingFactory),
campaignNonce,
successfulCampaignNonce
);
}
// ----------------- Modifiers -----------------
modifier onlyAdmin() {
if (msg.sender != admin) revert NotAdmin();
_;
}
modifier onlyDev() {
if (msg.sender != devTreasury) revert NotDev();
_;
}
modifier onlyAuthorizedCreator() {
if (!publicCreationEnabled) {
if (!approvedCreators[msg.sender]) revert NotAuthorized();
} else {
if (!approvedCreators[msg.sender]) {
uint256 veBalance = IMasterFarmer(masterFarmer).getVeFive(msg.sender, block.timestamp);
uint256 vePower = IMasterFarmer(masterFarmer).getVeFivePower(msg.sender, block.timestamp);
if (veBalance < config.requiredVeBalance || vePower < config.requiredVePower) revert NotAuthorized();
}
}
_;
}
modifier notPaused() {
if (paused) revert Paused();
_;
}
// ----------------- Admin: core & aux -----------------
function setAdmin(address newAdmin) external onlyAdmin {
if (newAdmin == address(0)) revert InvalidAddress();
admin = newAdmin;
emit AdminChanged(newAdmin);
}
function setCoreContracts(address _fiveToken, address _masterFarmer, address _deFiveRouter) external onlyAdmin {
if (_fiveToken == address(0) || _masterFarmer == address(0) || _deFiveRouter == address(0)) {
revert InvalidAddress();
}
if (_fiveToken.code.length == 0 || _masterFarmer.code.length == 0 || _deFiveRouter.code.length == 0)
revert InvalidAddress();
fiveToken = _fiveToken;
masterFarmer = _masterFarmer;
deFiveRouter = _deFiveRouter;
emit CoreContractsUpdated(_fiveToken, _masterFarmer, _deFiveRouter);
}
function setAuxFactories(address _tokenFactory, address _vestingFactory) external onlyAdmin {
if (_tokenFactory == address(0) || _vestingFactory == address(0)) revert InvalidAddress();
if (_tokenFactory.code.length == 0 || _vestingFactory.code.length == 0) revert InvalidAddress();
tokenFactory = IBurnToFunTokenFactory(_tokenFactory);
vestingFactory = IBurnToFunVestingFactory(_vestingFactory);
emit AuxFactoriesUpdated(_tokenFactory, _vestingFactory);
}
function setCampaignImplementationByKind(uint8 kind, address impl) external onlyAdmin {
if (impl == address(0) || impl.code.length == 0) revert InvalidAddress();
implementationOfKind[kind] = impl;
emit CampaignImplementationUpdated(kind, impl);
}
// ----------------- Admin: ops toggles -----------------
function togglePublicCreation() external onlyAdmin {
publicCreationEnabled = !publicCreationEnabled;
emit PublicCreationToggled(publicCreationEnabled);
}
function setCreatorApproval(address user, bool approved) external onlyAdmin {
approvedCreators[user] = approved;
emit CreatorAccessChanged(user, approved);
}
function pause() external onlyAdmin {
paused = true;
emit FactoryPaused(true);
}
function unpause() external onlyAdmin {
paused = false;
emit FactoryPaused(false);
}
// ----------------- Admin: config & tiers -----------------
function updateConfig(Config calldata c) external onlyAdmin {
// duration windows
if (c.minStartDelay == 0 || c.maxStartDelay == 0 || c.minStartDelay > c.maxStartDelay) revert InvalidParams();
if (c.minDuration == 0 || c.maxDuration == 0 || c.minDuration > c.maxDuration) revert InvalidParams();
// tokenomics sanity
if (c.lpTokenPercent == 0) revert InvalidParams();
if (c.lpRatio == 0) revert InvalidParams();
// vesting sanity
if (c.vestingCliff > c.vestingEnd) revert InvalidParams();
// goal sanity
if (c.goal == 0) revert InvalidParams();
// Hard guard: LP token share alone must be ≤ 80%
if (c.lpTokenPercent > MAX_OTHER_PCT) revert InvalidParams();
// FIVE-side guard against bricking with the CURRENT devPercent:
// dev + lpFivePercent ≤ 80%
uint256 lpFivePercent = (c.lpTokenPercent * c.lpRatio) / ONE;
if (devPercent + lpFivePercent > MAX_OTHER_PCT) revert InvalidParams();
if (keccak256(abi.encode(config)) == keccak256(abi.encode(c))) return;
config = c;
emit ConfigUpdated(c);
}
function setTiers(TierConfig[] calldata newTiers) external onlyAdmin {
uint256 len = newTiers.length;
if (len == 0) revert InvalidTierConfig();
if (newTiers[0].veFiveThreshold != 0) revert InvalidTierConfig();
// Validate ordering
for (uint256 i = 1; i < len; ) {
if (newTiers[i].veFiveThreshold <= newTiers[i - 1].veFiveThreshold) {
revert InvalidTierConfig();
}
unchecked {
++i;
}
}
// Persist
delete tiers;
tiers = new TierConfig[](len);
for (uint256 i; i < len; ) {
tiers[i] = newTiers[i];
unchecked {
++i;
}
}
// Build arrays for the subgraph snapshot
uint256[] memory v = new uint256[](len);
uint256[] memory p = new uint256[](len);
uint256[] memory m = new uint256[](len);
for (uint256 i; i < len; ) {
TierConfig memory t = newTiers[i];
v[i] = t.veFiveThreshold;
p[i] = t.maxPercent;
m[i] = t.bonusMultiplier;
unchecked {
++i;
}
}
bytes32 tiersHash = keccak256(abi.encode(v, p, m));
emit TiersConfiguredSnapshot(v, p, m, len, tiersHash);
}
function setCreatorCapLevels(CreatorCapLevel[] calldata newLevels) external onlyAdmin {
uint256 len = newLevels.length;
if (len == 0) revert InvalidCreatorCapLevelConfig();
if (newLevels[0].minSuccesses != 0) revert InvalidCreatorCapLevelConfig();
// Validate ordering + caps
for (uint256 i = 1; i < len; ) {
if (newLevels[i].minSuccesses <= newLevels[i - 1].minSuccesses) {
revert InvalidCreatorCapLevelConfig();
}
if (newLevels[i].maxCreatorPercent > MAX_CREATOR_PCT) {
revert InvalidCreatorCapLevelConfig();
}
unchecked {
++i;
}
}
// Persist
delete creatorCapLevels;
creatorCapLevels = new CreatorCapLevel[](len);
for (uint256 i; i < len; ) {
creatorCapLevels[i] = newLevels[i];
unchecked {
++i;
}
}
// Build arrays for the subgraph snapshot
uint256[] memory ms = new uint256[](len);
uint256[] memory mp = new uint256[](len);
for (uint256 i; i < len; ) {
CreatorCapLevel memory lv = newLevels[i];
ms[i] = lv.minSuccesses;
mp[i] = lv.maxCreatorPercent;
unchecked {
++i;
}
}
bytes32 levelsHash = keccak256(abi.encode(ms, mp));
emit CreatorCapLevelsConfiguredSnapshot(ms, mp, len, levelsHash);
}
// ----------------- Dev: set treasury and claim -----------------
function setDevTreasuryAndShare(address treasury, uint256 percent) external onlyDev {
if (treasury == address(0)) revert InvalidAddress();
if (percent > MAX_DEV_PCT) revert InvalidParams();
devTreasury = treasury;
devPercent = percent;
emit DevTreasuryUpdated(treasury, percent);
}
function claimDevTokens(address token) external nonReentrant onlyDev {
uint256 bal = IERC20(token).balanceOf(address(this));
if (bal > 0) {
bool ok = IERC20(token).transfer(devTreasury, bal);
if (!ok) revert TransferFailed();
emit DevTokensClaimed(token, bal, devTreasury);
}
}
// ----------------- Campaign creation -----------------
/// @notice Create a new deterministic campaign clone for the caller (creator).
function createCampaign(
// creator params
uint8 kind,
uint256 startTime,
uint256 endTime,
uint256 softCap,
uint256 hardCap,
uint256 creatorTokenPercent,
uint256 baseBurnRatio,
string calldata tokenName,
string calldata tokenSymbol,
string calldata metadataURI,
bytes calldata extraInitData
) external nonReentrant onlyAuthorizedCreator notPaused returns (address campaign) {
if (tiers.length == 0) revert InvalidTierConfig();
if (creatorCapLevels.length == 0) revert InvalidCreatorCapLevelConfig();
if (address(tokenFactory) == address(0) || address(vestingFactory) == address(0)) revert FactoriesNotSet();
address impl = implementationOfKind[kind];
if (impl == address(0)) revert ImplementationNotSet();
(uint256 maxCreatorPercent, ) = getCreatorLimits(msg.sender);
// ---- param validation ----
if (
startTime < block.timestamp + config.minStartDelay ||
startTime > block.timestamp + config.maxStartDelay ||
endTime < startTime + config.minDuration ||
endTime > startTime + config.maxDuration ||
softCap < config.goal / 5 ||
hardCap < softCap * 2 ||
hardCap < config.goal ||
creatorTokenPercent > maxCreatorPercent ||
baseBurnRatio == 0
) revert InvalidParams();
// name/symbol checks + symbol uniqueness
string memory lower = _toLower(tokenSymbol);
if (usedSymbols[lower]) revert SymbolAlreadyUsed();
if (!_isValidTokenName(tokenName)) revert InvalidName();
if (!_isValidTokenSymbol(tokenSymbol)) revert InvalidSymbol();
if (bytes(metadataURI).length == 0 || bytes(metadataURI).length > 512) revert InvalidMetadataURI();
// sanity: tokenomics must leave room for users
if (creatorTokenPercent > MAX_OTHER_PCT - config.lpTokenPercent - devPercent) revert InvalidTokenomics();
// ---- compute LP params ----
uint256 lpFivePercent = (config.lpTokenPercent * config.lpRatio) / ONE;
if (devPercent + lpFivePercent > MAX_OTHER_PCT) revert InvalidTokenomics();
// ---- convert factory tiers to absolute caps ----
IBurnToFunCampaign.Tier[] memory t = _convertTiersToCampaignFormat(softCap);
// Build snapshot arrays for the event
uint256 len = t.length;
uint256[] memory th = new uint256[](len);
uint256[] memory caps = new uint256[](len);
uint256[] memory mult = new uint256[](len);
for (uint256 i; i < len; ) {
th[i] = t[i].veFiveThreshold;
caps[i] = t[i].maxBurnAmount;
mult[i] = t[i].bonusMultiplier;
unchecked {
++i;
}
}
// ---- deterministic salt & address ----
uint256 id = campaignNonce + 1;
bytes32 salt = _campaignSalt(msg.sender, id, kind);
address predicted = Clones.predictDeterministicAddress(impl, salt, address(this));
address clone = impl.cloneDeterministic(salt);
if (clone != predicted) revert CloneAddressMismatch();
// initialize on the actual clone address
IBurnToFunCampaign(clone).initialize(
address(this),
msg.sender,
fiveToken,
masterFarmer,
deFiveRouter,
baseBurnRatio,
startTime,
endTime,
softCap,
hardCap,
creatorTokenPercent,
devPercent,
config.lpTokenPercent,
lpFivePercent,
tokenName,
tokenSymbol,
metadataURI,
t,
id,
config.vestingCliff,
config.vestingEnd,
extraInitData
);
// ---- authorize in aux factories ----
tokenFactory.setAuthorizedCampaign(clone, true);
vestingFactory.setAuthorizedCampaign(clone, true);
// ---- registry ----
campaign = clone;
campaigns[id] = clone;
creatorCampaigns[msg.sender].push(clone);
isCampaign[clone] = true;
usedSymbols[lower] = true; // Mark symbol as used only after successful creation/initialization
address predictedToken = tokenFactory.predictTokenAddress(clone);
address predictedVesting = vestingFactory.predictVestingAddress(clone);
unchecked {
campaignNonce++;
}
emit CampaignCreated(
id,
kind,
clone,
msg.sender,
deFiveRouter,
startTime,
endTime,
config.vestingCliff,
config.vestingEnd,
softCap,
hardCap,
baseBurnRatio,
creatorTokenPercent,
devPercent,
config.lpTokenPercent,
(config.lpTokenPercent * config.lpRatio) / ONE,
tokenName,
tokenSymbol,
metadataURI,
predictedToken,
predictedVesting,
extraInitData
);
emit CampaignTiersSnapshot(id, clone, th, caps, mult, len);
}
/// @notice Record a user's contribution for a campaign. Only callable by campaigns created here.
function recordUserContribution(address user, uint256 amount) external {
if (!isCampaign[msg.sender]) revert NotCampaign();
// first time we see this (user,campaign), push into list
if (userCampaignAmount[user][msg.sender] == 0) {
userCampaigns[user].push(msg.sender);
}
userCampaignAmount[user][msg.sender] = amount;
emit UserContributionRecorded(msg.sender, user, amount);
}
/// @notice Number of campaigns a user has ever participated in (including ones later refunded)
function userCampaignCount(address user) external view returns (uint256) {
return userCampaigns[user].length;
}
/// @notice Paged read of a user's campaign contributions.
/// @dev Provide (offset, limit) to avoid huge responses.
function getUserContributions(
address user,
uint256 offset,
uint256 limit
) external view returns (address[] memory campaigns_, uint256[] memory amounts_) {
address[] storage all = userCampaigns[user];
uint256 n = all.length;
if (offset > n) offset = n;
uint256 end = offset + limit;
if (end > n) end = n;
uint256 len = end > offset ? end - offset : 0;
campaigns_ = new address[](len);
amounts_ = new uint256[](len);
for (uint256 i; i < len; ) {
address c = all[offset + i];
campaigns_[i] = c;
amounts_[i] = userCampaignAmount[user][c];
unchecked {
++i;
}
}
}
/// @notice Record a creator's contribution for a campaign. Only callable by campaigns created here.
function recordCreatorContribution(address creator, uint256 amount) external {
if (!isCampaign[msg.sender]) revert NotCampaign();
// check if it’s the first time this campaign is being marked successful
if (creatorCampaignAmount[creator][msg.sender] == 0 && amount > 0) {
unchecked {
creatorSuccessfulCampaignsCount[creator]++;
successfulCampaignNonce++;
}
}
creatorCampaignAmount[creator][msg.sender] = amount;
emit CreatorContributionRecorded(msg.sender, creator, amount);
}
/// @notice Number of campaigns created by `creator`.
function creatorCampaignCount(address creator) external view returns (uint256) {
return creatorCampaigns[creator].length;
}
/// @notice Number of successful campaigns created by `creator`.
function creatorSuccessfulCampaignCount(address creator) external view returns (uint256) {
return creatorSuccessfulCampaignsCount[creator];
}
/// @notice Paged read of campaigns created by `creator` with their recorded creator amounts.
/// @dev Use (offset, limit) to reduce RPC load in UIs.
function getCreatorContributions(
address creator,
uint256 offset,
uint256 limit
) external view returns (address[] memory campaigns_, uint256[] memory amounts_) {
address[] storage all = creatorCampaigns[creator];
uint256 n = all.length;
if (offset > n) offset = n;
uint256 end = offset + limit;
if (end > n) end = n;
uint256 len = end > offset ? end - offset : 0;
campaigns_ = new address[](len);
amounts_ = new uint256[](len);
for (uint256 i; i < len; ) {
address c = all[offset + i];
campaigns_[i] = c;
amounts_[i] = creatorCampaignAmount[creator][c];
unchecked {
++i;
}
}
}
function tiersLength() external view returns (uint256) {
return tiers.length;
}
function getTiers() external view returns (TierConfig[] memory) {
return tiers;
}
function creatorCapLevelsLength() external view returns (uint256) {
return creatorCapLevels.length;
}
function getCreatorCapLevels() external view returns (CreatorCapLevel[] memory) {
return creatorCapLevels;
}
function getCreatorLimits(address creator) public view returns (uint256 maxCreatorPercent, uint256 idx) {
uint256 n = creatorCapLevels.length;
if (n == 0) revert NoCreatorCapLevelConfigured();
uint256 successes = creatorSuccessfulCampaignsCount[creator];
idx = 0;
for (uint256 i = n; i > 0; ) {
if (successes >= creatorCapLevels[i - 1].minSuccesses) {
idx = i - 1;
break;
}
unchecked {
--i;
}
}
maxCreatorPercent = creatorCapLevels[idx].maxCreatorPercent;
}
/// @notice Predict the campaign address for a given (creator, nonce).
function predictCampaignAddress(address creator, uint256 nonce_, uint8 kind) external view returns (address) {
address impl = implementationOfKind[kind];
if (impl == address(0)) revert ImplementationNotSet();
return Clones.predictDeterministicAddress(impl, _campaignSalt(creator, nonce_, kind), address(this));
}
/// @notice External helper to check if a (case-insensitive) token symbol is already taken.
/// @dev Internally we store symbols in lowercase; this normalizes the input before lookup.
function isSymbolUsed(string calldata symbol) external view returns (bool) {
return usedSymbols[_toLower(symbol)];
}
function sweepNative(address to) external onlyAdmin nonReentrant {
if (to == address(0)) revert InvalidAddress();
uint256 bal = address(this).balance;
(bool ok, ) = to.call{ value: bal }("");
if (!ok) revert TransferFailed();
emit NativeSwept(to, bal);
}
// ----------------- Internals -----------------
function _convertTiersToCampaignFormat(
uint256 softCap
) internal view returns (IBurnToFunCampaign.Tier[] memory result) {
uint256 len = tiers.length;
result = new IBurnToFunCampaign.Tier[](len);
// base for absolute cap = max(softCap, config.goal)
uint256 maxBase = softCap > config.goal ? softCap : config.goal;
for (uint256 i; i < len; ) {
TierConfig memory src = tiers[i];
result[i] = IBurnToFunCampaign.Tier({
veFiveThreshold: src.veFiveThreshold,
maxBurnAmount: (maxBase * src.maxPercent) / ONE,
bonusMultiplier: src.bonusMultiplier
});
unchecked {
++i;
}
}
}
function _campaignSalt(address creator, uint256 nonce_, uint8 kind) internal view returns (bytes32) {
return keccak256(abi.encodePacked("B2F:CAMPAIGN", creator, nonce_, kind, block.chainid));
}
// --- local utils (kept here to avoid extra libs) ---
function _isValidTokenName(string calldata name) internal pure returns (bool) {
bytes calldata b = bytes(name);
if (b.length == 0 || b.length > 32) return false;
bool hasNonSpace;
for (uint256 i; i < b.length; ) {
uint8 c = uint8(b[i]);
if (c < 32 || c > 126) return false; // printable ASCII only
if (c != 32) hasNonSpace = true;
unchecked {
++i;
}
}
return hasNonSpace;
}
function _isValidTokenSymbol(string calldata symbol) internal pure returns (bool) {
bytes calldata b = bytes(symbol);
if (b.length == 0 || b.length > 11) return false;
for (uint256 i; i < b.length; ) {
bytes1 char = b[i];
if (
!(char >= 0x41 && char <= 0x5A) && // A-Z
!(char >= 0x61 && char <= 0x7A) && // a-z
!(char >= 0x30 && char <= 0x39) // 0-9
) return false;
unchecked {
++i;
}
}
return true;
}
function _toLower(string memory str) internal pure returns (string memory) {
bytes memory s = bytes(str);
bytes memory out = new bytes(s.length);
for (uint256 i; i < s.length; ) {
bytes1 ch = s[i];
out[i] = (ch >= 0x41 && ch <= 0x5A) ? bytes1(uint8(ch) + 32) : ch;
unchecked {
++i;
}
}
return string(out);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (proxy/Clones.sol)
pragma solidity ^0.8.20;
import {Create2} from "../utils/Create2.sol";
import {Errors} from "../utils/Errors.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*/
library Clones {
error CloneArgumentsTooLong();
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
return clone(implementation, 0);
}
/**
* @dev Same as {xref-Clones-clone-address-}[clone], but with a `value` parameter to send native currency
* to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function clone(address implementation, uint256 value) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(value, 0x09, 0x37)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple times will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
return cloneDeterministic(implementation, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministic-address-bytes32-}[cloneDeterministic], but with
* a `value` parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministic(
address implementation,
bytes32 salt,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(value, 0x09, 0x37, salt)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly ("memory-safe") {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := and(keccak256(add(ptr, 0x43), 0x55), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddress(implementation, salt, address(this));
}
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create opcode, which should never revert.
*/
function cloneWithImmutableArgs(address implementation, bytes memory args) internal returns (address instance) {
return cloneWithImmutableArgs(implementation, args, 0);
}
/**
* @dev Same as {xref-Clones-cloneWithImmutableArgs-address-bytes-}[cloneWithImmutableArgs], but with a `value`
* parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneWithImmutableArgs(
address implementation,
bytes memory args,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
assembly ("memory-safe") {
instance := create(value, add(bytecode, 0x20), mload(bytecode))
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy the clone. Using the same
* `implementation`, `args` and `salt` multiple times will revert, since the clones cannot be deployed twice
* at the same address.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal returns (address instance) {
return cloneDeterministicWithImmutableArgs(implementation, args, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministicWithImmutableArgs-address-bytes-bytes32-}[cloneDeterministicWithImmutableArgs],
* but with a `value` parameter to send native currency to the new contract.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
uint256 value
) internal returns (address instance) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.deploy(value, salt, bytecode);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.computeAddress(salt, keccak256(bytecode), deployer);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddressWithImmutableArgs(implementation, args, salt, address(this));
}
/**
* @dev Get the immutable args attached to a clone.
*
* - If `instance` is a clone that was deployed using `clone` or `cloneDeterministic`, this
* function will return an empty array.
* - If `instance` is a clone that was deployed using `cloneWithImmutableArgs` or
* `cloneDeterministicWithImmutableArgs`, this function will return the args array used at
* creation.
* - If `instance` is NOT a clone deployed using this library, the behavior is undefined. This
* function should only be used to check addresses that are known to be clones.
*/
function fetchCloneArgs(address instance) internal view returns (bytes memory) {
bytes memory result = new bytes(instance.code.length - 45); // revert if length is too short
assembly ("memory-safe") {
extcodecopy(instance, add(result, 32), 45, mload(result))
}
return result;
}
/**
* @dev Helper that prepares the initcode of the proxy with immutable args.
*
* An assembly variant of this function requires copying the `args` array, which can be efficiently done using
* `mcopy`. Unfortunately, that opcode is not available before cancun. A pure solidity implementation using
* abi.encodePacked is more expensive but also more portable and easier to review.
*
* NOTE: https://eips.ethereum.org/EIPS/eip-170[EIP-170] limits the length of the contract code to 24576 bytes.
* With the proxy code taking 45 bytes, that limits the length of the immutable args to 24531 bytes.
*/
function _cloneCodeWithImmutableArgs(
address implementation,
bytes memory args
) private pure returns (bytes memory) {
if (args.length > 24531) revert CloneArgumentsTooLong();
return
abi.encodePacked(
hex"61",
uint16(args.length + 45),
hex"3d81600a3d39f3363d3d373d3d3d363d73",
implementation,
hex"5af43d82803e903d91602b57fd5bf3",
args
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
/**
* @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
* `CREATE2` can be used to compute in advance the address where a smart
* contract will be deployed, which allows for interesting new mechanisms known
* as 'counterfactual interactions'.
*
* See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
* information.
*/
library Create2 {
/**
* @dev There's no code to deploy.
*/
error Create2EmptyBytecode();
/**
* @dev Deploys a contract using `CREATE2`. The address where the contract
* will be deployed can be known in advance via {computeAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
*
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already.
* - the factory must have a balance of at least `amount`.
* - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
*/
function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
if (bytecode.length == 0) {
revert Create2EmptyBytecode();
}
assembly ("memory-safe") {
addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
// if no address was created, and returndata is not empty, bubble revert
if and(iszero(addr), not(iszero(returndatasize()))) {
let p := mload(0x40)
returndatacopy(p, 0, returndatasize())
revert(p, returndatasize())
}
}
if (addr == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
* `bytecodeHash` or `salt` will result in a new destination address.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
return computeAddress(salt, bytecodeHash, address(this));
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
* `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
assembly ("memory-safe") {
let ptr := mload(0x40) // Get free memory pointer
// | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |
// |-------------------|---------------------------------------------------------------------------|
// | bytecodeHash | CCCCCCCCCCCCC...CC |
// | salt | BBBBBBBBBBBBB...BB |
// | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |
// | 0xFF | FF |
// |-------------------|---------------------------------------------------------------------------|
// | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
// | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |
mstore(add(ptr, 0x40), bytecodeHash)
mstore(add(ptr, 0x20), salt)
mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
mstore8(start, 0xff)
addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*
* _Available since v5.1._
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}{
"optimizer": {
"enabled": true,
"runs": 999
},
"viaIR": true,
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_fiveToken","type":"address"},{"internalType":"address","name":"_masterFarmer","type":"address"},{"internalType":"address","name":"_deFiveRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CloneAddressMismatch","type":"error"},{"inputs":[],"name":"FactoriesNotSet","type":"error"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[],"name":"ImplementationNotSet","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidCreatorCapLevelConfig","type":"error"},{"inputs":[],"name":"InvalidMetadataURI","type":"error"},{"inputs":[],"name":"InvalidName","type":"error"},{"inputs":[],"name":"InvalidParams","type":"error"},{"inputs":[],"name":"InvalidSymbol","type":"error"},{"inputs":[],"name":"InvalidTierConfig","type":"error"},{"inputs":[],"name":"InvalidTokenomics","type":"error"},{"inputs":[],"name":"NoCreatorCapLevelConfigured","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotCampaign","type":"error"},{"inputs":[],"name":"NotDev","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SymbolAlreadyUsed","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenFactory","type":"address"},{"indexed":false,"internalType":"address","name":"vestingFactory","type":"address"}],"name":"AuxFactoriesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":true,"internalType":"address","name":"campaign","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"deFiveRouter","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingCliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingEnd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"softCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hardCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseBurnRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorTokenPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokenPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpFivePercent","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenName","type":"string"},{"indexed":false,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"},{"indexed":false,"internalType":"address","name":"predictedToken","type":"address"},{"indexed":false,"internalType":"address","name":"predictedVesting","type":"address"},{"indexed":false,"internalType":"bytes","name":"extraInitData","type":"bytes"}],"name":"CampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"kind","type":"uint8"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"CampaignImplementationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"campaign","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"veFiveThresholds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxBurnAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"bonusMultipliers","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"tiersLength","type":"uint256"}],"name":"CampaignTiersSnapshot","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"minStartDelay","type":"uint256"},{"internalType":"uint256","name":"maxStartDelay","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"},{"internalType":"uint256","name":"maxDuration","type":"uint256"},{"internalType":"uint256","name":"lpTokenPercent","type":"uint256"},{"internalType":"uint256","name":"lpRatio","type":"uint256"},{"internalType":"uint256","name":"goal","type":"uint256"},{"internalType":"uint256","name":"requiredVeBalance","type":"uint256"},{"internalType":"uint256","name":"requiredVePower","type":"uint256"},{"internalType":"uint256","name":"vestingCliff","type":"uint256"},{"internalType":"uint256","name":"vestingEnd","type":"uint256"}],"indexed":false,"internalType":"struct BurnToFunFactory.Config","name":"newConfig","type":"tuple"}],"name":"ConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fiveToken","type":"address"},{"indexed":false,"internalType":"address","name":"masterFarmer","type":"address"},{"indexed":false,"internalType":"address","name":"deFiveRouter","type":"address"}],"name":"CoreContractsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"CreatorAccessChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"minSuccesses","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxCreatorPercents","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"levelsLength","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"levelsHash","type":"bytes32"}],"name":"CreatorCapLevelsConfiguredSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"campaign","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreatorContributionRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"DevTokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasury","type":"address"},{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"DevTreasuryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"devTreasury","type":"address"},{"indexed":false,"internalType":"uint256","name":"devPercent","type":"uint256"},{"indexed":false,"internalType":"bool","name":"publicCreationEnabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"paused","type":"bool"},{"indexed":false,"internalType":"address","name":"fiveToken","type":"address"},{"indexed":false,"internalType":"address","name":"masterFarmer","type":"address"},{"indexed":false,"internalType":"address","name":"deFiveRouter","type":"address"},{"indexed":false,"internalType":"address","name":"tokenFactory","type":"address"},{"indexed":false,"internalType":"address","name":"vestingFactory","type":"address"},{"indexed":false,"internalType":"uint256","name":"campaignNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"successfulCampaignNonce","type":"uint256"}],"name":"FactoryBootstrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FactoryPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeSwept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PublicCreationToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"veFiveThresholds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"maxPercents","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"bonusMultipliers","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"tiersLength","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"tiersHash","type":"bytes32"}],"name":"TiersConfiguredSnapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"campaign","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserContributionRecorded","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedCreators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"campaignNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"campaigns","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimDevTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint256","name":"minStartDelay","type":"uint256"},{"internalType":"uint256","name":"maxStartDelay","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"},{"internalType":"uint256","name":"maxDuration","type":"uint256"},{"internalType":"uint256","name":"lpTokenPercent","type":"uint256"},{"internalType":"uint256","name":"lpRatio","type":"uint256"},{"internalType":"uint256","name":"goal","type":"uint256"},{"internalType":"uint256","name":"requiredVeBalance","type":"uint256"},{"internalType":"uint256","name":"requiredVePower","type":"uint256"},{"internalType":"uint256","name":"vestingCliff","type":"uint256"},{"internalType":"uint256","name":"vestingEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"softCap","type":"uint256"},{"internalType":"uint256","name":"hardCap","type":"uint256"},{"internalType":"uint256","name":"creatorTokenPercent","type":"uint256"},{"internalType":"uint256","name":"baseBurnRatio","type":"uint256"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"bytes","name":"extraInitData","type":"bytes"}],"name":"createCampaign","outputs":[{"internalType":"address","name":"campaign","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"creatorCampaignCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorCapLevels","outputs":[{"internalType":"uint256","name":"minSuccesses","type":"uint256"},{"internalType":"uint256","name":"maxCreatorPercent","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorCapLevelsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"creatorSuccessfulCampaignCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deFiveRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fiveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreatorCapLevels","outputs":[{"components":[{"internalType":"uint256","name":"minSuccesses","type":"uint256"},{"internalType":"uint256","name":"maxCreatorPercent","type":"uint256"}],"internalType":"struct BurnToFunFactory.CreatorCapLevel[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getCreatorContributions","outputs":[{"internalType":"address[]","name":"campaigns_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"getCreatorLimits","outputs":[{"internalType":"uint256","name":"maxCreatorPercent","type":"uint256"},{"internalType":"uint256","name":"idx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTiers","outputs":[{"components":[{"internalType":"uint256","name":"veFiveThreshold","type":"uint256"},{"internalType":"uint256","name":"maxPercent","type":"uint256"},{"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"internalType":"struct BurnToFunFactory.TierConfig[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getUserContributions","outputs":[{"internalType":"address[]","name":"campaigns_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"implementationOfKind","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCampaign","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"isSymbolUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterFarmer","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":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"nonce_","type":"uint256"},{"internalType":"uint8","name":"kind","type":"uint8"}],"name":"predictCampaignAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCreationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recordCreatorContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recordUserContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenFactory","type":"address"},{"internalType":"address","name":"_vestingFactory","type":"address"}],"name":"setAuxFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"kind","type":"uint8"},{"internalType":"address","name":"impl","type":"address"}],"name":"setCampaignImplementationByKind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fiveToken","type":"address"},{"internalType":"address","name":"_masterFarmer","type":"address"},{"internalType":"address","name":"_deFiveRouter","type":"address"}],"name":"setCoreContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setCreatorApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"minSuccesses","type":"uint256"},{"internalType":"uint256","name":"maxCreatorPercent","type":"uint256"}],"internalType":"struct BurnToFunFactory.CreatorCapLevel[]","name":"newLevels","type":"tuple[]"}],"name":"setCreatorCapLevels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"},{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setDevTreasuryAndShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"veFiveThreshold","type":"uint256"},{"internalType":"uint256","name":"maxPercent","type":"uint256"},{"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"internalType":"struct BurnToFunFactory.TierConfig[]","name":"newTiers","type":"tuple[]"}],"name":"setTiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"successfulCampaignNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sweepNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tiers","outputs":[{"internalType":"uint256","name":"veFiveThreshold","type":"uint256"},{"internalType":"uint256","name":"maxPercent","type":"uint256"},{"internalType":"uint256","name":"bonusMultiplier","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tiersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicCreation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"contract IBurnToFunTokenFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"minStartDelay","type":"uint256"},{"internalType":"uint256","name":"maxStartDelay","type":"uint256"},{"internalType":"uint256","name":"minDuration","type":"uint256"},{"internalType":"uint256","name":"maxDuration","type":"uint256"},{"internalType":"uint256","name":"lpTokenPercent","type":"uint256"},{"internalType":"uint256","name":"lpRatio","type":"uint256"},{"internalType":"uint256","name":"goal","type":"uint256"},{"internalType":"uint256","name":"requiredVeBalance","type":"uint256"},{"internalType":"uint256","name":"requiredVePower","type":"uint256"},{"internalType":"uint256","name":"vestingCliff","type":"uint256"},{"internalType":"uint256","name":"vestingEnd","type":"uint256"}],"internalType":"struct BurnToFunFactory.Config","name":"c","type":"tuple"}],"name":"updateConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userCampaignCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingFactory","outputs":[{"internalType":"contract IBurnToFunVestingFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608034620001a857601f62003d8138819003918201601f191683019291906001600160401b03841183851017620001ad578160609284926040968752833981010312620001a8576200005181620001c3565b6200006c836200006460208501620001c3565b9301620001c3565b60016000556017805460ff191690556001600160a01b0391821690811580156200019d575b801562000192575b6200018157917f6ef9225cd8092c1fac2992557c7e72c1aac8cc6133c06b42aa4b16dcd6f1bf4093916101809360018060a01b03199233846001541617600155338460025416176002558080662386f26fc10000968760035585876004541617600455169283866005541617600555168094600654161760065560ff60195416938160075416916008541692601a5494601b54968b5198338a523360208b01528c8a0152600060608a01521515608089015260a088015260c087015260e0860152610100850152610120840152610140830152610160820152a151613ba89081620001d98239f35b845163e6c4247b60e01b8152600490fd5b508281161562000099565b508284161562000091565b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001a85756fe61038080604052600436101561001457600080fd5b60006102e0526102e0513560e01c90816301504ea014612bb457508063039af9eb14612b6a57806304daaab514612b455780630781785314612b16578063134abd1414612a6e578063141961bc14612a355780631c46c674146128a157806325f93732146127985780632d8ae0e6146127655780633aa82b61146127285780633e1af218146126ea5780633f4ba83a1461268757806341f5d08f1461266757806342e597d91461263e5780634ad6841e146125615780634ceb8dfa146125205780634d0094d1146124ca5780635108f432146123ae578063552324671461236b578063566130c0146122ff5780635c975abb146122da5780636298e1771461229d578063704b6c021461222457806378c093cf1461214257806379502c55146120c95780638456cb591461206557806388d43a0d14611fa85780638cd6a1d814611f7f578063a1011a5c14611f5f578063a657a65b14611ab2578063b19ab07614611a89578063be5f523f14611976578063c3748e511461091a578063c5a14e2614610839578063de1705701461074c578063dfc0d3db14610659578063e104471f1461061b578063e2714e1b146105d8578063e2eba8f51461050f578063e62fe44b146104e6578063e77772fe146104bd578063ea0d5bb51461042f578063efa891c4146102f1578063f123220e146102d1578063f60826ee146102a8578063f851a4401461027f578063fc3c28af1461025f5763fd4c7a291461023857600080fd5b34610258576102e051366003190112610258576020601554604051908152f35b6102e05180fd5b34610258576102e051366003190112610258576020600354604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360015416604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360085416604051908152f35b34610258576102e051366003190112610258576020601b54604051908152f35b346102585760603660031901126102585761030a613059565b61031261306f565b906001600160a01b03906044358281169081810361042a578360015416330361041957838316928315801561040f575b8015610407575b6103c9573b159081156103fd575b81156103f3575b506103c9577fa36e23d84e1356c9eb876077cf3c018ef0f8aa6abdb0c04bba69fa9c67f7a6ef93816060946001600160a01b03199285846004541617600455169182816005541617600555600654161760065560405192835260208301526040820152a16102e05180f35b60046040517fe6c4247b000000000000000000000000000000000000000000000000000000008152fd5b90503b158561035e565b853b159150610357565b508215610349565b5084861615610342565b6004604051637bfa4b9f60e01b8152fd5b600080fd5b3461025857604036600319011261025857610448613059565b60243590811515809203610258576001600160a01b039081600154163303610419577f0f44f503bff4a52f1ccd91110e3aed357fadfe7236be6772d658208a241670a4916020911692836102e051526018825260406102e0512060ff1981541660ff8316179055604051908152a26102e05180f35b34610258576102e0513660031901126102585760206001600160a01b0360075416604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360045416604051908152f35b3461025857604036600319011261025857610528613059565b602435600254916001600160a01b039081841633036105ae57169182156103c957662386f26fc10000821161059d577ff31943dded09c3880df46a0a37c958c5d1f65761fa770ff9b2947ebe2fbd243191836001600160a01b0319602093161760025580600355604051908152a26102e05180f35b6004604051635435b28960e11b8152fd5b60046040517f8cf65e50000000000000000000000000000000000000000000000000000000008152fd5b34610258576020366003190112610258576001600160a01b036105f9613059565b166102e05152601d602052602060ff60406102e0512054166040519015158152f35b34610258576020366003190112610258576001600160a01b0361063c613059565b166102e051526021602052602060406102e0512054604051908152f35b3461025857606036600319011261025857610672613059565b60443560ff811680820361042a576102e0515260096020526001600160a01b03908160406102e0512054168015610722576106b66107199260209560243590613afc565b30916001600160a01b03926055926043926040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c820120607882015201201690565b60405191168152f35b60046040517f40dde935000000000000000000000000000000000000000000000000000000008152fd5b34610258576102e0513660031901126102585760155461076b81613281565b610778604051918261325f565b81815260209060208101928360156102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4756102e051915b83831061081c5785858860405191602083019060208452518091526040830191936102e0515b8281106107e55784840385f35b9091928260608261080d6001948a516040809180518452602081015160208501520151910152565b019601910194929190946107d8565b60038660019261082b856137dd565b8152019201920191906107b2565b34610258576102e0513660031901126102585760165461085881613281565b610865604051918261325f565b818152602090818101928360166102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242896102e051915b8383106108ee578585886040519183830190848452518091526040830191936102e0515b8281106108cf5784840385f35b85518051855282015184830152948101946040909301926001016108c2565b600286600192604051610900816131fd565b85548152848601548382015281520192019201919061089e565b346102585761016036600319011261025857610934613085565b6102205260e43567ffffffffffffffff81116102585761095890369060040161314f565b6101e0526101205267ffffffffffffffff610104351161025857610982366101043560040161314f565b610140526101605267ffffffffffffffff6101243511610258576109ac366101243560040161314f565b610180526101a05267ffffffffffffffff6101443511610258576109d6366101443560040161314f565b610200526101c0526109e6613805565b60175460ff1661181a57336102e05152601860205260ff60406102e05120541615611809575b60ff601954166117df5760155480156117b5576016541561178b576001600160a01b0360075416158015611778575b61174e5760ff61022051166102e05152600960205260406102e0512054610320526001600160a01b0361032051161561072257610a77336132df565b50610a84600a544261338e565b60243510908115611736575b811561171c575b8115611702575b81156116f0575b81156116cc575b81156116be575b81156116b2575b5080156116a8575b61059d57610adf610ada3661014051610160516136fe565b613851565b6101005260ff610af161010051613735565b541661167e57610b076101e05161012051613928565b1561165457610b1c61014051610160516139a7565b1561162a576101805115801561161c575b6115f257600e5490670b1a2bc2ec500000828103116114b85760035491610b5e8382670b1a2bc2ec500000036131c7565b60a435116115c857610b90670de0b6b3a7640000610b88670b1a2bc2ec50000093600f54906131ea565b04809461338e565b116115c857610bb1610ba182613281565b604051610240526102405161325f565b806102405152610bc081613281565b6102e0515b601f19820181106115ae5750506010546064358110156115a957506064355b6102e0515b828110611538578361024051516102c052610c066102c051613299565b6102a052610c166102c051613299565b61036052610c266102c051613299565b610340526102e0515b6102c05181106114d25750601a54610300526001610300510161030051116114b857610c65610220516001610300510133613afc565b610cd830826001600160a01b0361032051166001600160a01b03926055926043926040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c820120607882015201201690565b61028052763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff6103205160881c16176102e051526e5af43d82803e903d91602b57fd5bf36effffffffffffffffffffffffffffff196103205160781b1617602052603760096102e051f5610260526001600160a01b0361026051161561148e576001600160a01b0361028051166001600160a01b03610260511603611464576001600160a01b03600454166001600160a01b036005541660c0526001600160a01b036006541660e05260035491600e5460135493601454936001600160a01b0361026051163b156102585760405160a0527f4c7f67910000000000000000000000000000000000000000000000000000000060a0515230600460a051015233602460a0510152604460a051015260c051606460a051015260e051608460a051015260c43560a460a051015260243560c460a051015260443560e460a051015260643561010460a051015260843561012460a051015260a43561014460a051015261016460a051015261018460a05101526101a460a05101526102c06101c460a0510152610ece610eb0610e926102c460a051016101e0516101205161379d565b60031960a0518203016101e460a0510152610140516101605161379d565b60031960a05182030161020460a0510152610180516101a05161379d565b9160031960a05184030161022460a05101526020610240515193848152019260206102405101906102e0515b818110611430575050506001610300510161024460a051015261026460a051015261028460a051015260031960a0518203016102a460a05101526102e0519060a05190610f5160a05191610200516101c05161379d565b0360a0516102e0516001600160a01b0361026051165af180156113c557611420575b6001600160a01b0360075416803b156102585760405190636733c5ab60e11b82526001600160a01b036102605116600483015260016024830152816044816102e051936102e051905af180156113c557611409575b506001600160a01b0360085416803b156102585760405190636733c5ab60e11b82526001600160a01b036102605116600483015260016024830152816044816102e051936102e051905af180156113c5576113f2575b50600161030051016102e05152601c60205260406102e051206001600160a01b0361026051166001600160a01b0319825416179055336102e05152601e6020526110716102605160406102e051206136a1565b6001600160a01b0361026051166102e05152601d60205260406102e0512060ff199060018282541617905560016110aa61010051613735565b91825416179055602460206001600160a01b0360075416604051928380927f764dc4e70000000000000000000000000000000000000000000000000000000082526001600160a01b03610260511660048301525afa9081156113c5576102e051916113d3575b50602460206001600160a01b0360085416604051928380927fd324672d0000000000000000000000000000000000000000000000000000000082526001600160a01b03610260511660048301525afa80156113c5576001600160a01b03916102e05191611396575b506001601a5401601a55816006541660135460145460035490600e5492670de0b6b3a76400006111aa600f54866131ea565b0494604051608052600161030051016080515260206080510152602435604060805101526044356060608051015260808051015260a0608051015260643560c0608051015260843560e0608051015260c435610100608051015260a43561012060805101526101406080510152610160608051015261018060805101526102606101a060805101528161128461126a611250610260608051016101e0516101205161379d565b60805181036101c06080510152610140516101605161379d565b60805181036101e06080510152610180516101a05161379d565b931661020060805101521661022060805101526080518103610240608051015233906001600160a01b036102605116907f1a7b12acef2243431002358b324fad26e2629011adef23a29fd74e8812003c9a60ff6102205116916112f160805191610200516101c05161379d565b03608051a460405160808152611335611324611313608084016102a0516130bf565b8381036020850152610360516130bf565b8281036040840152610340516130bf565b6102c05160608301527fd2a15eb3553dc794f74c79b8d6b20b9aa48e3c482b59635eac3867000de3286c6001600160a01b036102605116928060016103005101930390a360016102e0515560206040516001600160a01b0361026051168152f35b6113b8915060203d6020116113be575b6113b0818361325f565b8101906137be565b83611178565b503d6113a6565b6040513d6102e051823e3d90fd5b6113ec915060203d6020116113be576113b0818361325f565b81611110565b6113fb9061324b565b6102e051610258578061101e565b6114129061324b565b6102e0516102585780610fc8565b61142b60a05161324b565b610f73565b90919460206060826114596001948a516040809180518452602081015160208501520151910152565b019601929101610efa565b60046040517ffdce8f42000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb06ebf3d000000000000000000000000000000000000000000000000000000008152fd5b634e487b7160e01b6102e05152601160045260246102e051fd5b806114e2600192610240516132cb565b51516114f1826102a0516132cb565b52602061150182610240516132cb565b51015161151182610360516132cb565b52604061152182610240516132cb565b51015161153182610340516132cb565b5201610c2f565b8061154d611547600193613008565b506137dd565b8051906040670de0b6b3a76400006115696020840151886131ea565b04910151906040519261157b8461322f565b83526020830152604082015261159482610240516132cb565b526115a281610240516132cb565b5001610be9565b610be4565b6020906115b961377e565b82826102405101015201610bc5565b60046040517f3cf7ffaf000000000000000000000000000000000000000000000000000000008152fd5b60046040517feec403f0000000000000000000000000000000000000000000000000000000008152fd5b506102006101805111610b2d565b60046040517f04119bc4000000000000000000000000000000000000000000000000000000008152fd5b60046040517f430f13b3000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb559b0c1000000000000000000000000000000000000000000000000000000008152fd5b5060c43515610ac2565b905060a4351182610aba565b601054608435109150610ab3565b905060643560011b60643581046002146064351517156114b8576084351090610aac565b90506005601054046064351090610aa5565b9050611712600d5460243561338e565b6044351190610a9e565b905061172c600c5460243561338e565b6044351090610a97565b9050611744600b544261338e565b6024351190610a90565b60046040517ffb320373000000000000000000000000000000000000000000000000000000008152fd5b506001600160a01b036008541615610a3b565b60046040517f4d3f73cd000000000000000000000000000000000000000000000000000000008152fd5b60046040517f9100d347000000000000000000000000000000000000000000000000000000008152fd5b60046040517f9e87fac8000000000000000000000000000000000000000000000000000000008152fd5b600460405163ea8e4eb560e01b8152fd5b336102e05152601860205260ff60406102e051205416610a0c576005546040517fdb1e7d550000000000000000000000000000000000000000000000000000000081523360048201524260248201526001600160a01b0390911690602081604481855afa9081156113c5576102e05191611944575b506040517f3ca6d12f00000000000000000000000000000000000000000000000000000000815233600482015242602482015291602090839060449082905afa9182156113c5576102e05192611910575b5060115411908115611904575b5015610a0c57600460405163ea8e4eb560e01b8152fd5b905060125411816118ed565b9091506020813d60201161193c575b8161192c6020938361325f565b81010312610258575190826118e0565b3d915061191f565b90506020813d60201161196e575b8161195f6020938361325f565b8101031261025857518261188f565b3d9150611952565b346102585761198436613095565b816001600160a01b0380941690816102e05152602090602160205260406102e05120938454809211611a7f575b6119bb908661338e565b90808211611a77575b508480821115611a6b576119d7916131c7565b915b6119e283613299565b936119ec84613299565b6102e0519096905b858110611a0e5760405180611a0a8a8a836130f3565b0390f35b8089611a25611a1f6001948661338e565b8661339b565b90549060031b1c1680611a38838b6132cb565b52856102e051526022875260406102e05120906102e05152865260406102e0512054611a64828b6132cb565b52016119f4565b50506102e051916119d9565b9050866119c4565b90945084906119b1565b34610258576102e0513660031901126102585760206001600160a01b0360025416604051908152f35b3461025857602080600319360112610258576004359067ffffffffffffffff8083116102585736602384011215610258578260040135908111610258576024918284019360609084369160608602010111610258576001916001600160a01b0383541633036104195783156117b55785356117b557825b848110611f15575060159485546102e051875580611e98575b50611b4c85613281565b611b59604051918261325f565b858152611b6586613281565b96601f19809801846102e0515b828110611e8257505050815191680100000000000000008311611e695784908254848455808510611dc0575b5001906102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475866102e051925b86858510611d985750506102e05193505050505b858110611d45575050611bf484613299565b94611bfe85613299565b93611c0886613299565b6102e0519094905b878110611cdf577f8ffbc49052f80d2dce4ecff0fa1e5b419a60c404f534547cc24479a659ae8bce611caf8a8a8a611cca8b611cbc8c868d611c976040519182611c8b611c7b611c6b888401976060895260808501906130bf565b848482030160408501528c6130bf565b83838203016060840152896130bf565b0390810183528261325f565b5190209460405198899860a08a5260a08a01906130bf565b91888303908901526130bf565b9085820360408701526130bf565b91606084015260808301520390a16102e05180f35b611cea81898c61376e565b908282360312610258578391868b611d268460405192611d098461322f565b6040808735958681528781019789013588520196013586526132cb565b5251611d32838b6132cb565b5251611d3e82896132cb565b5201611c10565b611d5081878a61376e565b611d5982613008565b919091611d7d57803582558481013587830155604001356002909101558401611be2565b83634e487b7160e01b6102e051526102e0516004526102e051fd5b8160406003935180518755838101518688015501516002860155019201920191908790611bce565b90915060039080600302906003820403611e505784600302600381048603611e3757879392917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590810191015b818110611e1b575050611b9e565b6102e0518082558b820181905560028201558894508201611e0d565b86634e487b7160e01b6102e0515260116004526102e051fd5b85634e487b7160e01b6102e0515260116004526102e051fd5b83634e487b7160e01b6102e0515260416004526102e051fd5b611e8a61377e565b828287010152018590611b72565b60039080600302906003820403611efc57876102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475908101905b818110611ee3575050611b42565b6102e05180825587820181905560028201558201611ed5565b82634e487b7160e01b6102e0515260116004526102e051fd5b611f2081868961376e565b356000198201828111611f4657611f3890878a61376e565b3510156117b5578301611b29565b87634e487b7160e01b6102e0515260116004526102e051fd5b34610258576102e051366003190112610258576020601a54604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360055416604051908152f35b3461025857604036600319011261025857611fc1613059565b611fc961306f565b906001600160a01b03908160015416330361041957818116908115801561205b575b6103c9573b158015612052575b6103c9577fea0caa1c3defc5964d858821058cf025734e4439f261932c2567cced579d9a48926040926001600160a01b03199183836007541617600755168091600854161760085582519182526020820152a16102e05180f35b50823b15611ff8565b5082841615611feb565b34610258576102e051366003190112610258576001600160a01b0360015416330361041957600160ff1960195416176019557ffce805cba192a0e94e99b9309e2e9e2d36cd03bdc97ff6fe47fa5c2ea374d058602060405160018152a16102e05180f35b34610258576102e05136600319011261025857610160600a54600b54600c54600d54600e54600f5460105490601154926012549460135496601454986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152610100840152610120830152610140820152f35b346102585760203660031901126102585761215b613059565b6001600160a01b038060015416330361041957612176613805565b81169081156103c9576102e051479181908190819085905af13d1561221f573d61219f816136e2565b906121ad604051928361325f565b81526102e0513d916020013e5b156121f55760207f958f215bc1323fd729311cf10da76fff907207d3a7473dd1e6a9ddd45fcc4e3491604051908152a26102e0516001815580f35b60046040517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b6121ba565b346102585760203660031901126102585761223d613059565b600154906001600160a01b0390818316330361041957169081156103c957817f7ce7ec0b50378fb6c0186ffb5f48325f6593fcb4ca4386f21861af3129188f5c926001600160a01b03196020931617600155604051908152a16102e05180f35b3461025857602036600319011261025857600435601654811015610258576122c660409161317d565b506001815491015482519182526020820152f35b34610258576102e05136600319011261025857602060ff601954166040519015158152f35b34610258576102e051366003190112610258576001600160a01b03600154163303610419577f1de1f4324ef004c75d006bc373c449ec1984fcfcd7289ceb4c91f7603afe9fd2602060175460ff8082161516809160ff1916176017556040519015158152a16102e05180f35b34610258576020366003190112610258576001600160a01b0361238c613059565b166102e051526018602052602060ff60406102e0512054166040519015158152f35b34610258576040366003190112610258576123c7613059565b602435336102e05152602091601d835260ff60406102e051205416156124a0576001600160a01b037f89809f7807ff6485ae2ed7d7807f69d42cf0d10075d4a0a692c7c13b3f65644c911692836102e05152601f815260406102e05120336102e05152815260406102e05120541580612497575b612472575b836102e05152601f815260406102e05120336102e0515281528260406102e05120556040519283523392a36102e05180f35b836102e0515280805260406102e05120600181540190556001601b5401601b55612440565b5082151561243b565b60046040517fdcc7d314000000000000000000000000000000000000000000000000000000008152fd5b346102585760203660031901126102585760043567ffffffffffffffff81116102585760ff61251461250f610ada612508602095369060040161314f565b36916136fe565b613735565b54166040519015158152f35b346102585760203660031901126102585760ff61253b613085565b166102e05152600960205260206001600160a01b0360406102e051205416604051908152f35b346102585760403660031901126102585761257a613059565b602435336102e05152602091601d835260ff60406102e051205416156124a0576001600160a01b037fec970878748a354cac92e71a4fc8c704a363497a0bc38f8a9d1cbb34cc75b819911692836102e051526022815260406102e05120336102e05152815260406102e05120541561261f575b836102e051526022815260406102e05120336102e0515281528260406102e05120556040519283523392a36102e05180f35b836102e05152602181526126393360406102e051206136a1565b6125ed565b34610258576102e0513660031901126102585760206001600160a01b0360065416604051908152f35b34610258576102e051366003190112610258576020601654604051908152f35b34610258576102e051366003190112610258576001600160a01b036001541633036104195760ff19601954166019557ffce805cba192a0e94e99b9309e2e9e2d36cd03bdc97ff6fe47fa5c2ea374d05860206040516102e0518152a16102e05180f35b34610258576020366003190112610258576001600160a01b0361270b613059565b166102e05152601e602052602060406102e0512054604051908152f35b34610258576020366003190112610258576001600160a01b03612749613059565b166102e0515260208052602060406102e0512054604051908152f35b3461025857610160366003190112610258576001600160a01b03600154163303610419576127916133b3565b6102e05180f35b34610258576127a636613095565b816001600160a01b0380941690816102e05152602090601e60205260406102e05120938454809211612897575b6127dd908661338e565b9080821161288f575b508480821115612883576127f9916131c7565b915b61280483613299565b9361280e84613299565b6102e0519096905b85811061282c5760405180611a0a8a8a836130f3565b808961283d611a1f6001948661338e565b90549060031b1c1680612850838b6132cb565b52856102e05152601f875260406102e05120906102e05152865260406102e051205461287c828b6132cb565b5201612816565b50506102e051916127fb565b9050866127e6565b90945084906127d3565b3461025857602080600319360112610258576128bb613059565b906128c4613805565b6001600160a01b038060025416928333036105ae57811691604051937f70a082310000000000000000000000000000000000000000000000000000000085523060048601528185602481875afa9485156113c5576102e05195612a06575b5084612934575b6102e0516001815580f35b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602481018590528181806044810103816102e051885af19081156113c5576102e051916129d0575b50156121f5577f29bf5eed629f77b5e39562ac2230a5362da14218fffd69cc3b390fd74a2a5e4d916002541693604051908152a38080808080612929565b90508181813d83116129ff575b6129e7818361325f565b81010312610258575180151581036102585785612992565b503d6129dd565b9094508181813d8311612a2e575b612a1e818361325f565b8101031261025857519385612922565b503d612a14565b34610258576020366003190112610258576004356102e05152601c60205260206001600160a01b0360406102e051205416604051908152f35b3461025857604036600319011261025857612a87613085565b612a8f61306f565b906001600160a01b0380600154163303610419578216918215908115612b0c575b506103c957602060ff7fbc036f456b8307b0ab3d9db4c2982c498aa045ad74984749772339f9be1b99e1921692836102e051526009825260406102e05120816001600160a01b0319825416179055604051908152a26102e05180f35b90503b1583612ab0565b34610258576020366003190112610258576040612b39612b34613059565b6132df565b82519182526020820152f35b34610258576102e05136600319011261025857602060ff601754166040519015158152f35b346102585760203660031901126102585760043560155481101561025857612b93606091613008565b50805490600260018201549101549060405192835260208301526040820152f35b34610258576020806003193601126102585760043567ffffffffffffffff918282116102585736602383011215610258578160040135928311610258576024808301928136918660061b010111610258576001946001600160a01b038654163303612ff95750831561178b57823561178b57845b848110612f93575060169081546102e051835580612f03575b50612c4b85613281565b612c58604051918261325f565b858152612c6486613281565b92601f19809401856102e0515b828110612edb57505050815191680100000000000000008311611e695785908254848455808510612e3b575b5001906102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289886102e051925b87858510612e1d5750506102e05193505050505b858110612df0575050612cf384613299565b94612cfd85613299565b6102e0519094905b868110612da1577ff2ec1c1703872f16f9f9d322f15bce4a41751f66c3f670011ce6a2affbb0bee4612d7f898989612d8c8a8a604051612d67838201926040845282611c8b612d57606083018c6130bf565b83838203016040840152896130bf565b519020926040519687966080885260808801906130bf565b91868303908701526130bf565b91604084015260608301520390a16102e05180f35b612dac8188846131b7565b90604082360312610258578391604051612dc5816131fd565b8780833592838152019201358252612ddd838c6132cb565b5251612de982896132cb565b5201612d05565b612dfb8187876131b7565b612e048261317d565b919091611d7d5780358255850135908801558601612ce1565b81816002935180518755015184860155019201920191908990612ccd565b9091507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168203611e505784168403612ec2579086917fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289908b1b810190858c1b015b818110612eac5750612c9d565b6102e0518082558c820155889350600201612e9f565b84634e487b7160e01b6102e0515260116004526102e051fd5b604051612ee7816131fd565b6102e05181526102e05183820152828287010152018690612c71565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612f7a57826102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990871b8101905b818110612f675750612c41565b6102e05180825588820155600201612f5a565b50634e487b7160e01b6102e0515260116004526102e051fd5b612f9e8186866131b7565b356000198201828111612fe057612fb69087876131b7565b35101561178b5767016345785d8a000083612fd28388886131b7565b01351161178b578501612c28565b83634e487b7160e01b6102e0515260116004526102e051fd5b80637bfa4b9f60e01b60049252fd5b601554811015613043576003906015600052027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b634e487b7160e01b600052603260045260246000fd5b600435906001600160a01b038216820361042a57565b602435906001600160a01b038216820361042a57565b6004359060ff8216820361042a57565b606090600319011261042a576004356001600160a01b038116810361042a57906024359060443590565b90815180825260208080930193019160005b8281106130df575050505090565b8351855293810193928101926001016130d1565b9092916040820191604081528451809352606081019260208096019060005b8181106131325750505061312f93945060208184039101526130bf565b90565b82516001600160a01b031686529487019491870191600101613112565b9181601f8401121561042a5782359167ffffffffffffffff831161042a576020838186019501011161042a57565b60165481101561304357601660005260011b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890190600090565b91908110156130435760061b0190565b919082039182116131d457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156131d457565b6040810190811067ffffffffffffffff82111761321957604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761321957604052565b67ffffffffffffffff811161321957604052565b90601f8019910116810190811067ffffffffffffffff82111761321957604052565b67ffffffffffffffff81116132195760051b60200190565b906132a382613281565b6132b0604051918261325f565b82815280926132c1601f1991613281565b0190602036910137565b80518210156130435760209160051b010190565b601654908115613364576001600160a01b036000911660005260208052604060002054600092805b613320575b505050600161331a8261317d565b50015491565b6000198101908111613350576133358161317d565b50548210156133445780613307565b9250505038808061330c565b602483634e487b7160e01b81526011600452fd5b60046040517f80130597000000000000000000000000000000000000000000000000000000008152fd5b919082018092116131d457565b80548210156130435760005260206000200190600090565b600480359081158015613697575b801561368c575b613638576044359081158015613682575b8015613677575b6136385760843580156136475760a43590811561366757610124359361014435958686116136575760c43594851561363857670b1a2bc2ec50000080851161364757613441670de0b6b3a764000061343888886131ea565b0460035461338e565b116136385760405160208101600a548152600b546040830152600c546060830152600d546080830152600e5460a0830152600f5460c083015260105460e08301526011546101008301526012546101208301526013546101408301526014546101609081840152825261018082019282841067ffffffffffffffff85111761362357508260405281519020916135526101a083019261353e84906101608201916004358152602435602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b0361019f198101835261017f19018261325f565b5190201461361a57600a55602435600b55600c55606435600d55600e55600f5560105560e435601155610104356012556013556014557f323800cdf49b0c494e99c49a77327176bfd8d938718fd7a9c8c8814db087a4526040518061361581906101608201916004358152602435602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b0390a1565b50505050505050565b604190634e487b7160e01b6000525260246000fd5b604051635435b28960e11b8152fd5b50604051635435b28960e11b8152fd5b84604051635435b28960e11b8152fd5b82604051635435b28960e11b8152fd5b5060643582116133e0565b50606435156133d9565b5060243582116133c8565b50602435156133c1565b805468010000000000000000811015613219576136c39160018201815561339b565b6001600160a01b039291928084549260031b9316831b921b1916179055565b67ffffffffffffffff811161321957601f01601f191660200190565b92919261370a826136e2565b91613718604051938461325f565b82948184528183011161042a578281602093846000960137010152565b604051908181519160005b8381106137595750506020918101602381520301902090565b60208282018101518683015285935001613740565b9190811015613043576060020190565b6040519061378b8261322f565b60006040838281528260208201520152565b908060209392818452848401376000828201840152601f01601f1916010190565b9081602091031261042a57516001600160a01b038116810361042a5790565b906040516137ea8161322f565b60406002829480548452600181015460208501520154910152565b600260005414613816576002600055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b908151811015613043570160200190565b908151613876613860826136e2565b9161386e604051938461325f565b8083526136e2565b60209390601f1901368386013760005b8151811015613915576138998183613840565b51907fff00000000000000000000000000000000000000000000000000000000000000808316604160f81b81101580613907575b156138fc57508660f893841c0160ff81116131d4576001931b165b60001a6138f58286613840565b5301613886565b9050600192506138e8565b50602d60f91b8111156138cd565b5090925050565b90821015613043570190565b908015801561399d575b6139965760009060005b81811061394a575050905090565b61395581838661391c565b3560f81c602090818110801561398c575b6139815703613978575b60010161393c565b60019250613970565b505050505050600090565b50607e8111613966565b5050600090565b5060208111613932565b81158015613af2575b6139965760009060005b8381106139ca5750505050600190565b7fff000000000000000000000000000000000000000000000000000000000000006139f682868561391c565b3516604160f81b81101580613ae4575b159081613a87575b81613a28575b50613a21576001016139ba565b5050905090565b7f3000000000000000000000000000000000000000000000000000000000000000811015915081613a5c575b501538613a14565b7f39000000000000000000000000000000000000000000000000000000000000009150111538613a54565b90507f610000000000000000000000000000000000000000000000000000000000000081101580613aba575b1590613a0e565b507f7a00000000000000000000000000000000000000000000000000000000000000811115613ab3565b50602d60f91b811115613a06565b50600b82116139b0565b917fff00000000000000000000000000000000000000000000000000000000000000906040519260208401947f4232463a43414d504149474e000000000000000000000000000000000000000086526bffffffffffffffffffffffff199060601b16602c850152604084015260f81b1660608201524660618201526061815260a0810181811067ffffffffffffffff821117613219576040525190209056fea164736f6c6343000818000a000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd1100000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c725
Deployed Bytecode
0x61038080604052600436101561001457600080fd5b60006102e0526102e0513560e01c90816301504ea014612bb457508063039af9eb14612b6a57806304daaab514612b455780630781785314612b16578063134abd1414612a6e578063141961bc14612a355780631c46c674146128a157806325f93732146127985780632d8ae0e6146127655780633aa82b61146127285780633e1af218146126ea5780633f4ba83a1461268757806341f5d08f1461266757806342e597d91461263e5780634ad6841e146125615780634ceb8dfa146125205780634d0094d1146124ca5780635108f432146123ae578063552324671461236b578063566130c0146122ff5780635c975abb146122da5780636298e1771461229d578063704b6c021461222457806378c093cf1461214257806379502c55146120c95780638456cb591461206557806388d43a0d14611fa85780638cd6a1d814611f7f578063a1011a5c14611f5f578063a657a65b14611ab2578063b19ab07614611a89578063be5f523f14611976578063c3748e511461091a578063c5a14e2614610839578063de1705701461074c578063dfc0d3db14610659578063e104471f1461061b578063e2714e1b146105d8578063e2eba8f51461050f578063e62fe44b146104e6578063e77772fe146104bd578063ea0d5bb51461042f578063efa891c4146102f1578063f123220e146102d1578063f60826ee146102a8578063f851a4401461027f578063fc3c28af1461025f5763fd4c7a291461023857600080fd5b34610258576102e051366003190112610258576020601554604051908152f35b6102e05180fd5b34610258576102e051366003190112610258576020600354604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360015416604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360085416604051908152f35b34610258576102e051366003190112610258576020601b54604051908152f35b346102585760603660031901126102585761030a613059565b61031261306f565b906001600160a01b03906044358281169081810361042a578360015416330361041957838316928315801561040f575b8015610407575b6103c9573b159081156103fd575b81156103f3575b506103c9577fa36e23d84e1356c9eb876077cf3c018ef0f8aa6abdb0c04bba69fa9c67f7a6ef93816060946001600160a01b03199285846004541617600455169182816005541617600555600654161760065560405192835260208301526040820152a16102e05180f35b60046040517fe6c4247b000000000000000000000000000000000000000000000000000000008152fd5b90503b158561035e565b853b159150610357565b508215610349565b5084861615610342565b6004604051637bfa4b9f60e01b8152fd5b600080fd5b3461025857604036600319011261025857610448613059565b60243590811515809203610258576001600160a01b039081600154163303610419577f0f44f503bff4a52f1ccd91110e3aed357fadfe7236be6772d658208a241670a4916020911692836102e051526018825260406102e0512060ff1981541660ff8316179055604051908152a26102e05180f35b34610258576102e0513660031901126102585760206001600160a01b0360075416604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360045416604051908152f35b3461025857604036600319011261025857610528613059565b602435600254916001600160a01b039081841633036105ae57169182156103c957662386f26fc10000821161059d577ff31943dded09c3880df46a0a37c958c5d1f65761fa770ff9b2947ebe2fbd243191836001600160a01b0319602093161760025580600355604051908152a26102e05180f35b6004604051635435b28960e11b8152fd5b60046040517f8cf65e50000000000000000000000000000000000000000000000000000000008152fd5b34610258576020366003190112610258576001600160a01b036105f9613059565b166102e05152601d602052602060ff60406102e0512054166040519015158152f35b34610258576020366003190112610258576001600160a01b0361063c613059565b166102e051526021602052602060406102e0512054604051908152f35b3461025857606036600319011261025857610672613059565b60443560ff811680820361042a576102e0515260096020526001600160a01b03908160406102e0512054168015610722576106b66107199260209560243590613afc565b30916001600160a01b03926055926043926040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c820120607882015201201690565b60405191168152f35b60046040517f40dde935000000000000000000000000000000000000000000000000000000008152fd5b34610258576102e0513660031901126102585760155461076b81613281565b610778604051918261325f565b81815260209060208101928360156102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4756102e051915b83831061081c5785858860405191602083019060208452518091526040830191936102e0515b8281106107e55784840385f35b9091928260608261080d6001948a516040809180518452602081015160208501520151910152565b019601910194929190946107d8565b60038660019261082b856137dd565b8152019201920191906107b2565b34610258576102e0513660031901126102585760165461085881613281565b610865604051918261325f565b818152602090818101928360166102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242896102e051915b8383106108ee578585886040519183830190848452518091526040830191936102e0515b8281106108cf5784840385f35b85518051855282015184830152948101946040909301926001016108c2565b600286600192604051610900816131fd565b85548152848601548382015281520192019201919061089e565b346102585761016036600319011261025857610934613085565b6102205260e43567ffffffffffffffff81116102585761095890369060040161314f565b6101e0526101205267ffffffffffffffff610104351161025857610982366101043560040161314f565b610140526101605267ffffffffffffffff6101243511610258576109ac366101243560040161314f565b610180526101a05267ffffffffffffffff6101443511610258576109d6366101443560040161314f565b610200526101c0526109e6613805565b60175460ff1661181a57336102e05152601860205260ff60406102e05120541615611809575b60ff601954166117df5760155480156117b5576016541561178b576001600160a01b0360075416158015611778575b61174e5760ff61022051166102e05152600960205260406102e0512054610320526001600160a01b0361032051161561072257610a77336132df565b50610a84600a544261338e565b60243510908115611736575b811561171c575b8115611702575b81156116f0575b81156116cc575b81156116be575b81156116b2575b5080156116a8575b61059d57610adf610ada3661014051610160516136fe565b613851565b6101005260ff610af161010051613735565b541661167e57610b076101e05161012051613928565b1561165457610b1c61014051610160516139a7565b1561162a576101805115801561161c575b6115f257600e5490670b1a2bc2ec500000828103116114b85760035491610b5e8382670b1a2bc2ec500000036131c7565b60a435116115c857610b90670de0b6b3a7640000610b88670b1a2bc2ec50000093600f54906131ea565b04809461338e565b116115c857610bb1610ba182613281565b604051610240526102405161325f565b806102405152610bc081613281565b6102e0515b601f19820181106115ae5750506010546064358110156115a957506064355b6102e0515b828110611538578361024051516102c052610c066102c051613299565b6102a052610c166102c051613299565b61036052610c266102c051613299565b610340526102e0515b6102c05181106114d25750601a54610300526001610300510161030051116114b857610c65610220516001610300510133613afc565b610cd830826001600160a01b0361032051166001600160a01b03926055926043926040519260388401526f5af43d82803e903d91602b57fd5bf3ff60248401526014830152733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c820120607882015201201690565b61028052763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff6103205160881c16176102e051526e5af43d82803e903d91602b57fd5bf36effffffffffffffffffffffffffffff196103205160781b1617602052603760096102e051f5610260526001600160a01b0361026051161561148e576001600160a01b0361028051166001600160a01b03610260511603611464576001600160a01b03600454166001600160a01b036005541660c0526001600160a01b036006541660e05260035491600e5460135493601454936001600160a01b0361026051163b156102585760405160a0527f4c7f67910000000000000000000000000000000000000000000000000000000060a0515230600460a051015233602460a0510152604460a051015260c051606460a051015260e051608460a051015260c43560a460a051015260243560c460a051015260443560e460a051015260643561010460a051015260843561012460a051015260a43561014460a051015261016460a051015261018460a05101526101a460a05101526102c06101c460a0510152610ece610eb0610e926102c460a051016101e0516101205161379d565b60031960a0518203016101e460a0510152610140516101605161379d565b60031960a05182030161020460a0510152610180516101a05161379d565b9160031960a05184030161022460a05101526020610240515193848152019260206102405101906102e0515b818110611430575050506001610300510161024460a051015261026460a051015261028460a051015260031960a0518203016102a460a05101526102e0519060a05190610f5160a05191610200516101c05161379d565b0360a0516102e0516001600160a01b0361026051165af180156113c557611420575b6001600160a01b0360075416803b156102585760405190636733c5ab60e11b82526001600160a01b036102605116600483015260016024830152816044816102e051936102e051905af180156113c557611409575b506001600160a01b0360085416803b156102585760405190636733c5ab60e11b82526001600160a01b036102605116600483015260016024830152816044816102e051936102e051905af180156113c5576113f2575b50600161030051016102e05152601c60205260406102e051206001600160a01b0361026051166001600160a01b0319825416179055336102e05152601e6020526110716102605160406102e051206136a1565b6001600160a01b0361026051166102e05152601d60205260406102e0512060ff199060018282541617905560016110aa61010051613735565b91825416179055602460206001600160a01b0360075416604051928380927f764dc4e70000000000000000000000000000000000000000000000000000000082526001600160a01b03610260511660048301525afa9081156113c5576102e051916113d3575b50602460206001600160a01b0360085416604051928380927fd324672d0000000000000000000000000000000000000000000000000000000082526001600160a01b03610260511660048301525afa80156113c5576001600160a01b03916102e05191611396575b506001601a5401601a55816006541660135460145460035490600e5492670de0b6b3a76400006111aa600f54866131ea565b0494604051608052600161030051016080515260206080510152602435604060805101526044356060608051015260808051015260a0608051015260643560c0608051015260843560e0608051015260c435610100608051015260a43561012060805101526101406080510152610160608051015261018060805101526102606101a060805101528161128461126a611250610260608051016101e0516101205161379d565b60805181036101c06080510152610140516101605161379d565b60805181036101e06080510152610180516101a05161379d565b931661020060805101521661022060805101526080518103610240608051015233906001600160a01b036102605116907f1a7b12acef2243431002358b324fad26e2629011adef23a29fd74e8812003c9a60ff6102205116916112f160805191610200516101c05161379d565b03608051a460405160808152611335611324611313608084016102a0516130bf565b8381036020850152610360516130bf565b8281036040840152610340516130bf565b6102c05160608301527fd2a15eb3553dc794f74c79b8d6b20b9aa48e3c482b59635eac3867000de3286c6001600160a01b036102605116928060016103005101930390a360016102e0515560206040516001600160a01b0361026051168152f35b6113b8915060203d6020116113be575b6113b0818361325f565b8101906137be565b83611178565b503d6113a6565b6040513d6102e051823e3d90fd5b6113ec915060203d6020116113be576113b0818361325f565b81611110565b6113fb9061324b565b6102e051610258578061101e565b6114129061324b565b6102e0516102585780610fc8565b61142b60a05161324b565b610f73565b90919460206060826114596001948a516040809180518452602081015160208501520151910152565b019601929101610efa565b60046040517ffdce8f42000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb06ebf3d000000000000000000000000000000000000000000000000000000008152fd5b634e487b7160e01b6102e05152601160045260246102e051fd5b806114e2600192610240516132cb565b51516114f1826102a0516132cb565b52602061150182610240516132cb565b51015161151182610360516132cb565b52604061152182610240516132cb565b51015161153182610340516132cb565b5201610c2f565b8061154d611547600193613008565b506137dd565b8051906040670de0b6b3a76400006115696020840151886131ea565b04910151906040519261157b8461322f565b83526020830152604082015261159482610240516132cb565b526115a281610240516132cb565b5001610be9565b610be4565b6020906115b961377e565b82826102405101015201610bc5565b60046040517f3cf7ffaf000000000000000000000000000000000000000000000000000000008152fd5b60046040517feec403f0000000000000000000000000000000000000000000000000000000008152fd5b506102006101805111610b2d565b60046040517f04119bc4000000000000000000000000000000000000000000000000000000008152fd5b60046040517f430f13b3000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb559b0c1000000000000000000000000000000000000000000000000000000008152fd5b5060c43515610ac2565b905060a4351182610aba565b601054608435109150610ab3565b905060643560011b60643581046002146064351517156114b8576084351090610aac565b90506005601054046064351090610aa5565b9050611712600d5460243561338e565b6044351190610a9e565b905061172c600c5460243561338e565b6044351090610a97565b9050611744600b544261338e565b6024351190610a90565b60046040517ffb320373000000000000000000000000000000000000000000000000000000008152fd5b506001600160a01b036008541615610a3b565b60046040517f4d3f73cd000000000000000000000000000000000000000000000000000000008152fd5b60046040517f9100d347000000000000000000000000000000000000000000000000000000008152fd5b60046040517f9e87fac8000000000000000000000000000000000000000000000000000000008152fd5b600460405163ea8e4eb560e01b8152fd5b336102e05152601860205260ff60406102e051205416610a0c576005546040517fdb1e7d550000000000000000000000000000000000000000000000000000000081523360048201524260248201526001600160a01b0390911690602081604481855afa9081156113c5576102e05191611944575b506040517f3ca6d12f00000000000000000000000000000000000000000000000000000000815233600482015242602482015291602090839060449082905afa9182156113c5576102e05192611910575b5060115411908115611904575b5015610a0c57600460405163ea8e4eb560e01b8152fd5b905060125411816118ed565b9091506020813d60201161193c575b8161192c6020938361325f565b81010312610258575190826118e0565b3d915061191f565b90506020813d60201161196e575b8161195f6020938361325f565b8101031261025857518261188f565b3d9150611952565b346102585761198436613095565b816001600160a01b0380941690816102e05152602090602160205260406102e05120938454809211611a7f575b6119bb908661338e565b90808211611a77575b508480821115611a6b576119d7916131c7565b915b6119e283613299565b936119ec84613299565b6102e0519096905b858110611a0e5760405180611a0a8a8a836130f3565b0390f35b8089611a25611a1f6001948661338e565b8661339b565b90549060031b1c1680611a38838b6132cb565b52856102e051526022875260406102e05120906102e05152865260406102e0512054611a64828b6132cb565b52016119f4565b50506102e051916119d9565b9050866119c4565b90945084906119b1565b34610258576102e0513660031901126102585760206001600160a01b0360025416604051908152f35b3461025857602080600319360112610258576004359067ffffffffffffffff8083116102585736602384011215610258578260040135908111610258576024918284019360609084369160608602010111610258576001916001600160a01b0383541633036104195783156117b55785356117b557825b848110611f15575060159485546102e051875580611e98575b50611b4c85613281565b611b59604051918261325f565b858152611b6586613281565b96601f19809801846102e0515b828110611e8257505050815191680100000000000000008311611e695784908254848455808510611dc0575b5001906102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475866102e051925b86858510611d985750506102e05193505050505b858110611d45575050611bf484613299565b94611bfe85613299565b93611c0886613299565b6102e0519094905b878110611cdf577f8ffbc49052f80d2dce4ecff0fa1e5b419a60c404f534547cc24479a659ae8bce611caf8a8a8a611cca8b611cbc8c868d611c976040519182611c8b611c7b611c6b888401976060895260808501906130bf565b848482030160408501528c6130bf565b83838203016060840152896130bf565b0390810183528261325f565b5190209460405198899860a08a5260a08a01906130bf565b91888303908901526130bf565b9085820360408701526130bf565b91606084015260808301520390a16102e05180f35b611cea81898c61376e565b908282360312610258578391868b611d268460405192611d098461322f565b6040808735958681528781019789013588520196013586526132cb565b5251611d32838b6132cb565b5251611d3e82896132cb565b5201611c10565b611d5081878a61376e565b611d5982613008565b919091611d7d57803582558481013587830155604001356002909101558401611be2565b83634e487b7160e01b6102e051526102e0516004526102e051fd5b8160406003935180518755838101518688015501516002860155019201920191908790611bce565b90915060039080600302906003820403611e505784600302600381048603611e3757879392917f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590810191015b818110611e1b575050611b9e565b6102e0518082558b820181905560028201558894508201611e0d565b86634e487b7160e01b6102e0515260116004526102e051fd5b85634e487b7160e01b6102e0515260116004526102e051fd5b83634e487b7160e01b6102e0515260416004526102e051fd5b611e8a61377e565b828287010152018590611b72565b60039080600302906003820403611efc57876102e051527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475908101905b818110611ee3575050611b42565b6102e05180825587820181905560028201558201611ed5565b82634e487b7160e01b6102e0515260116004526102e051fd5b611f2081868961376e565b356000198201828111611f4657611f3890878a61376e565b3510156117b5578301611b29565b87634e487b7160e01b6102e0515260116004526102e051fd5b34610258576102e051366003190112610258576020601a54604051908152f35b34610258576102e0513660031901126102585760206001600160a01b0360055416604051908152f35b3461025857604036600319011261025857611fc1613059565b611fc961306f565b906001600160a01b03908160015416330361041957818116908115801561205b575b6103c9573b158015612052575b6103c9577fea0caa1c3defc5964d858821058cf025734e4439f261932c2567cced579d9a48926040926001600160a01b03199183836007541617600755168091600854161760085582519182526020820152a16102e05180f35b50823b15611ff8565b5082841615611feb565b34610258576102e051366003190112610258576001600160a01b0360015416330361041957600160ff1960195416176019557ffce805cba192a0e94e99b9309e2e9e2d36cd03bdc97ff6fe47fa5c2ea374d058602060405160018152a16102e05180f35b34610258576102e05136600319011261025857610160600a54600b54600c54600d54600e54600f5460105490601154926012549460135496601454986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152610100840152610120830152610140820152f35b346102585760203660031901126102585761215b613059565b6001600160a01b038060015416330361041957612176613805565b81169081156103c9576102e051479181908190819085905af13d1561221f573d61219f816136e2565b906121ad604051928361325f565b81526102e0513d916020013e5b156121f55760207f958f215bc1323fd729311cf10da76fff907207d3a7473dd1e6a9ddd45fcc4e3491604051908152a26102e0516001815580f35b60046040517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b6121ba565b346102585760203660031901126102585761223d613059565b600154906001600160a01b0390818316330361041957169081156103c957817f7ce7ec0b50378fb6c0186ffb5f48325f6593fcb4ca4386f21861af3129188f5c926001600160a01b03196020931617600155604051908152a16102e05180f35b3461025857602036600319011261025857600435601654811015610258576122c660409161317d565b506001815491015482519182526020820152f35b34610258576102e05136600319011261025857602060ff601954166040519015158152f35b34610258576102e051366003190112610258576001600160a01b03600154163303610419577f1de1f4324ef004c75d006bc373c449ec1984fcfcd7289ceb4c91f7603afe9fd2602060175460ff8082161516809160ff1916176017556040519015158152a16102e05180f35b34610258576020366003190112610258576001600160a01b0361238c613059565b166102e051526018602052602060ff60406102e0512054166040519015158152f35b34610258576040366003190112610258576123c7613059565b602435336102e05152602091601d835260ff60406102e051205416156124a0576001600160a01b037f89809f7807ff6485ae2ed7d7807f69d42cf0d10075d4a0a692c7c13b3f65644c911692836102e05152601f815260406102e05120336102e05152815260406102e05120541580612497575b612472575b836102e05152601f815260406102e05120336102e0515281528260406102e05120556040519283523392a36102e05180f35b836102e0515280805260406102e05120600181540190556001601b5401601b55612440565b5082151561243b565b60046040517fdcc7d314000000000000000000000000000000000000000000000000000000008152fd5b346102585760203660031901126102585760043567ffffffffffffffff81116102585760ff61251461250f610ada612508602095369060040161314f565b36916136fe565b613735565b54166040519015158152f35b346102585760203660031901126102585760ff61253b613085565b166102e05152600960205260206001600160a01b0360406102e051205416604051908152f35b346102585760403660031901126102585761257a613059565b602435336102e05152602091601d835260ff60406102e051205416156124a0576001600160a01b037fec970878748a354cac92e71a4fc8c704a363497a0bc38f8a9d1cbb34cc75b819911692836102e051526022815260406102e05120336102e05152815260406102e05120541561261f575b836102e051526022815260406102e05120336102e0515281528260406102e05120556040519283523392a36102e05180f35b836102e05152602181526126393360406102e051206136a1565b6125ed565b34610258576102e0513660031901126102585760206001600160a01b0360065416604051908152f35b34610258576102e051366003190112610258576020601654604051908152f35b34610258576102e051366003190112610258576001600160a01b036001541633036104195760ff19601954166019557ffce805cba192a0e94e99b9309e2e9e2d36cd03bdc97ff6fe47fa5c2ea374d05860206040516102e0518152a16102e05180f35b34610258576020366003190112610258576001600160a01b0361270b613059565b166102e05152601e602052602060406102e0512054604051908152f35b34610258576020366003190112610258576001600160a01b03612749613059565b166102e0515260208052602060406102e0512054604051908152f35b3461025857610160366003190112610258576001600160a01b03600154163303610419576127916133b3565b6102e05180f35b34610258576127a636613095565b816001600160a01b0380941690816102e05152602090601e60205260406102e05120938454809211612897575b6127dd908661338e565b9080821161288f575b508480821115612883576127f9916131c7565b915b61280483613299565b9361280e84613299565b6102e0519096905b85811061282c5760405180611a0a8a8a836130f3565b808961283d611a1f6001948661338e565b90549060031b1c1680612850838b6132cb565b52856102e05152601f875260406102e05120906102e05152865260406102e051205461287c828b6132cb565b5201612816565b50506102e051916127fb565b9050866127e6565b90945084906127d3565b3461025857602080600319360112610258576128bb613059565b906128c4613805565b6001600160a01b038060025416928333036105ae57811691604051937f70a082310000000000000000000000000000000000000000000000000000000085523060048601528185602481875afa9485156113c5576102e05195612a06575b5084612934575b6102e0516001815580f35b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602481018590528181806044810103816102e051885af19081156113c5576102e051916129d0575b50156121f5577f29bf5eed629f77b5e39562ac2230a5362da14218fffd69cc3b390fd74a2a5e4d916002541693604051908152a38080808080612929565b90508181813d83116129ff575b6129e7818361325f565b81010312610258575180151581036102585785612992565b503d6129dd565b9094508181813d8311612a2e575b612a1e818361325f565b8101031261025857519385612922565b503d612a14565b34610258576020366003190112610258576004356102e05152601c60205260206001600160a01b0360406102e051205416604051908152f35b3461025857604036600319011261025857612a87613085565b612a8f61306f565b906001600160a01b0380600154163303610419578216918215908115612b0c575b506103c957602060ff7fbc036f456b8307b0ab3d9db4c2982c498aa045ad74984749772339f9be1b99e1921692836102e051526009825260406102e05120816001600160a01b0319825416179055604051908152a26102e05180f35b90503b1583612ab0565b34610258576020366003190112610258576040612b39612b34613059565b6132df565b82519182526020820152f35b34610258576102e05136600319011261025857602060ff601754166040519015158152f35b346102585760203660031901126102585760043560155481101561025857612b93606091613008565b50805490600260018201549101549060405192835260208301526040820152f35b34610258576020806003193601126102585760043567ffffffffffffffff918282116102585736602383011215610258578160040135928311610258576024808301928136918660061b010111610258576001946001600160a01b038654163303612ff95750831561178b57823561178b57845b848110612f93575060169081546102e051835580612f03575b50612c4b85613281565b612c58604051918261325f565b858152612c6486613281565b92601f19809401856102e0515b828110612edb57505050815191680100000000000000008311611e695785908254848455808510612e3b575b5001906102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289886102e051925b87858510612e1d5750506102e05193505050505b858110612df0575050612cf384613299565b94612cfd85613299565b6102e0519094905b868110612da1577ff2ec1c1703872f16f9f9d322f15bce4a41751f66c3f670011ce6a2affbb0bee4612d7f898989612d8c8a8a604051612d67838201926040845282611c8b612d57606083018c6130bf565b83838203016040840152896130bf565b519020926040519687966080885260808801906130bf565b91868303908701526130bf565b91604084015260608301520390a16102e05180f35b612dac8188846131b7565b90604082360312610258578391604051612dc5816131fd565b8780833592838152019201358252612ddd838c6132cb565b5251612de982896132cb565b5201612d05565b612dfb8187876131b7565b612e048261317d565b919091611d7d5780358255850135908801558601612ce1565b81816002935180518755015184860155019201920191908990612ccd565b9091507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8082168203611e505784168403612ec2579086917fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289908b1b810190858c1b015b818110612eac5750612c9d565b6102e0518082558c820155889350600201612e9f565b84634e487b7160e01b6102e0515260116004526102e051fd5b604051612ee7816131fd565b6102e05181526102e05183820152828287010152018690612c71565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612f7a57826102e051527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990871b8101905b818110612f675750612c41565b6102e05180825588820155600201612f5a565b50634e487b7160e01b6102e0515260116004526102e051fd5b612f9e8186866131b7565b356000198201828111612fe057612fb69087876131b7565b35101561178b5767016345785d8a000083612fd28388886131b7565b01351161178b578501612c28565b83634e487b7160e01b6102e0515260116004526102e051fd5b80637bfa4b9f60e01b60049252fd5b601554811015613043576003906015600052027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b634e487b7160e01b600052603260045260246000fd5b600435906001600160a01b038216820361042a57565b602435906001600160a01b038216820361042a57565b6004359060ff8216820361042a57565b606090600319011261042a576004356001600160a01b038116810361042a57906024359060443590565b90815180825260208080930193019160005b8281106130df575050505090565b8351855293810193928101926001016130d1565b9092916040820191604081528451809352606081019260208096019060005b8181106131325750505061312f93945060208184039101526130bf565b90565b82516001600160a01b031686529487019491870191600101613112565b9181601f8401121561042a5782359167ffffffffffffffff831161042a576020838186019501011161042a57565b60165481101561304357601660005260011b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890190600090565b91908110156130435760061b0190565b919082039182116131d457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156131d457565b6040810190811067ffffffffffffffff82111761321957604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761321957604052565b67ffffffffffffffff811161321957604052565b90601f8019910116810190811067ffffffffffffffff82111761321957604052565b67ffffffffffffffff81116132195760051b60200190565b906132a382613281565b6132b0604051918261325f565b82815280926132c1601f1991613281565b0190602036910137565b80518210156130435760209160051b010190565b601654908115613364576001600160a01b036000911660005260208052604060002054600092805b613320575b505050600161331a8261317d565b50015491565b6000198101908111613350576133358161317d565b50548210156133445780613307565b9250505038808061330c565b602483634e487b7160e01b81526011600452fd5b60046040517f80130597000000000000000000000000000000000000000000000000000000008152fd5b919082018092116131d457565b80548210156130435760005260206000200190600090565b600480359081158015613697575b801561368c575b613638576044359081158015613682575b8015613677575b6136385760843580156136475760a43590811561366757610124359361014435958686116136575760c43594851561363857670b1a2bc2ec50000080851161364757613441670de0b6b3a764000061343888886131ea565b0460035461338e565b116136385760405160208101600a548152600b546040830152600c546060830152600d546080830152600e5460a0830152600f5460c083015260105460e08301526011546101008301526012546101208301526013546101408301526014546101609081840152825261018082019282841067ffffffffffffffff85111761362357508260405281519020916135526101a083019261353e84906101608201916004358152602435602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b0361019f198101835261017f19018261325f565b5190201461361a57600a55602435600b55600c55606435600d55600e55600f5560105560e435601155610104356012556013556014557f323800cdf49b0c494e99c49a77327176bfd8d938718fd7a9c8c8814db087a4526040518061361581906101608201916004358152602435602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e43560e0820152610104356101008201526101243561012082015261014061014435910152565b0390a1565b50505050505050565b604190634e487b7160e01b6000525260246000fd5b604051635435b28960e11b8152fd5b50604051635435b28960e11b8152fd5b84604051635435b28960e11b8152fd5b82604051635435b28960e11b8152fd5b5060643582116133e0565b50606435156133d9565b5060243582116133c8565b50602435156133c1565b805468010000000000000000811015613219576136c39160018201815561339b565b6001600160a01b039291928084549260031b9316831b921b1916179055565b67ffffffffffffffff811161321957601f01601f191660200190565b92919261370a826136e2565b91613718604051938461325f565b82948184528183011161042a578281602093846000960137010152565b604051908181519160005b8381106137595750506020918101602381520301902090565b60208282018101518683015285935001613740565b9190811015613043576060020190565b6040519061378b8261322f565b60006040838281528260208201520152565b908060209392818452848401376000828201840152601f01601f1916010190565b9081602091031261042a57516001600160a01b038116810361042a5790565b906040516137ea8161322f565b60406002829480548452600181015460208501520154910152565b600260005414613816576002600055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b908151811015613043570160200190565b908151613876613860826136e2565b9161386e604051938461325f565b8083526136e2565b60209390601f1901368386013760005b8151811015613915576138998183613840565b51907fff00000000000000000000000000000000000000000000000000000000000000808316604160f81b81101580613907575b156138fc57508660f893841c0160ff81116131d4576001931b165b60001a6138f58286613840565b5301613886565b9050600192506138e8565b50602d60f91b8111156138cd565b5090925050565b90821015613043570190565b908015801561399d575b6139965760009060005b81811061394a575050905090565b61395581838661391c565b3560f81c602090818110801561398c575b6139815703613978575b60010161393c565b60019250613970565b505050505050600090565b50607e8111613966565b5050600090565b5060208111613932565b81158015613af2575b6139965760009060005b8381106139ca5750505050600190565b7fff000000000000000000000000000000000000000000000000000000000000006139f682868561391c565b3516604160f81b81101580613ae4575b159081613a87575b81613a28575b50613a21576001016139ba565b5050905090565b7f3000000000000000000000000000000000000000000000000000000000000000811015915081613a5c575b501538613a14565b7f39000000000000000000000000000000000000000000000000000000000000009150111538613a54565b90507f610000000000000000000000000000000000000000000000000000000000000081101580613aba575b1590613a0e565b507f7a00000000000000000000000000000000000000000000000000000000000000811115613ab3565b50602d60f91b811115613a06565b50600b82116139b0565b917fff00000000000000000000000000000000000000000000000000000000000000906040519260208401947f4232463a43414d504149474e000000000000000000000000000000000000000086526bffffffffffffffffffffffff199060601b16602c850152604084015260f81b1660608201524660618201526061815260a0810181811067ffffffffffffffff821117613219576040525190209056fea164736f6c6343000818000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd1100000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c725
-----Decoded View---------------
Arg [0] : _fiveToken (address): 0xb0695ce12c56AAe40894235e2d1888D0b62Dd110
Arg [1] : _masterFarmer (address): 0x4aDe5608127594CD9eA131f0826AEA02FE517461
Arg [2] : _deFiveRouter (address): 0xC159D904cA8C2449df0AE4836197278f2f68C725
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b0695ce12c56aae40894235e2d1888d0b62dd110
Arg [1] : 0000000000000000000000004ade5608127594cd9ea131f0826aea02fe517461
Arg [2] : 000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c725
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.