Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 44967538 | 591 days ago | IN | Create: MetaFranchiseManagerV2 | 0 FTM | 0.00267828 |
Loading...
Loading
Contract Name:
MetaFranchiseManagerV2
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "../tokens/core/interfaces/IMetaFranchise.sol"; import "../../models/TransactionFees.sol"; import "../../enums/MetaFranchiseType.sol"; import "../tokens/core/ERC1155/MetaERC1155ReceiverHolder.sol"; contract MetaFranchiseManagerV2 is Initializable, PausableUpgradeable { address private _owner; IMetaFranchise metaFranchise; uint256 private createFranchisePriceBNB; uint256 private createFranchisePrice; uint256 private hireWorkerFranchisePriceBNB; uint256 private maintainceFranchiseExpensesBNBPercent; uint256 private maintainceFranchiseExpenses; uint256 private franchiseDailyEarningsBNB; uint256 private franchiseDailyEarnings; uint256 private franchiseDailyInterval; uint256 private franchiseWorkersMultiplicator; address private paymentTokenAddress; address private teamAddress; uint256 private teamAddressPercent; uint256 private totalFranchises; mapping(uint256 => uint256) franchiseContinents; mapping(uint256 => mapping(uint256 => uint256)) public franchisesUsdInvested; mapping(uint256 => uint256) public lastFranchiseClaimDate; mapping(uint256 => mapping(uint256 => uint256)) public companyFranchises; mapping(uint256 => uint256) public companyFranchisesCounter; mapping(uint256 => mapping(uint256 => uint256)) public franchisesLastClaimDates; mapping(uint256 => mapping(uint256 => uint256)) public franchisesWorkers; event CreateFranchise( address indexed account, uint256 companyId, uint256 franchiseType, uint256 amount ); // Modifier to verify the caller is the owner of the contract modifier onlyOwner() { require(msg.sender == _owner); _; } event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); function initialize(address _metaFranchiseAddress) public initializer { _owner = msg.sender; createFranchisePriceBNB = 300000000000000000; // 0.30BNB franchiseDailyEarningsBNB = 8300000000000000; // 0.0083BNB maintainceFranchiseExpensesBNBPercent = 100; // 0.01BNB createFranchisePrice = 10 ether; franchiseDailyEarnings = 170000000000000000; maintainceFranchiseExpenses = 1 ether; franchiseDailyInterval = 1 days; totalFranchises = 0; paymentTokenAddress = address(0); teamAddress = 0x8583A73aCe55acF9184468F6d05Ff658DE24dADD; teamAddressPercent = 1000; metaFranchise = IMetaFranchise(_metaFranchiseAddress); } receive() external payable {} function self() public view returns (address) { return address(this); } /** * @dev Transfers ownership of the contract to a new account ('newOwner'). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function getCreateFranchisePrice() external view returns (uint256) { return createFranchisePrice; } function getMaintainceFranchiseExpenses() external view returns (uint256) { return maintainceFranchiseExpenses; } function getFranchiseDailyEarnings() external view returns (uint256) { return franchiseDailyEarnings; } function getCreateFranchisePriceBNB() external view returns (uint256) { return createFranchisePriceBNB; } function getMaintainceFranchiseExpensesBNBPercent() external view returns (uint256) { return maintainceFranchiseExpensesBNBPercent; } function getFranchiseDailyEarningsBNB() external view returns (uint256) { return franchiseDailyEarningsBNB; } function getHireWorkerFranchisePriceBNB() external view returns (uint256) { return hireWorkerFranchisePriceBNB; } function getPaymentTokenAddress() external view returns (address) { return paymentTokenAddress; } function getFranchisesUsdInvested(uint256 companyId, uint256 franchiseType) external view returns (uint256) { return franchisesUsdInvested[companyId][franchiseType]; } function setHireWorkerFranchisePrice(uint16 _hireWorkerFranchisePriceBNB) external virtual onlyOwner { hireWorkerFranchisePriceBNB = _hireWorkerFranchisePriceBNB; } function setMaintainceFranchiseExpenses(uint16 _maintainceFranchiseExpenses) external virtual onlyOwner { maintainceFranchiseExpenses = _maintainceFranchiseExpenses; } function setFranchiseDailyEarnings(uint16 _franchiseDailyEarnings) external virtual onlyOwner { franchiseDailyEarnings = _franchiseDailyEarnings; } function setMaintainceFranchiseExpensesBNBPercent( uint16 _maintainceFranchiseExpenses ) external virtual onlyOwner { maintainceFranchiseExpensesBNBPercent = _maintainceFranchiseExpenses; } function setFranchiseDailyEarningsBNB(uint16 _franchiseDailyEarnings) external virtual onlyOwner { franchiseDailyEarningsBNB = _franchiseDailyEarnings; } function setPaymentTokenAddress(address _paymentTokenAddress) external virtual onlyOwner { paymentTokenAddress = _paymentTokenAddress; IERC20(paymentTokenAddress).approve(self(), type(uint256).max); } function setCreateFranchisePrice(uint16 _createFranchisePrice) external virtual onlyOwner { createFranchisePrice = _createFranchisePrice; } function setCreateFranchisePriceBNB(uint16 _createFranchisePrice) external virtual onlyOwner { createFranchisePriceBNB = _createFranchisePrice; } function setTeamWallet() external virtual onlyOwner { teamAddress = address(0x8583A73aCe55acF9184468F6d05Ff658DE24dADD); } function getNumberOfMetaFranchises(uint256 companyId) external view returns (uint256) { return companyFranchises[companyId][0]; } function getFranchisesByContinent(uint256 _continentId) public view returns (uint256) { return franchiseContinents[_continentId]; } function getMetaFranchisesUnclaimedRewards(uint256 companyId) external view returns (uint256) { uint256 totalUnclaimed = 0; for (uint256 typeIndex = 0; typeIndex < 10; typeIndex++) { uint256 typeNumber = companyFranchises[companyId][typeIndex]; for (uint256 index = 0; index < typeNumber; index++) { totalUnclaimed += ((uint256( block.timestamp - franchisesLastClaimDates[companyId][typeNumber] ) * franchiseDailyEarnings) / franchiseDailyInterval) * franchisesWorkers[companyId][typeNumber]; } } return totalUnclaimed; } function getTotalFranchises() external view returns (uint256) { return totalFranchises; } function getMetaFranchisesUnclaimedRewardsBNB(uint256 companyId) external view returns (uint256) { uint256 totalUnclaimed = 0; uint256 franchisesNumber = this.getNumberOfMetaFranchises(companyId); for (uint256 index = 0; index < franchisesNumber; index++) { totalUnclaimed += ((uint256( block.timestamp - franchisesLastClaimDates[companyId][index] ) * franchiseDailyEarningsBNB) / franchiseDailyInterval); } return totalUnclaimed; } function getFranchisesLastClaimDates(uint256 _companyId) external view returns (uint256[] memory) { uint256 franchisesNumber = companyFranchises[_companyId][0]; uint256[] memory claimsDates = new uint256[](franchisesNumber); for (uint256 index = 0; index < franchisesNumber; index++) { claimsDates[index] = franchisesLastClaimDates[_companyId][index]; } return claimsDates; } function createMetaFranchiseUsingUnclaimedBNB( address _to, uint256 _companyId, uint256 _continentId, uint256 _number ) external payable { uint256 totalUnclaimed = this.getMetaFranchisesUnclaimedRewards( _companyId ); require( totalUnclaimed >= createFranchisePriceBNB * _number, "Low amount" ); payable(teamAddress).transfer( (totalUnclaimed * teamAddressPercent) / 10000 ); companyFranchises[_companyId][0] += _number; companyFranchisesCounter[_companyId] += _number; franchiseContinents[_continentId] += _number; totalFranchises += _number; metaFranchise.mint(_to, 0, _number, "0x0"); // todo try save gas uint256 franchisesNumber = companyFranchisesCounter[_companyId]; for (uint256 index = 0; index < franchisesNumber; index++) { if (franchisesLastClaimDates[_companyId][index] == 0) { franchisesLastClaimDates[_companyId][index] = block.timestamp; } } emit CreateFranchise(msg.sender, _companyId, 0, _number); } function createMetaFranchiseUsingBNB( address _to, uint256 _companyId, uint256 _continentId, uint256 _number ) external payable { require(msg.value >= createFranchisePriceBNB * _number, "Low amount"); payable(teamAddress).transfer((msg.value * teamAddressPercent) / 10000); companyFranchises[_companyId][0] += _number; companyFranchisesCounter[_companyId] += _number; franchiseContinents[_continentId] += _number; totalFranchises += _number; //metaFranchise.mint(_to, 0, _number, "0x0"); // todo try save gas uint256 franchisesNumber = companyFranchisesCounter[_companyId]; for (uint256 index = 0; index < franchisesNumber; index++) { if (franchisesLastClaimDates[_companyId][index] == 0) { franchisesLastClaimDates[_companyId][index] = block.timestamp; } } emit CreateFranchise(msg.sender, _companyId, 0, _number); } function createMetaFranchise( address to, uint256 companyId, uint256 _continentId, MetaFranchiseType _metaFranchiseType ) external { require(IERC20Upgradeable(paymentTokenAddress).balanceOf(address(msg.sender)) >= createFranchisePrice, "Low amount"); IERC20(paymentTokenAddress).transferFrom( address(msg.sender), address(self()), createFranchisePrice ); uint256 franchiseType = metaFranchise.getMetaFranchiseType( _metaFranchiseType ); metaFranchise.mint(to, franchiseType, 1, "0x0"); companyFranchises[companyId][franchiseType] += 1; franchisesWorkers[companyId][franchiseType] += 1; franchisesLastClaimDates[companyId][franchiseType] = block.timestamp; franchiseContinents[_continentId] += 1; emit CreateFranchise(msg.sender, companyId, franchiseType, 1); } function hireWorkerUsingBNB( uint256 companyId, MetaFranchiseType _metaFranchiseType ) external payable { require(msg.value >= createFranchisePriceBNB, "Low amount"); payable(teamAddress).transfer((msg.value * teamAddressPercent) / 10000); uint256 franchiseType = metaFranchise.getMetaFranchiseType( _metaFranchiseType ); franchisesWorkers[companyId][franchiseType] += 1; } function hireWorker(uint256 companyId, MetaFranchiseType _metaFranchiseType) external { /* IERC20(paymentTokenAddress).transferFrom( address(msg.sender), address(self()), hireWorkerFranchisePriceBNB ); uint256 tokensValueInUSD = midasMultinetworkRouterManager .getTokensValueInUSD( paymentTokenAddress, hireWorkerFranchisePriceBNB ); uint256 franchiseType = metaFranchise.getMetaFranchiseType( _metaFranchiseType ); //franchisesUsdInvested[companyId][franchiseType] = tokensValueInUSD; franchisesWorkers[companyId][franchiseType] += 1; */ } function claimFromAllFranchises(uint256 _companyId) external { uint256 totalUnclaimed = this.getMetaFranchisesUnclaimedRewards( _companyId ); IERC20(paymentTokenAddress).transferFrom( address(self()), address(msg.sender), totalUnclaimed ); for (uint256 typeIndex = 0; typeIndex < 10; typeIndex++) { franchisesLastClaimDates[_companyId][typeIndex] = block.timestamp; } } function claimFromAllFranchisesBNB(uint256 _companyId, address companyOwner) external { uint256 totalUnclaimed = this.getMetaFranchisesUnclaimedRewardsBNB( _companyId ); uint256 franchisesNumber = this.getNumberOfMetaFranchises(_companyId); for (uint256 index = 0; index < franchisesNumber; index++) { franchisesLastClaimDates[_companyId][index] = block.timestamp; } payable(teamAddress).transfer( (totalUnclaimed * maintainceFranchiseExpensesBNBPercent) / 10000 ); payable(companyOwner).transfer( totalUnclaimed - (totalUnclaimed * maintainceFranchiseExpensesBNBPercent) / 10000 ); } function getFranchiseValue() external view returns (uint256) { /* chainlinkDataFeedsManager.getTokensValueInUSD( _tokenAddress, _amount, _network, midasMultiNetworkRouter ); */ return 100000000; } function burnMetaFranchise( address to, uint256 companyId, uint256 amount, MetaFranchiseType _metaFranchiseType ) external {} function sellMetaFranchise( address to, uint256 companyId, uint256 amount, MetaFranchiseType _metaFranchiseType ) external {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../../../../enums/MetaFranchiseType.sol"; interface IMetaFranchise { function mint( address to, uint256 id, uint256 amount, bytes memory data ) external; function safeMint(address to) external returns (uint256); function getMetaFranchiseType( MetaFranchiseType _metaFranchiseType ) external pure returns (uint256); function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; struct TransactionFees { uint16 buyFee; // fee when people BUY tokens using router uint16 sellFee; // fee when people SELL tokens using router uint16 transferFee; // fee when people TRANSFER tokens from wallet to wallet }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; enum MetaFranchiseType { MetaFranchiseType1, MetaFranchiseType2, MetaFranchiseType3, MetaFranchiseType4, MetaFranchiseType5, MetaFranchiseType6, MetaFranchiseType7, MetaFranchiseType8, MetaFranchiseType9, MetaFranchiseType10, MetaFranchiseType11, MetaFranchiseType12, MetaFranchiseType13, MetaFranchiseType14, MetaFranchiseType15, MetaFranchiseType16, MetaFranchiseType17, MetaFranchiseType18, MetaFranchiseType19, MetaFranchiseType20, MetaFranchiseType21, MetaFranchiseType22, MetaFranchiseType23, MetaFranchiseType24, MetaFranchiseType25, MetaFranchiseType26 }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; contract MetaERC1155ReceiverHolder is IERC1155Receiver, ERC1155Holder { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override(ERC1155Holder, IERC1155Receiver) returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override(ERC1155Holder, IERC1155Receiver) returns (bytes4) { return this.onERC1155BatchReceived.selector; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155Receiver, IERC165) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 1 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"companyId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"franchiseType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreateFranchise","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum MetaFranchiseType","name":"_metaFranchiseType","type":"uint8"}],"name":"burnMetaFranchise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_companyId","type":"uint256"}],"name":"claimFromAllFranchises","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_companyId","type":"uint256"},{"internalType":"address","name":"companyOwner","type":"address"}],"name":"claimFromAllFranchisesBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"companyFranchises","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"companyFranchisesCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"uint256","name":"_continentId","type":"uint256"},{"internalType":"enum MetaFranchiseType","name":"_metaFranchiseType","type":"uint8"}],"name":"createMetaFranchise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_companyId","type":"uint256"},{"internalType":"uint256","name":"_continentId","type":"uint256"},{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"createMetaFranchiseUsingBNB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_companyId","type":"uint256"},{"internalType":"uint256","name":"_continentId","type":"uint256"},{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"createMetaFranchiseUsingUnclaimedBNB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"franchisesLastClaimDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"franchisesUsdInvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"franchisesWorkers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreateFranchisePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreateFranchisePriceBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFranchiseDailyEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFranchiseDailyEarningsBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFranchiseValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_continentId","type":"uint256"}],"name":"getFranchisesByContinent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_companyId","type":"uint256"}],"name":"getFranchisesLastClaimDates","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"uint256","name":"franchiseType","type":"uint256"}],"name":"getFranchisesUsdInvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHireWorkerFranchisePriceBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaintainceFranchiseExpenses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaintainceFranchiseExpensesBNBPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"}],"name":"getMetaFranchisesUnclaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"}],"name":"getMetaFranchisesUnclaimedRewardsBNB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"}],"name":"getNumberOfMetaFranchises","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaymentTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalFranchises","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"enum MetaFranchiseType","name":"_metaFranchiseType","type":"uint8"}],"name":"hireWorker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"enum MetaFranchiseType","name":"_metaFranchiseType","type":"uint8"}],"name":"hireWorkerUsingBNB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_metaFranchiseAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastFranchiseClaimDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"self","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"companyId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum MetaFranchiseType","name":"_metaFranchiseType","type":"uint8"}],"name":"sellMetaFranchise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_createFranchisePrice","type":"uint16"}],"name":"setCreateFranchisePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_createFranchisePrice","type":"uint16"}],"name":"setCreateFranchisePriceBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_franchiseDailyEarnings","type":"uint16"}],"name":"setFranchiseDailyEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_franchiseDailyEarnings","type":"uint16"}],"name":"setFranchiseDailyEarningsBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_hireWorkerFranchisePriceBNB","type":"uint16"}],"name":"setHireWorkerFranchisePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maintainceFranchiseExpenses","type":"uint16"}],"name":"setMaintainceFranchiseExpenses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maintainceFranchiseExpenses","type":"uint16"}],"name":"setMaintainceFranchiseExpensesBNBPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentTokenAddress","type":"address"}],"name":"setPaymentTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50611d21806100206000396000f3fe6080604052600436106101fb5760003560e01c80630129b117146102075780630cff9eb1146102295780631554f76a1461024d5780631a161fba1461026d578063208ca31f1461029a5780632a5bb068146102ad5780632c602e5b146102cd578063330f0497146102e2578063354c3a6d1461030257806335ea03a2146103175780633f2027cd1461033757806344716080146103575780634610e4fe1461036c5780634729ab751461038d578063597effaf146103a25780635c975abb146103b5578063679a6fa5146103d857806369c30c2a146104055780637104ddb21461043257806371e5f0631461044e57806377ff791a14610486578063885d5adf1461036c578063928024dc146104a6578063959fad20146104c557806399dc7d9c146104e55780639d58f3e0146105055780639e2014661461051c5780639f2e747f1461053c578063a3b43bc514610551578063a4db7d1514610566578063a562eaa91461059e578063b17a43ae146105b1578063b5ea8945146105e9578063bd0e5ddf14610621578063be154d2b14610659578063c4d66de814610679578063c56956ce14610699578063c8d3c567146106c6578063dcb98f7e146106db578063dea182c1146106fb578063df40c9f114610719578063e5c501621461072e578063f2fde38b1461074e578063f30a61081461076e57600080fd5b3661020257005b600080fd5b34801561021357600080fd5b50610227610222366004611931565b6107a6565b005b34801561023557600080fd5b506067545b6040519081526020015b60405180910390f35b34801561025957600080fd5b50610227610268366004611931565b6107c6565b34801561027957600080fd5b5061028d61028836600461195c565b6107e6565b6040516102449190611975565b6102276102a83660046119d5565b6108a5565b3480156102b957600080fd5b506102276102c8366004611931565b610a63565b3480156102d957600080fd5b5060685461023a565b3480156102ee57600080fd5b506102276102fd366004611931565b610a83565b34801561030e57600080fd5b50610227610aa3565b34801561032357600080fd5b5061023a61033236600461195c565b610ae2565b34801561034357600080fd5b50610227610352366004611a0e565b610bbb565b34801561036357600080fd5b50606d5461023a565b34801561037857600080fd5b50610227610387366004611a49565b50505050565b34801561039957600080fd5b50606a5461023a565b6102276103b03660046119d5565b610d78565b3480156103c157600080fd5b5060335460ff166040519015158152602001610244565b3480156103e457600080fd5b5061023a6103f336600461195c565b60009081526074602052604090205490565b34801561041157600080fd5b5061023a61042036600461195c565b60786020526000908152604090205481565b34801561043e57600080fd5b50305b6040516102449190611a8f565b34801561045a57600080fd5b5061023a610469366004611aa3565b607560209081526000928352604080842090915290825290205481565b34801561049257600080fd5b506102276104a1366004611931565b610ffa565b3480156104b257600080fd5b506102276104c1366004611ac5565b5050565b3480156104d157600080fd5b5061023a6104e036600461195c565b61101a565b3480156104f157600080fd5b5061022761050036600461195c565b6110e6565b34801561051157600080fd5b506305f5e10061023a565b34801561052857600080fd5b50610227610537366004611931565b611201565b34801561054857600080fd5b50606b5461023a565b34801561055d57600080fd5b5060735461023a565b34801561057257600080fd5b5061023a610581366004611aa3565b607760209081526000928352604080842090915290825290205481565b6102276105ac366004611ac5565b611221565b3480156105bd57600080fd5b5061023a6105cc366004611aa3565b607a60209081526000928352604080842090915290825290205481565b3480156105f557600080fd5b5061023a610604366004611aa3565b607960209081526000928352604080842090915290825290205481565b34801561062d57600080fd5b5061023a61063c36600461195c565b600090815260776020908152604080832083805290915290205490565b34801561066557600080fd5b50610227610674366004611931565b611345565b34801561068557600080fd5b50610227610694366004611ae8565b611365565b3480156106a557600080fd5b5061023a6106b436600461195c565b60766020526000908152604090205481565b3480156106d257600080fd5b5060695461023a565b3480156106e757600080fd5b506102276106f6366004611ae8565b611510565b34801561070757600080fd5b506070546001600160a01b0316610441565b34801561072557600080fd5b50606c5461023a565b34801561073a57600080fd5b50610227610749366004611a49565b6115bd565b34801561075a57600080fd5b50610227610769366004611ae8565b611863565b34801561077a57600080fd5b5061023a610789366004611aa3565b600091825260756020908152604080842092845291905290205490565b6065546001600160a01b031633146107bd57600080fd5b61ffff16606955565b6065546001600160a01b031633146107dd57600080fd5b61ffff16606755565b6000818152607760209081526040808320838052909152812054606091816001600160401b0381111561081b5761081b611b03565b604051908082528060200260200182016040528015610844578160200160208202803683370190505b50905060005b8281101561089d576000858152607960209081526040808320848452909152902054825183908390811061088057610880611b19565b60209081029190910101528061089581611b45565b91505061084a565b509392505050565b806067546108b39190611b5e565b3410156108db5760405162461bcd60e51b81526004016108d290611b7d565b60405180910390fd5b6071546072546001600160a01b03909116906108fc90612710906108ff9034611b5e565b6109099190611ba1565b6040518115909202916000818181858888f19350505050158015610931573d6000803e3d6000fd5b5060008381526077602090815260408083208380529091528120805483929061095b908490611bc3565b90915550506000838152607860205260408120805483929061097e908490611bc3565b9091555050600082815260746020526040812080548392906109a1908490611bc3565b9250508190555080607360008282546109ba9190611bc3565b9091555050600083815260786020526040812054905b81811015610a275760008581526079602090815260408083208484529091528120549003610a1557600085815260796020908152604080832084845290915290204290555b80610a1f81611b45565b9150506109d0565b50336001600160a01b0316600080516020611ccc83398151915285600085604051610a5493929190611bdb565b60405180910390a25050505050565b6065546001600160a01b03163314610a7a57600080fd5b61ffff16606b55565b6065546001600160a01b03163314610a9a57600080fd5b61ffff16606c55565b6065546001600160a01b03163314610aba57600080fd5b607180546001600160a01b031916738583a73ace55acf9184468f6d05ff658de24dadd179055565b60405163bd0e5ddf60e01b81526004810182905260009081908190309063bd0e5ddf90602401602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190611bf1565b905060005b81811015610bb257606e54606c546000878152607960209081526040808320868452909152902054610b809042611c0a565b610b8a9190611b5e565b610b949190611ba1565b610b9e9084611bc3565b925080610baa81611b45565b915050610b4e565b50909392505050565b604051631af501d160e11b81526004810183905260009030906335ea03a290602401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190611bf1565b60405163bd0e5ddf60e01b815260048101859052909150600090309063bd0e5ddf90602401602060405180830381865afa158015610c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611bf1565b905060005b81811015610cbf576000858152607960209081526040808320848452909152902042905580610cb781611b45565b915050610c89565b50607154606a546001600160a01b03909116906108fc9061271090610ce49086611b5e565b610cee9190611ba1565b6040518115909202916000818181858888f19350505050158015610d16573d6000803e3d6000fd5b50826001600160a01b03166108fc612710606a5485610d359190611b5e565b610d3f9190611ba1565b610d499085611c0a565b6040518115909202916000818181858888f19350505050158015610d71573d6000803e3d6000fd5b5050505050565b6040516304acfd6960e51b815260048101849052600090309063959fad2090602401602060405180830381865afa158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb9190611bf1565b905081606754610deb9190611b5e565b811015610e0a5760405162461bcd60e51b81526004016108d290611b7d565b6071546072546001600160a01b03909116906108fc9061271090610e2e9085611b5e565b610e389190611ba1565b6040518115909202916000818181858888f19350505050158015610e60573d6000803e3d6000fd5b50600084815260776020908152604080832083805290915281208054849290610e8a908490611bc3565b909155505060008481526078602052604081208054849290610ead908490611bc3565b909155505060008381526074602052604081208054849290610ed0908490611bc3565b925050819055508160736000828254610ee99190611bc3565b909155505060665460405163731133e960e01b81526001600160a01b039091169063731133e990610f239088906000908790600401611c21565b600060405180830381600087803b158015610f3d57600080fd5b505af1158015610f51573d6000803e3d6000fd5b50505060008581526078602052604081205491505b81811015610fbd5760008681526079602090815260408083208484529091528120549003610fab57600086815260796020908152604080832084845290915290204290555b80610fb581611b45565b915050610f66565b50336001600160a01b0316600080516020611ccc83398151915286600086604051610fea93929190611bdb565b60405180910390a2505050505050565b6065546001600160a01b0316331461101157600080fd5b61ffff16606a55565b600080805b600a8110156110df576000848152607760209081526040808320848452909152812054905b818110156110ca576000868152607a60209081526040808320858452825280832054606e54606d548b865260798552838620888752909452919093205490919061108e9042611c0a565b6110989190611b5e565b6110a29190611ba1565b6110ac9190611b5e565b6110b69085611bc3565b9350806110c281611b45565b915050611044565b505080806110d790611b45565b91505061101f565b5092915050565b6040516304acfd6960e51b815260048101829052600090309063959fad2090602401602060405180830381865afa158015611125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111499190611bf1565b6070546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061117e90309033908690600401611c5d565b6020604051808303816000875af115801561119d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c19190611c81565b5060005b600a8110156111fc5760008381526079602090815260408083208484529091529020429055806111f481611b45565b9150506111c5565b505050565b6065546001600160a01b0316331461121857600080fd5b61ffff16606d55565b6067543410156112435760405162461bcd60e51b81526004016108d290611b7d565b6071546072546001600160a01b03909116906108fc90612710906112679034611b5e565b6112719190611ba1565b6040518115909202916000818181858888f19350505050158015611299573d6000803e3d6000fd5b5060665460405163b7377ac960e01b81526000916001600160a01b03169063b7377ac9906112cb908590600401611ca3565b602060405180830381865afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c9190611bf1565b6000848152607a602090815260408083208484529091528120805492935060019290919061133b908490611bc3565b9091555050505050565b6065546001600160a01b0316331461135c57600080fd5b61ffff16606855565b600054610100900460ff16158080156113855750600054600160ff909116105b8061139f5750303b15801561139f575060005460ff166001145b6114025760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108d2565b6000805460ff191660011790558015611425576000805461ff0019166101001790555b60658054336001600160a01b031991821617909155670429d069189e0000606755661d7cce57a2c000606c556064606a55678ac7230489e8000060685567025bf6196bd10000606d55670de0b6b3a7640000606b5562015180606e556000607355607080548216905560718054738583a73ace55acf9184468f6d05ff658de24dadd9083161790556103e8607255606680549091166001600160a01b03841617905580156104c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6065546001600160a01b0316331461152757600080fd5b607080546001600160a01b0319166001600160a01b03831690811790915563095ea7b3306040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190611c81565b6068546070546040516370a0823160e01b81526001600160a01b03909116906370a08231906115f0903390600401611a8f565b602060405180830381865afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190611bf1565b101561164f5760405162461bcd60e51b81526004016108d290611b7d565b6070546068546040516323b872dd60e01b81526001600160a01b03909216916323b872dd916116849133913091600401611c5d565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190611c81565b5060665460405163b7377ac960e01b81526000916001600160a01b03169063b7377ac9906116f9908590600401611ca3565b602060405180830381865afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190611bf1565b60665460405163731133e960e01b81529192506001600160a01b03169063731133e9906117709088908590600190600401611c21565b600060405180830381600087803b15801561178a57600080fd5b505af115801561179e573d6000803e3d6000fd5b505050600085815260776020908152604080832085845290915281208054600193509091906117ce908490611bc3565b90915550506000848152607a6020908152604080832084845290915281208054600192906117fd908490611bc3565b90915550506000848152607960209081526040808320848452825280832042905585835260749091528120805460019290611839908490611bc3565b90915550506040513390600080516020611ccc83398151915290610a549087908590600190611bdb565b6065546001600160a01b0316331461187a57600080fd5b6001600160a01b0381166118df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d2565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006020828403121561194357600080fd5b813561ffff8116811461195557600080fd5b9392505050565b60006020828403121561196e57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156119ad57835183529284019291840191600101611991565b50909695505050505050565b80356001600160a01b03811681146119d057600080fd5b919050565b600080600080608085870312156119eb57600080fd5b6119f4856119b9565b966020860135965060408601359560600135945092505050565b60008060408385031215611a2157600080fd5b82359150611a31602084016119b9565b90509250929050565b8035601a81106119d057600080fd5b60008060008060808587031215611a5f57600080fd5b611a68856119b9565b93506020850135925060408501359150611a8460608601611a3a565b905092959194509250565b6001600160a01b0391909116815260200190565b60008060408385031215611ab657600080fd5b50508035926020909101359150565b60008060408385031215611ad857600080fd5b82359150611a3160208401611a3a565b600060208284031215611afa57600080fd5b611955826119b9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b5757611b57611b2f565b5060010190565b6000816000190483118215151615611b7857611b78611b2f565b500290565b6020808252600a9082015269131bddc8185b5bdd5b9d60b21b604082015260600190565b600082611bbe57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611bd657611bd6611b2f565b500190565b9283526020830191909152604082015260600190565b600060208284031215611c0357600080fd5b5051919050565b600082821015611c1c57611c1c611b2f565b500390565b6001600160a01b03939093168352602083019190915260408201526080606082018190526003908201526203078360ec1b60a082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215611c9357600080fd5b8151801515811461195557600080fd5b60208101601a8310611cc557634e487b7160e01b600052602160045260246000fd5b9190529056fe8fb6c67a2e48edf7231287ac77d56b63e9cfcc1123e36b8a22a1718f1d812e03a26469706673582212204b979d80f3f465454785550c015073935d66494963cdeed1b4f70bac971954ef64736f6c634300080f0033
Deployed Bytecode
0x6080604052600436106101fb5760003560e01c80630129b117146102075780630cff9eb1146102295780631554f76a1461024d5780631a161fba1461026d578063208ca31f1461029a5780632a5bb068146102ad5780632c602e5b146102cd578063330f0497146102e2578063354c3a6d1461030257806335ea03a2146103175780633f2027cd1461033757806344716080146103575780634610e4fe1461036c5780634729ab751461038d578063597effaf146103a25780635c975abb146103b5578063679a6fa5146103d857806369c30c2a146104055780637104ddb21461043257806371e5f0631461044e57806377ff791a14610486578063885d5adf1461036c578063928024dc146104a6578063959fad20146104c557806399dc7d9c146104e55780639d58f3e0146105055780639e2014661461051c5780639f2e747f1461053c578063a3b43bc514610551578063a4db7d1514610566578063a562eaa91461059e578063b17a43ae146105b1578063b5ea8945146105e9578063bd0e5ddf14610621578063be154d2b14610659578063c4d66de814610679578063c56956ce14610699578063c8d3c567146106c6578063dcb98f7e146106db578063dea182c1146106fb578063df40c9f114610719578063e5c501621461072e578063f2fde38b1461074e578063f30a61081461076e57600080fd5b3661020257005b600080fd5b34801561021357600080fd5b50610227610222366004611931565b6107a6565b005b34801561023557600080fd5b506067545b6040519081526020015b60405180910390f35b34801561025957600080fd5b50610227610268366004611931565b6107c6565b34801561027957600080fd5b5061028d61028836600461195c565b6107e6565b6040516102449190611975565b6102276102a83660046119d5565b6108a5565b3480156102b957600080fd5b506102276102c8366004611931565b610a63565b3480156102d957600080fd5b5060685461023a565b3480156102ee57600080fd5b506102276102fd366004611931565b610a83565b34801561030e57600080fd5b50610227610aa3565b34801561032357600080fd5b5061023a61033236600461195c565b610ae2565b34801561034357600080fd5b50610227610352366004611a0e565b610bbb565b34801561036357600080fd5b50606d5461023a565b34801561037857600080fd5b50610227610387366004611a49565b50505050565b34801561039957600080fd5b50606a5461023a565b6102276103b03660046119d5565b610d78565b3480156103c157600080fd5b5060335460ff166040519015158152602001610244565b3480156103e457600080fd5b5061023a6103f336600461195c565b60009081526074602052604090205490565b34801561041157600080fd5b5061023a61042036600461195c565b60786020526000908152604090205481565b34801561043e57600080fd5b50305b6040516102449190611a8f565b34801561045a57600080fd5b5061023a610469366004611aa3565b607560209081526000928352604080842090915290825290205481565b34801561049257600080fd5b506102276104a1366004611931565b610ffa565b3480156104b257600080fd5b506102276104c1366004611ac5565b5050565b3480156104d157600080fd5b5061023a6104e036600461195c565b61101a565b3480156104f157600080fd5b5061022761050036600461195c565b6110e6565b34801561051157600080fd5b506305f5e10061023a565b34801561052857600080fd5b50610227610537366004611931565b611201565b34801561054857600080fd5b50606b5461023a565b34801561055d57600080fd5b5060735461023a565b34801561057257600080fd5b5061023a610581366004611aa3565b607760209081526000928352604080842090915290825290205481565b6102276105ac366004611ac5565b611221565b3480156105bd57600080fd5b5061023a6105cc366004611aa3565b607a60209081526000928352604080842090915290825290205481565b3480156105f557600080fd5b5061023a610604366004611aa3565b607960209081526000928352604080842090915290825290205481565b34801561062d57600080fd5b5061023a61063c36600461195c565b600090815260776020908152604080832083805290915290205490565b34801561066557600080fd5b50610227610674366004611931565b611345565b34801561068557600080fd5b50610227610694366004611ae8565b611365565b3480156106a557600080fd5b5061023a6106b436600461195c565b60766020526000908152604090205481565b3480156106d257600080fd5b5060695461023a565b3480156106e757600080fd5b506102276106f6366004611ae8565b611510565b34801561070757600080fd5b506070546001600160a01b0316610441565b34801561072557600080fd5b50606c5461023a565b34801561073a57600080fd5b50610227610749366004611a49565b6115bd565b34801561075a57600080fd5b50610227610769366004611ae8565b611863565b34801561077a57600080fd5b5061023a610789366004611aa3565b600091825260756020908152604080842092845291905290205490565b6065546001600160a01b031633146107bd57600080fd5b61ffff16606955565b6065546001600160a01b031633146107dd57600080fd5b61ffff16606755565b6000818152607760209081526040808320838052909152812054606091816001600160401b0381111561081b5761081b611b03565b604051908082528060200260200182016040528015610844578160200160208202803683370190505b50905060005b8281101561089d576000858152607960209081526040808320848452909152902054825183908390811061088057610880611b19565b60209081029190910101528061089581611b45565b91505061084a565b509392505050565b806067546108b39190611b5e565b3410156108db5760405162461bcd60e51b81526004016108d290611b7d565b60405180910390fd5b6071546072546001600160a01b03909116906108fc90612710906108ff9034611b5e565b6109099190611ba1565b6040518115909202916000818181858888f19350505050158015610931573d6000803e3d6000fd5b5060008381526077602090815260408083208380529091528120805483929061095b908490611bc3565b90915550506000838152607860205260408120805483929061097e908490611bc3565b9091555050600082815260746020526040812080548392906109a1908490611bc3565b9250508190555080607360008282546109ba9190611bc3565b9091555050600083815260786020526040812054905b81811015610a275760008581526079602090815260408083208484529091528120549003610a1557600085815260796020908152604080832084845290915290204290555b80610a1f81611b45565b9150506109d0565b50336001600160a01b0316600080516020611ccc83398151915285600085604051610a5493929190611bdb565b60405180910390a25050505050565b6065546001600160a01b03163314610a7a57600080fd5b61ffff16606b55565b6065546001600160a01b03163314610a9a57600080fd5b61ffff16606c55565b6065546001600160a01b03163314610aba57600080fd5b607180546001600160a01b031916738583a73ace55acf9184468f6d05ff658de24dadd179055565b60405163bd0e5ddf60e01b81526004810182905260009081908190309063bd0e5ddf90602401602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190611bf1565b905060005b81811015610bb257606e54606c546000878152607960209081526040808320868452909152902054610b809042611c0a565b610b8a9190611b5e565b610b949190611ba1565b610b9e9084611bc3565b925080610baa81611b45565b915050610b4e565b50909392505050565b604051631af501d160e11b81526004810183905260009030906335ea03a290602401602060405180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190611bf1565b60405163bd0e5ddf60e01b815260048101859052909150600090309063bd0e5ddf90602401602060405180830381865afa158015610c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c849190611bf1565b905060005b81811015610cbf576000858152607960209081526040808320848452909152902042905580610cb781611b45565b915050610c89565b50607154606a546001600160a01b03909116906108fc9061271090610ce49086611b5e565b610cee9190611ba1565b6040518115909202916000818181858888f19350505050158015610d16573d6000803e3d6000fd5b50826001600160a01b03166108fc612710606a5485610d359190611b5e565b610d3f9190611ba1565b610d499085611c0a565b6040518115909202916000818181858888f19350505050158015610d71573d6000803e3d6000fd5b5050505050565b6040516304acfd6960e51b815260048101849052600090309063959fad2090602401602060405180830381865afa158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb9190611bf1565b905081606754610deb9190611b5e565b811015610e0a5760405162461bcd60e51b81526004016108d290611b7d565b6071546072546001600160a01b03909116906108fc9061271090610e2e9085611b5e565b610e389190611ba1565b6040518115909202916000818181858888f19350505050158015610e60573d6000803e3d6000fd5b50600084815260776020908152604080832083805290915281208054849290610e8a908490611bc3565b909155505060008481526078602052604081208054849290610ead908490611bc3565b909155505060008381526074602052604081208054849290610ed0908490611bc3565b925050819055508160736000828254610ee99190611bc3565b909155505060665460405163731133e960e01b81526001600160a01b039091169063731133e990610f239088906000908790600401611c21565b600060405180830381600087803b158015610f3d57600080fd5b505af1158015610f51573d6000803e3d6000fd5b50505060008581526078602052604081205491505b81811015610fbd5760008681526079602090815260408083208484529091528120549003610fab57600086815260796020908152604080832084845290915290204290555b80610fb581611b45565b915050610f66565b50336001600160a01b0316600080516020611ccc83398151915286600086604051610fea93929190611bdb565b60405180910390a2505050505050565b6065546001600160a01b0316331461101157600080fd5b61ffff16606a55565b600080805b600a8110156110df576000848152607760209081526040808320848452909152812054905b818110156110ca576000868152607a60209081526040808320858452825280832054606e54606d548b865260798552838620888752909452919093205490919061108e9042611c0a565b6110989190611b5e565b6110a29190611ba1565b6110ac9190611b5e565b6110b69085611bc3565b9350806110c281611b45565b915050611044565b505080806110d790611b45565b91505061101f565b5092915050565b6040516304acfd6960e51b815260048101829052600090309063959fad2090602401602060405180830381865afa158015611125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111499190611bf1565b6070546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd9061117e90309033908690600401611c5d565b6020604051808303816000875af115801561119d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c19190611c81565b5060005b600a8110156111fc5760008381526079602090815260408083208484529091529020429055806111f481611b45565b9150506111c5565b505050565b6065546001600160a01b0316331461121857600080fd5b61ffff16606d55565b6067543410156112435760405162461bcd60e51b81526004016108d290611b7d565b6071546072546001600160a01b03909116906108fc90612710906112679034611b5e565b6112719190611ba1565b6040518115909202916000818181858888f19350505050158015611299573d6000803e3d6000fd5b5060665460405163b7377ac960e01b81526000916001600160a01b03169063b7377ac9906112cb908590600401611ca3565b602060405180830381865afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c9190611bf1565b6000848152607a602090815260408083208484529091528120805492935060019290919061133b908490611bc3565b9091555050505050565b6065546001600160a01b0316331461135c57600080fd5b61ffff16606855565b600054610100900460ff16158080156113855750600054600160ff909116105b8061139f5750303b15801561139f575060005460ff166001145b6114025760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108d2565b6000805460ff191660011790558015611425576000805461ff0019166101001790555b60658054336001600160a01b031991821617909155670429d069189e0000606755661d7cce57a2c000606c556064606a55678ac7230489e8000060685567025bf6196bd10000606d55670de0b6b3a7640000606b5562015180606e556000607355607080548216905560718054738583a73ace55acf9184468f6d05ff658de24dadd9083161790556103e8607255606680549091166001600160a01b03841617905580156104c1576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6065546001600160a01b0316331461152757600080fd5b607080546001600160a01b0319166001600160a01b03831690811790915563095ea7b3306040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af1158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190611c81565b6068546070546040516370a0823160e01b81526001600160a01b03909116906370a08231906115f0903390600401611a8f565b602060405180830381865afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190611bf1565b101561164f5760405162461bcd60e51b81526004016108d290611b7d565b6070546068546040516323b872dd60e01b81526001600160a01b03909216916323b872dd916116849133913091600401611c5d565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190611c81565b5060665460405163b7377ac960e01b81526000916001600160a01b03169063b7377ac9906116f9908590600401611ca3565b602060405180830381865afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190611bf1565b60665460405163731133e960e01b81529192506001600160a01b03169063731133e9906117709088908590600190600401611c21565b600060405180830381600087803b15801561178a57600080fd5b505af115801561179e573d6000803e3d6000fd5b505050600085815260776020908152604080832085845290915281208054600193509091906117ce908490611bc3565b90915550506000848152607a6020908152604080832084845290915281208054600192906117fd908490611bc3565b90915550506000848152607960209081526040808320848452825280832042905585835260749091528120805460019290611839908490611bc3565b90915550506040513390600080516020611ccc83398151915290610a549087908590600190611bdb565b6065546001600160a01b0316331461187a57600080fd5b6001600160a01b0381166118df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d2565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006020828403121561194357600080fd5b813561ffff8116811461195557600080fd5b9392505050565b60006020828403121561196e57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156119ad57835183529284019291840191600101611991565b50909695505050505050565b80356001600160a01b03811681146119d057600080fd5b919050565b600080600080608085870312156119eb57600080fd5b6119f4856119b9565b966020860135965060408601359560600135945092505050565b60008060408385031215611a2157600080fd5b82359150611a31602084016119b9565b90509250929050565b8035601a81106119d057600080fd5b60008060008060808587031215611a5f57600080fd5b611a68856119b9565b93506020850135925060408501359150611a8460608601611a3a565b905092959194509250565b6001600160a01b0391909116815260200190565b60008060408385031215611ab657600080fd5b50508035926020909101359150565b60008060408385031215611ad857600080fd5b82359150611a3160208401611a3a565b600060208284031215611afa57600080fd5b611955826119b9565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b5757611b57611b2f565b5060010190565b6000816000190483118215151615611b7857611b78611b2f565b500290565b6020808252600a9082015269131bddc8185b5bdd5b9d60b21b604082015260600190565b600082611bbe57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115611bd657611bd6611b2f565b500190565b9283526020830191909152604082015260600190565b600060208284031215611c0357600080fd5b5051919050565b600082821015611c1c57611c1c611b2f565b500390565b6001600160a01b03939093168352602083019190915260408201526080606082018190526003908201526203078360ec1b60a082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215611c9357600080fd5b8151801515811461195557600080fd5b60208101601a8310611cc557634e487b7160e01b600052602160045260246000fd5b9190529056fe8fb6c67a2e48edf7231287ac77d56b63e9cfcc1123e36b8a22a1718f1d812e03a26469706673582212204b979d80f3f465454785550c015073935d66494963cdeed1b4f70bac971954ef64736f6c634300080f0033
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.