Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 55 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim MBZ | 19540841 | 168 days ago | IN | 0 ETH | 0.00467542 | ||||
Claim MBZ | 19538406 | 168 days ago | IN | 0 ETH | 0.00276956 | ||||
Claim MBZ | 19502154 | 173 days ago | IN | 0 ETH | 0.00206311 | ||||
Set Tax Swap Coo... | 19483551 | 176 days ago | IN | 0 ETH | 0.00097405 | ||||
Set Tax Swap Coo... | 19481430 | 176 days ago | IN | 0 ETH | 0.00074805 | ||||
Set Tax Swap Coo... | 19481420 | 176 days ago | IN | 0 ETH | 0.0008159 | ||||
Claim MBZ | 19477491 | 177 days ago | IN | 0 ETH | 0.00340141 | ||||
Claim MBZ | 19475686 | 177 days ago | IN | 0 ETH | 0.00442784 | ||||
Claim MBZ | 19471393 | 177 days ago | IN | 0 ETH | 0.00387879 | ||||
Set Tax Swap Coo... | 19462247 | 179 days ago | IN | 0 ETH | 0.00136601 | ||||
Set Tax Swap Coo... | 19444656 | 181 days ago | IN | 0 ETH | 0.00092964 | ||||
Claim MBZ | 19407224 | 186 days ago | IN | 0 ETH | 0.00900996 | ||||
Set Tax Swap Coo... | 19330677 | 197 days ago | IN | 0 ETH | 0.0012147 | ||||
Transfer | 19330671 | 197 days ago | IN | 0.0001 ETH | 0.00094915 | ||||
Set Tax Swap Coo... | 19330659 | 197 days ago | IN | 0 ETH | 0.00140212 | ||||
Claim MBZ | 19154962 | 222 days ago | IN | 0 ETH | 0.00255205 | ||||
Claim MBZ | 19151588 | 222 days ago | IN | 0 ETH | 0.00262759 | ||||
Approve | 19123373 | 226 days ago | IN | 0 ETH | 0.00142357 | ||||
Claim MBZ | 19111208 | 228 days ago | IN | 0 ETH | 0.00157495 | ||||
Claim MBZ | 18998756 | 244 days ago | IN | 0 ETH | 0.0022457 | ||||
Claim MBZ | 18986048 | 245 days ago | IN | 0 ETH | 0.00467352 | ||||
Claim MBZ | 18980462 | 246 days ago | IN | 0 ETH | 0.00528004 | ||||
Claim MBZ | 18966355 | 248 days ago | IN | 0 ETH | 0.0022762 | ||||
Claim MBZ | 18963743 | 249 days ago | IN | 0 ETH | 0.00324651 | ||||
Claim MBZ | 18939600 | 252 days ago | IN | 0 ETH | 0.00192648 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MoonboyzToken
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; import "v2-core/interfaces/IUniswapV2Factory.sol"; import "v2-periphery/interfaces/IUniswapV2Router02.sol"; import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-contracts/contracts/access/AccessControl.sol"; import { MerkleProof } from "openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol"; import "./interfaces/IMoonboyzUtilities.sol"; contract MoonboyzToken is ERC20, AccessControl { address public immutable burnAddress = 0x000000000000000000000000000000000000dEaD; IERC721 public moonboyz; IERC20 public darkToken; IMoonboyzUtilities public utilities; address public taxReceiver; address public router; mapping(address => bool) public isTradeableContract; uint256 public immutable classicDailyEarnRate; uint256 public immutable divineDailyEarnRate; uint256 public immutable earnPeriod; uint256 public deployedAt; mapping(uint256 => bool) public isDivine; struct TokenClaim { uint128 lastClaimedAt; uint128 totalClaimTime; } mapping(uint256 => TokenClaim) public tokenClaims; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); bytes32 public constant EXEMPT_ROLE = keccak256("EXEMPT_ROLE"); uint256 public darkConversionRate; bytes32 public burnedMbzMerkleRoot; mapping(address => bool) public burnedMbzClaimed; uint256 public burnedMbzConversionRate; uint256 public taxPercentage; uint256 public taxCollected; uint256 taxSwapCooldown; uint256 taxSwapLastTime; address public serverAddress; mapping(address => uint256) public totalClaimedFromEarnings; mapping(bytes32 => bool) public claimedSignatures; event DARKClaimed(address indexed account, uint256 darkAmount, uint256 mbzAmount); event MBZClaimed(address indexed account, uint256[] tokenId, uint256 earnedClaimableMbz, uint256 burnedClaimableMbz, uint256 darkClaimableMbz); constructor( address _mbz, address _dark, uint256[] memory divineTokenIds, bytes32 _burnedMbzMerkleroot, address _taxReceiver, address backendAddress, address _router ) ERC20("Moon Boyz Token", "$MBZ") { moonboyz = IERC721(_mbz); darkToken = IERC20(_dark); for (uint i = 0; i < divineTokenIds.length; i++) { isDivine[divineTokenIds[i]] = true; } burnedMbzMerkleRoot = _burnedMbzMerkleroot; classicDailyEarnRate = 10 ether; divineDailyEarnRate = 500 ether; earnPeriod = 5 * 365 days; darkConversionRate = 20_000; burnedMbzConversionRate = 3650 ether; taxSwapCooldown = 10 minutes; taxSwapLastTime = block.timestamp; taxReceiver = _taxReceiver; router = _router; taxPercentage = 50; serverAddress = backendAddress; _approve(address(this), _router, ~uint256(0)); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(EXEMPT_ROLE, address(this)); _mint(_taxReceiver, 134996073 ether); } function init(address _utilities) external onlyRole(DEFAULT_ADMIN_ROLE) { utilities = IMoonboyzUtilities(_utilities); } function getClaimableAmountFromDark(address user) external view returns (uint256) { uint256 darkBalance = darkToken.balanceOf(user); uint256 mbzDark = _getMbzFromDark(darkBalance); return mbzDark; } function getClaimableAmountFromMerkle(address user, uint256 burnedMbzCount, bytes32[] memory burnedMbzProof) external view returns (uint256) { if ( burnedMbzCount > 0 && !burnedMbzClaimed[user] ) { bytes32 leaf = keccak256(abi.encodePacked(user, burnedMbzCount)); require(MerkleProof.verify(burnedMbzProof, burnedMbzMerkleRoot, leaf), "INVALID PROOF"); return burnedMbzConversionRate * burnedMbzCount; } return 0; } function claimMBZ( uint256[] memory tokenIds, uint256 updatedTotalClaimed, bytes memory signature, bool claimDark, uint256 burnedMbzCount, bytes32[] memory burnedMbzProof ) external { require(deployedAt > 0, "Claim not started"); uint256 darkClaimableMbz; uint256 burnedClaimableMbz; uint256 earnedClaimableMbz; if (claimDark && darkToken.balanceOf(msg.sender) > 0) { uint256 darkBalance = darkToken.balanceOf(msg.sender); uint256 mbzDark = _getMbzFromDark(darkBalance); uint256 darkSpend = mbzDark * darkConversionRate; require(darkToken.transferFrom(msg.sender, burnAddress, darkSpend), "DARK transfer failed"); darkClaimableMbz += mbzDark; } if ( burnedMbzCount > 0 && !burnedMbzClaimed[msg.sender] ) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender, burnedMbzCount)); require(MerkleProof.verify(burnedMbzProof, burnedMbzMerkleRoot, leaf), "INVALID PROOF"); burnedClaimableMbz += burnedMbzConversionRate * burnedMbzCount; burnedMbzClaimed[msg.sender] = true; } if ( signature.length != 0 && updatedTotalClaimed > totalClaimedFromEarnings[msg.sender] && !claimedSignatures[keccak256(signature)] ) { bytes32 signedMessage = keccak256(abi.encodePacked(msg.sender, updatedTotalClaimed, tokenIds)); bytes32 ethSignedMessageHash = keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", signedMessage) ); address signer = recoverSigner(ethSignedMessageHash, signature); require(signer != address(0) && signer == serverAddress, "Invalid signature"); uint256 claimableAmount = updatedTotalClaimed - totalClaimedFromEarnings[msg.sender]; totalClaimedFromEarnings[msg.sender] = updatedTotalClaimed; claimedSignatures[keccak256(signature)] = true; earnedClaimableMbz += claimableAmount / 1 days; } uint256 total = darkClaimableMbz + burnedClaimableMbz + earnedClaimableMbz; if (total > 0) _mint(msg.sender, total); emit MBZClaimed(msg.sender, tokenIds, earnedClaimableMbz, burnedClaimableMbz, darkClaimableMbz); } function mint(address account, uint256 amount) external onlyRole(MINTER_ROLE) { _mint(account, amount); } function burn(address account, uint256 amount) external onlyRole(BURNER_ROLE) { _burn(account, amount); } function setDarkConversionRate(uint256 rate) external onlyRole(DEFAULT_ADMIN_ROLE) { darkConversionRate = rate; } function setTaxPercentage(uint256 percentage) external onlyRole(DEFAULT_ADMIN_ROLE) { require(percentage <= 50, "Tax percentage must be <= 50"); taxPercentage = percentage; } function setTradeablePair(address pair, bool isTradeable) external onlyRole(DEFAULT_ADMIN_ROLE) { isTradeableContract[pair] = isTradeable; } function setBurnedMbzMerkleRoot(bytes32 root) external onlyRole(DEFAULT_ADMIN_ROLE) { burnedMbzMerkleRoot = root; } function startClaimPeriod() external onlyRole(DEFAULT_ADMIN_ROLE) { require(deployedAt == 0, "Claim period already started"); deployedAt = block.timestamp; } function setTaxSwapCooldown(uint256 cooldown) external onlyRole(DEFAULT_ADMIN_ROLE) { taxSwapCooldown = cooldown; } function setServerAddress(address server) external onlyRole(DEFAULT_ADMIN_ROLE) { serverAddress = server; } function setTaxReceiver(address receiver) external onlyRole(DEFAULT_ADMIN_ROLE) { taxReceiver = receiver; } function withdrawERC20(address token, address to, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { IERC20(token).transfer(to, amount); } function withdrawEth(address payable to, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { to.transfer(amount); } function _getMbzFromDark(uint256 darkAmount) internal view returns (uint256) { return (darkAmount / (darkConversionRate * 1e18)) * 1e18; } function _spendAllowance( address owner, address spender, uint256 amount ) internal override { if (allowance(owner, spender) == ~uint256(0)) { return; } return super._spendAllowance(owner, spender, amount); } function _transfer( address from, address to, uint256 amount ) internal override { uint256 toRecip = amount; if ( (isTradeableContract[from] || isTradeableContract[to]) && !(hasRole(EXEMPT_ROLE, from) || hasRole(EXEMPT_ROLE, to)) ) { uint256 toTax = (amount * taxPercentage) / 1000; toRecip = amount - toTax; if (toTax > 0) { super._transfer(from, address(this), toTax); taxCollected += toTax; if (address(utilities) != address(0) && isTradeableContract[to]) { require(utilities.tradingEnabled(from, to, amount), "Trading disabled"); } } } if ( !isTradeableContract[from] && taxCollected > 0 && block.timestamp - taxSwapLastTime >= taxSwapCooldown ) { uint256 toSwap = taxCollected; taxCollected = 0; taxSwapLastTime = block.timestamp; if (balanceOf(address(this)) < toSwap) toSwap = balanceOf(address(this)); _swapTokensToEth(toSwap, taxReceiver); } super._transfer(from, to, toRecip); } function _swapTokensToEth( uint256 tokenAmount, address recip ) private { IUniswapV2Router02 swapRouter = IUniswapV2Router02(router); address[] memory path = new address[](2); path[0] = address(this); path[1] = swapRouter.WETH(); swapRouter.swapExactTokensForETH( tokenAmount, 0, path, recip, block.timestamp + 15 minutes ); } function recoverSigner(bytes32 ethSignedMessageHash, bytes memory signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(signature); return ecrecover(ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) public pure returns (bytes32 r, bytes32 s, uint8 v) { require(sig.length == 65, "Invalid signature length"); assembly { // First 32 bytes, after the length prefix r := mload(add(sig, 32)) // Second 32 bytes s := mload(add(sig, 64)) // Final byte, first of next 32 bytes v := byte(0, mload(add(sig, 96))) } } receive() external payable {} }
// 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 // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
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.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.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.openzeppelin.com/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 ERC20 is Context, IERC20, IERC20Metadata { 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. */ constructor(string memory name_, string memory symbol_) { _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; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _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; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _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; // Overflow not possible: amount <= accountBalance <= totalSupply. _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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IMoonboyzUtilities { function tradingEnabled(address from,address to,uint256 amount) external view returns (bool); }
// 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); }
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/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @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; /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// 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 (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "v2-core/=lib/v2-core/contracts/", "v2-periphery/=lib/v2-periphery/contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_mbz","type":"address"},{"internalType":"address","name":"_dark","type":"address"},{"internalType":"uint256[]","name":"divineTokenIds","type":"uint256[]"},{"internalType":"bytes32","name":"_burnedMbzMerkleroot","type":"bytes32"},{"internalType":"address","name":"_taxReceiver","type":"address"},{"internalType":"address","name":"backendAddress","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"darkAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mbzAmount","type":"uint256"}],"name":"DARKClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"earnedClaimableMbz","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedClaimableMbz","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"darkClaimableMbz","type":"uint256"}],"name":"MBZClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXEMPT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnedMbzClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedMbzConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedMbzMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"updatedTotalClaimed","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bool","name":"claimDark","type":"bool"},{"internalType":"uint256","name":"burnedMbzCount","type":"uint256"},{"internalType":"bytes32[]","name":"burnedMbzProof","type":"bytes32[]"}],"name":"claimMBZ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimedSignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"classicDailyEarnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"darkConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"darkToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"divineDailyEarnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earnPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimableAmountFromDark","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"burnedMbzCount","type":"uint256"},{"internalType":"bytes32[]","name":"burnedMbzProof","type":"bytes32[]"}],"name":"getClaimableAmountFromMerkle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_utilities","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isDivine","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTradeableContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"moonboyz","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setBurnedMbzMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setDarkConversionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"server","type":"address"}],"name":"setServerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setTaxPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setTaxReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cooldown","type":"uint256"}],"name":"setTaxSwapCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"isTradeable","type":"bool"}],"name":"setTradeablePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"startClaimPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenClaims","outputs":[{"internalType":"uint128","name":"lastClaimedAt","type":"uint128"},{"internalType":"uint128","name":"totalClaimTime","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalClaimedFromEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"utilities","outputs":[{"internalType":"contract IMoonboyzUtilities","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61010060405261dead6080523480156200001857600080fd5b5060405162003828380380620038288339810160408190526200003b916200050f565b6040518060400160405280600f81526020016e26b7b7b7102137bcbd102a37b5b2b760891b815250604051806040016040528060048152602001631226a12d60e11b8152508160039081620000919190620006d0565b506004620000a08282620006d0565b5050600680546001600160a01b03808b166001600160a01b03199283161790925560078054928a16929091169190911790555060005b85518110156200013e576001600d6000888481518110620000fb57620000fb6200079c565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200013590620007c8565b915050620000d6565b506010849055678ac7230489e8000060a052681b1ae4d6e2ef50000060c052630966018060e052614e20600f5568c5ddeced789fc8000060125561025860155542601655600980546001600160a01b038086166001600160a01b031992831617909255600a805484841690831617905560326013556017805492851692909116919091179055620001d3308260001962000230565b620001e06000336200035c565b6200020c7f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c9306200035c565b62000223836a6faa87c7fb737328040000620003e7565b50505050505050620007fa565b6001600160a01b038316620002985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620002fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200028f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b620003688282620004aa565b620003e35760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003a23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b0382166200043f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200028f565b8060026000828254620004539190620007e4565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b505050565b80516001600160a01b0381168114620004f457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080600080600060e0888a0312156200052b57600080fd5b6200053688620004dc565b9650602062000547818a01620004dc565b60408a01519097506001600160401b03808211156200056557600080fd5b818b0191508b601f8301126200057a57600080fd5b8151818111156200058f576200058f620004f9565b8060051b604051601f19603f83011681018181108582111715620005b757620005b7620004f9565b60405291825284820192508381018501918e831115620005d657600080fd5b938501935b82851015620005f657845184529385019392850192620005db565b809a50505050505050606088015193506200061460808901620004dc565b92506200062460a08901620004dc565b91506200063460c08901620004dc565b905092959891949750929550565b600181811c908216806200065757607f821691505b6020821081036200067857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004d757600081815260208120601f850160051c81016020861015620006a75750805b601f850160051c820191505b81811015620006c857828155600101620006b3565b505050505050565b81516001600160401b03811115620006ec57620006ec620004f9565b6200070481620006fd845462000642565b846200067e565b602080601f8311600181146200073c5760008415620007235750858301515b600019600386901b1c1916600185901b178555620006c8565b600085815260208120601f198616915b828110156200076d578886015182559484019460019091019084016200074c565b50858210156200078c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620007dd57620007dd620007b2565b5060010190565b80820180821115620004d157620004d1620007b2565b60805160a05160c05160e051612fed6200083b60003960006109440152600061081901526000610a210152600081816107e501526115c70152612fed6000f3fe6080604052600436106103a65760003560e01c80638383c509116101e7578063beef9e5a1161010d578063dd62ed3e116100a0578063e8a94c361161006f578063e8a94c3614610c04578063eae4c19f14610c19578063f887ea4014610c2f578063fdbcab7914610c4f57600080fd5b8063dd62ed3e14610b74578063e402fb8414610b94578063e6ef73d614610bc4578063e7fa4f1f14610be457600080fd5b8063cd8de42c116100dc578063cd8de42c14610ae0578063d539139314610b00578063d547741f14610b34578063db420fe314610b5457600080fd5b8063beef9e5a14610a43578063c0e7c68014610a70578063c8f8e10f14610a90578063cc17e5ea14610ac057600080fd5b80639dc29fac11610185578063a7bb580311610154578063a7bb58031461099b578063a9059cbb146109d9578063ae7b6d16146109f9578063b5d6eff014610a0f57600080fd5b80639dc29fac146109125780639de3f80114610932578063a217fddf14610966578063a457c2d71461097b57600080fd5b806392ef68c6116101c157806392ef68c6146108a757806395d89b41146108c757806396ef83e2146108dc57806397aba7f9146108f257600080fd5b80638383c5091461085b578063916a47f71461087157806391d148541461088757600080fd5b8063313ce567116102cc5780634f10fe641161026a57806370a082311161023957806370a082311461079d57806370d5ae05146107d357806378e3c3e0146108075780637f0d64491461083b57600080fd5b80634f10fe6414610727578063699abb3c146107475780636aa169a5146107675780636d415c001461078757600080fd5b806339509351116102a657806339509351146106a757806340c10f19146106c757806344004cc1146106e757806347b64eb01461070757600080fd5b8063313ce5671461064b578063321ceaae1461066757806336568abe1461068757600080fd5b806319ab453c11610344578063271cb14611610313578063271cb1461461055e578063282c51f3146105bf5780632acfc2ca146105f35780632f2ff15d1461062b57600080fd5b806319ab453c146104cc5780631b9a91a4146104ee57806323b872dd1461050e578063248a9ca31461052e57600080fd5b8063095ea7b311610380578063095ea7b3146104395780630aaf5fa814610459578063144715f21461048957806318160ddd146104b757600080fd5b806301ffc9a7146103b2578063043f28ef146103e757806306fdde031461041757600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd36600461274e565b610c83565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103d261040236600461278d565b600b6020526000908152604090205460ff1681565b34801561042357600080fd5b5061042c610cba565b6040516103de91906127ce565b34801561044557600080fd5b506103d2610454366004612801565b610d4c565b34801561046557600080fd5b506103d261047436600461282d565b600d6020526000908152604090205460ff1681565b34801561049557600080fd5b506104a96104a436600461278d565b610d64565b6040519081526020016103de565b3480156104c357600080fd5b506002546104a9565b3480156104d857600080fd5b506104ec6104e736600461278d565b610deb565b005b3480156104fa57600080fd5b506104ec610509366004612801565b610e19565b34801561051a57600080fd5b506103d2610529366004612846565b610e60565b34801561053a57600080fd5b506104a961054936600461282d565b60009081526005602052604090206001015490565b34801561056a57600080fd5b5061059f61057936600461282d565b600e602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016103de565b3480156105cb57600080fd5b506104a97f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b3480156105ff57600080fd5b50600754610613906001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b34801561063757600080fd5b506104ec610646366004612887565b610e86565b34801561065757600080fd5b50604051601281526020016103de565b34801561067357600080fd5b50600654610613906001600160a01b031681565b34801561069357600080fd5b506104ec6106a2366004612887565b610eb0565b3480156106b357600080fd5b506103d26106c2366004612801565b610f33565b3480156106d357600080fd5b506104ec6106e2366004612801565b610f55565b3480156106f357600080fd5b506104ec610702366004612846565b610f89565b34801561071357600080fd5b506104ec61072236600461278d565b61100e565b34801561073357600080fd5b506104ec6107423660046128d5565b61103c565b34801561075357600080fd5b506104ec61076236600461282d565b611073565b34801561077357600080fd5b506104ec61078236600461282d565b6110d5565b34801561079357600080fd5b506104a960105481565b3480156107a957600080fd5b506104a96107b836600461278d565b6001600160a01b031660009081526020819052604090205490565b3480156107df57600080fd5b506106137f000000000000000000000000000000000000000000000000000000000000000081565b34801561081357600080fd5b506104a97f000000000000000000000000000000000000000000000000000000000000000081565b34801561084757600080fd5b506104a96108563660046129d9565b6110e6565b34801561086757600080fd5b506104a960125481565b34801561087d57600080fd5b506104a960145481565b34801561089357600080fd5b506103d26108a2366004612887565b6111bf565b3480156108b357600080fd5b506104ec6108c236600461282d565b6111ea565b3480156108d357600080fd5b5061042c6111fb565b3480156108e857600080fd5b506104a9600f5481565b3480156108fe57600080fd5b5061061361090d366004612aa2565b61120a565b34801561091e57600080fd5b506104ec61092d366004612801565b611289565b34801561093e57600080fd5b506104a97f000000000000000000000000000000000000000000000000000000000000000081565b34801561097257600080fd5b506104a9600081565b34801561098757600080fd5b506103d2610996366004612801565b6112bd565b3480156109a757600080fd5b506109bb6109b6366004612ae9565b611343565b60408051938452602084019290925260ff16908201526060016103de565b3480156109e557600080fd5b506103d26109f4366004612801565b6113b7565b348015610a0557600080fd5b506104a960135481565b348015610a1b57600080fd5b506104a97f000000000000000000000000000000000000000000000000000000000000000081565b348015610a4f57600080fd5b506104a9610a5e36600461278d565b60186020526000908152604090205481565b348015610a7c57600080fd5b506104ec610a8b36600461282d565b6113c5565b348015610a9c57600080fd5b506103d2610aab36600461278d565b60116020526000908152604090205460ff1681565b348015610acc57600080fd5b50600854610613906001600160a01b031681565b348015610aec57600080fd5b506104ec610afb36600461278d565b6113d6565b348015610b0c57600080fd5b506104a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610b4057600080fd5b506104ec610b4f366004612887565b611404565b348015610b6057600080fd5b50601754610613906001600160a01b031681565b348015610b8057600080fd5b506104a9610b8f366004612b1e565b611429565b348015610ba057600080fd5b506103d2610baf36600461282d565b60196020526000908152604090205460ff1681565b348015610bd057600080fd5b50600954610613906001600160a01b031681565b348015610bf057600080fd5b506104ec610bff366004612b4c565b611454565b348015610c1057600080fd5b506104ec6119d4565b348015610c2557600080fd5b506104a9600c5481565b348015610c3b57600080fd5b50600a54610613906001600160a01b031681565b348015610c5b57600080fd5b506104a97f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c981565b60006001600160e01b03198216637965db0b60e01b1480610cb457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610cc990612c4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590612c4c565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b600033610d5a818585611a36565b5060019392505050565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612c86565b90506000610de382611b5a565b949350505050565b6000610df681611b8e565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e2481611b8e565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610e5a573d6000803e3d6000fd5b50505050565b600033610e6e858285611b9b565b610e79858585611bbd565b60019150505b9392505050565b600082815260056020526040902060010154610ea181611b8e565b610eab8383611e51565b505050565b6001600160a01b0381163314610f255760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610f2f8282611ed7565b5050565b600033610d5a818585610f468383611429565b610f509190612cb5565b611a36565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f7f81611b8e565b610eab8383611f3e565b6000610f9481611b8e565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af1158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110079190612cc8565b5050505050565b600061101981611b8e565b50601780546001600160a01b0319166001600160a01b0392909216919091179055565b600061104781611b8e565b506001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b600061107e81611b8e565b60328211156110cf5760405162461bcd60e51b815260206004820152601c60248201527f5461782070657263656e74616765206d757374206265203c3d203530000000006044820152606401610f1c565b50601355565b60006110e081611b8e565b50601555565b6000808311801561111057506001600160a01b03841660009081526011602052604090205460ff16155b156111b5576040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506111638360105483611ffd565b61119f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a210282927a7a360991b6044820152606401610f1c565b836012546111ad9190612ce5565b915050610e7f565b5060009392505050565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006111f581611b8e565b50600f55565b606060048054610cc990612c4c565b60008060008061121985611343565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611274573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486112b381611b8e565b610eab8383612013565b600033816112cb8286611429565b90508381101561132b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f1c565b6113388286868403611a36565b506001949350505050565b600080600083516041146113995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610f1c565b50505060208101516040820151606090920151909260009190911a90565b600033610d5a818585611bbd565b60006113d081611b8e565b50601055565b60006113e181611b8e565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526005602052604090206001015461141f81611b8e565b610eab8383611ed7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000600c541161149a5760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cdd185c9d1959607a1b6044820152606401610f1c565b600080600085801561151657506007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115149190612c86565b115b15611699576007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115889190612c86565b9050600061159582611b5a565b90506000600f54826115a79190612ce5565b6007546040516323b872dd60e01b81523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018490529293509116906323b872dd906064016020604051808303816000875af1158015611622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116469190612cc8565b6116895760405162461bcd60e51b815260206004820152601460248201527311105492c81d1c985b9cd9995c8819985a5b195960621b6044820152606401610f1c565b6116938287612cb5565b95505050505b6000851180156116b957503360009081526011602052604090205460ff16155b1561177d576040516bffffffffffffffffffffffff193360601b1660208201526034810186905260009060540160405160208183030381529060405280519060200120905061170b8560105483611ffd565b6117475760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a210282927a7a360991b6044820152606401610f1c565b856012546117559190612ce5565b61175f9084612cb5565b336000908152601160205260409020805460ff191660011790559250505b86511580159061179b57503360009081526018602052604090205488115b80156117c15750865160208089019190912060009081526019909152604090205460ff16155b1561195857600033898b6040516020016117dd93929190612cfc565b60405160208183030381529060405280519060200120905060008160405160200161183491907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506000611858828b61120a565b90506001600160a01b0381161580159061187f57506017546001600160a01b038281169116145b6118bf5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610f1c565b336000908152601860205260408120546118d9908d612d51565b90508b60186000336001600160a01b03166001600160a01b03168152602001908152602001600020819055506001601960008d80519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555062015180816119479190612d64565b6119519086612cb5565b9450505050505b6000816119658486612cb5565b61196f9190612cb5565b90508015611981576119813382611f3e565b336001600160a01b03167f84a8d1ef00af6e23c3c651c63b42e573e95dfd12ff65ae9f336883a4225642218b8486886040516119c09493929190612d86565b60405180910390a250505050505050505050565b60006119df81611b8e565b600c5415611a2f5760405162461bcd60e51b815260206004820152601c60248201527f436c61696d20706572696f6420616c72656164792073746172746564000000006044820152606401610f1c565b5042600c55565b6001600160a01b038316611a985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f1c565b6001600160a01b038216611af95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f1c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000600f54670de0b6b3a7640000611b729190612ce5565b611b7c9083612d64565b610cb490670de0b6b3a7640000612ce5565b611b988133612145565b50565b600019611ba88484611429565b03611bb257505050565b610eab83838361219e565b6001600160a01b0383166000908152600b6020526040902054819060ff1680611bfe57506001600160a01b0383166000908152600b602052604090205460ff165b8015611c615750611c2f7f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c9856111bf565b80611c5f5750611c5f7f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c9846111bf565b155b15611dae5760006103e860135484611c799190612ce5565b611c839190612d64565b9050611c8f8184612d51565b91508015611dac57611ca2853083612212565b8060146000828254611cb49190612cb5565b90915550506008546001600160a01b031615801590611ceb57506001600160a01b0384166000908152600b602052604090205460ff165b15611dac576008546040516388f3a0ad60e01b81526001600160a01b038781166004830152868116602483015260448201869052909116906388f3a0ad90606401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612cc8565b611dac5760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610f1c565b505b6001600160a01b0384166000908152600b602052604090205460ff16158015611dd957506000601454115b8015611df35750601554601654611df09042612d51565b10155b15611e465760148054600091829055426016553082526020829052604090912054811115611e2d5750306000908152602081905260409020545b600954611e449082906001600160a01b03166123b6565b505b610e5a848483612212565b611e5b82826111bf565b610f2f5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e933390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611ee182826111bf565b15610f2f5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216611f945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f1c565b8060026000828254611fa69190612cb5565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008261200a8584612524565b14949350505050565b6001600160a01b0382166120735760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f1c565b6001600160a01b038216600090815260208190526040902054818110156120e75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f1c565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61214f82826111bf565b610f2f5761215c81612571565b612167836020612583565b604051602001612178929190612ddd565b60408051601f198184030181529082905262461bcd60e51b8252610f1c916004016127ce565b60006121aa8484611429565b90506000198114610e5a57818110156122055760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f1c565b610e5a8484848403611a36565b6001600160a01b0383166122765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f1c565b6001600160a01b0382166122d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f1c565b6001600160a01b038316600090815260208190526040902054818110156123505760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f1c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e5a565b600a546040805160028082526060820183526001600160a01b039093169260009260208301908036833701905050905030816000815181106123fa576123fa612e52565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190612e68565b8160018151811061248f5761248f612e52565b6001600160a01b03928316602091820292909201015282166318cbafe585600084876124bd42610384612cb5565b6040518663ffffffff1660e01b81526004016124dd959493929190612e85565b6000604051808303816000875af11580156124fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110079190810190612ef6565b600081815b8451811015612569576125558286838151811061254857612548612e52565b602002602001015161271f565b91508061256181612f87565b915050612529565b509392505050565b6060610cb46001600160a01b03831660145b60606000612592836002612ce5565b61259d906002612cb5565b67ffffffffffffffff8111156125b5576125b5612903565b6040519080825280601f01601f1916602001820160405280156125df576020820181803683370190505b509050600360fc1b816000815181106125fa576125fa612e52565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061262957612629612e52565b60200101906001600160f81b031916908160001a905350600061264d846002612ce5565b612658906001612cb5565b90505b60018111156126d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061268c5761268c612e52565b1a60f81b8282815181106126a2576126a2612e52565b60200101906001600160f81b031916908160001a90535060049490941c936126c981612fa0565b905061265b565b508315610e7f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f1c565b600081831061273b576000828152602084905260409020610e7f565b6000838152602083905260409020610e7f565b60006020828403121561276057600080fd5b81356001600160e01b031981168114610e7f57600080fd5b6001600160a01b0381168114611b9857600080fd5b60006020828403121561279f57600080fd5b8135610e7f81612778565b60005b838110156127c55781810151838201526020016127ad565b50506000910152565b60208152600082518060208401526127ed8160408501602087016127aa565b601f01601f19169190910160400192915050565b6000806040838503121561281457600080fd5b823561281f81612778565b946020939093013593505050565b60006020828403121561283f57600080fd5b5035919050565b60008060006060848603121561285b57600080fd5b833561286681612778565b9250602084013561287681612778565b929592945050506040919091013590565b6000806040838503121561289a57600080fd5b8235915060208301356128ac81612778565b809150509250929050565b8015158114611b9857600080fd5b80356128d0816128b7565b919050565b600080604083850312156128e857600080fd5b82356128f381612778565b915060208301356128ac816128b7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561294257612942612903565b604052919050565b600067ffffffffffffffff82111561296457612964612903565b5060051b60200190565b600082601f83011261297f57600080fd5b8135602061299461298f8361294a565b612919565b82815260059290921b840181019181810190868411156129b357600080fd5b8286015b848110156129ce57803583529183019183016129b7565b509695505050505050565b6000806000606084860312156129ee57600080fd5b83356129f981612778565b925060208401359150604084013567ffffffffffffffff811115612a1c57600080fd5b612a288682870161296e565b9150509250925092565b600082601f830112612a4357600080fd5b813567ffffffffffffffff811115612a5d57612a5d612903565b612a70601f8201601f1916602001612919565b818152846020838601011115612a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612ab557600080fd5b82359150602083013567ffffffffffffffff811115612ad357600080fd5b612adf85828601612a32565b9150509250929050565b600060208284031215612afb57600080fd5b813567ffffffffffffffff811115612b1257600080fd5b610de384828501612a32565b60008060408385031215612b3157600080fd5b8235612b3c81612778565b915060208301356128ac81612778565b60008060008060008060c08789031215612b6557600080fd5b863567ffffffffffffffff80821115612b7d57600080fd5b818901915089601f830112612b9157600080fd5b81356020612ba161298f8361294a565b82815260059290921b8401810191818101908d841115612bc057600080fd5b948201945b83861015612bde57853582529482019490820190612bc5565b9a50508a01359750506040890135915080821115612bfb57600080fd5b612c078a838b01612a32565b9550612c1560608a016128c5565b94506080890135935060a0890135915080821115612c3257600080fd5b50612c3f89828a0161296e565b9150509295509295509295565b600181811c90821680612c6057607f821691505b602082108103612c8057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612c9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610cb457610cb4612c9f565b600060208284031215612cda57600080fd5b8151610e7f816128b7565b8082028115828204841417610cb457610cb4612c9f565b6bffffffffffffffffffffffff198460601b1681528260148201526000603482018351602080860160005b83811015612d4357815185529382019390820190600101612d27565b509298975050505050505050565b81810381811115610cb457610cb4612c9f565b600082612d8157634e487b7160e01b600052601260045260246000fd5b500490565b6080808252855190820181905260009060209060a0840190828901845b82811015612dbf57815184529284019290840190600101612da3565b50505090830195909552506040810192909252606090910152919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612e158160178501602088016127aa565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612e468160288401602088016127aa565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612e7a57600080fd5b8151610e7f81612778565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ed55784516001600160a01b031683529383019391830191600101612eb0565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215612f0957600080fd5b825167ffffffffffffffff811115612f2057600080fd5b8301601f81018513612f3157600080fd5b8051612f3f61298f8261294a565b81815260059190911b82018301908381019087831115612f5e57600080fd5b928401925b82841015612f7c57835182529284019290840190612f63565b979650505050505050565b600060018201612f9957612f99612c9f565b5060010190565b600081612faf57612faf612c9f565b50600019019056fea26469706673582212208c89077d598e0821a587d8d4abc36ebacf7d0ab804a72ba6339b96c5701bc87664736f6c63430008120033000000000000000000000000d8682bfa6918b0174f287b888e765b9a1b4dc9c3000000000000000000000000ec5709c0750043cfb4b869dbc871e86efe18b4c500000000000000000000000000000000000000000000000000000000000000e0f6de193156f2ff181bda236b271f406b8ea9332ef0790db58bebc8963e6417fc000000000000000000000000b9b0a05eac77cd7d9749a7fd91704da0fd941a82000000000000000000000000fdc2210d8b9d39076f5f0241eaf3fe34f63c9e120000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000b570000000000000000000000000000000000000000000000000000000000000dc10000000000000000000000000000000000000000000000000000000000001002000000000000000000000000000000000000000000000000000000000000180600000000000000000000000000000000000000000000000000000000000019940000000000000000000000000000000000000000000000000000000000001d7b000000000000000000000000000000000000000000000000000000000000204f000000000000000000000000000000000000000000000000000000000000213d000000000000000000000000000000000000000000000000000000000000237500000000000000000000000000000000000000000000000000000000000026be00000000000000000000000000000000000000000000000000000000000027eb
Deployed Bytecode
0x6080604052600436106103a65760003560e01c80638383c509116101e7578063beef9e5a1161010d578063dd62ed3e116100a0578063e8a94c361161006f578063e8a94c3614610c04578063eae4c19f14610c19578063f887ea4014610c2f578063fdbcab7914610c4f57600080fd5b8063dd62ed3e14610b74578063e402fb8414610b94578063e6ef73d614610bc4578063e7fa4f1f14610be457600080fd5b8063cd8de42c116100dc578063cd8de42c14610ae0578063d539139314610b00578063d547741f14610b34578063db420fe314610b5457600080fd5b8063beef9e5a14610a43578063c0e7c68014610a70578063c8f8e10f14610a90578063cc17e5ea14610ac057600080fd5b80639dc29fac11610185578063a7bb580311610154578063a7bb58031461099b578063a9059cbb146109d9578063ae7b6d16146109f9578063b5d6eff014610a0f57600080fd5b80639dc29fac146109125780639de3f80114610932578063a217fddf14610966578063a457c2d71461097b57600080fd5b806392ef68c6116101c157806392ef68c6146108a757806395d89b41146108c757806396ef83e2146108dc57806397aba7f9146108f257600080fd5b80638383c5091461085b578063916a47f71461087157806391d148541461088757600080fd5b8063313ce567116102cc5780634f10fe641161026a57806370a082311161023957806370a082311461079d57806370d5ae05146107d357806378e3c3e0146108075780637f0d64491461083b57600080fd5b80634f10fe6414610727578063699abb3c146107475780636aa169a5146107675780636d415c001461078757600080fd5b806339509351116102a657806339509351146106a757806340c10f19146106c757806344004cc1146106e757806347b64eb01461070757600080fd5b8063313ce5671461064b578063321ceaae1461066757806336568abe1461068757600080fd5b806319ab453c11610344578063271cb14611610313578063271cb1461461055e578063282c51f3146105bf5780632acfc2ca146105f35780632f2ff15d1461062b57600080fd5b806319ab453c146104cc5780631b9a91a4146104ee57806323b872dd1461050e578063248a9ca31461052e57600080fd5b8063095ea7b311610380578063095ea7b3146104395780630aaf5fa814610459578063144715f21461048957806318160ddd146104b757600080fd5b806301ffc9a7146103b2578063043f28ef146103e757806306fdde031461041757600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd36600461274e565b610c83565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103d261040236600461278d565b600b6020526000908152604090205460ff1681565b34801561042357600080fd5b5061042c610cba565b6040516103de91906127ce565b34801561044557600080fd5b506103d2610454366004612801565b610d4c565b34801561046557600080fd5b506103d261047436600461282d565b600d6020526000908152604090205460ff1681565b34801561049557600080fd5b506104a96104a436600461278d565b610d64565b6040519081526020016103de565b3480156104c357600080fd5b506002546104a9565b3480156104d857600080fd5b506104ec6104e736600461278d565b610deb565b005b3480156104fa57600080fd5b506104ec610509366004612801565b610e19565b34801561051a57600080fd5b506103d2610529366004612846565b610e60565b34801561053a57600080fd5b506104a961054936600461282d565b60009081526005602052604090206001015490565b34801561056a57600080fd5b5061059f61057936600461282d565b600e602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016103de565b3480156105cb57600080fd5b506104a97f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b3480156105ff57600080fd5b50600754610613906001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b34801561063757600080fd5b506104ec610646366004612887565b610e86565b34801561065757600080fd5b50604051601281526020016103de565b34801561067357600080fd5b50600654610613906001600160a01b031681565b34801561069357600080fd5b506104ec6106a2366004612887565b610eb0565b3480156106b357600080fd5b506103d26106c2366004612801565b610f33565b3480156106d357600080fd5b506104ec6106e2366004612801565b610f55565b3480156106f357600080fd5b506104ec610702366004612846565b610f89565b34801561071357600080fd5b506104ec61072236600461278d565b61100e565b34801561073357600080fd5b506104ec6107423660046128d5565b61103c565b34801561075357600080fd5b506104ec61076236600461282d565b611073565b34801561077357600080fd5b506104ec61078236600461282d565b6110d5565b34801561079357600080fd5b506104a960105481565b3480156107a957600080fd5b506104a96107b836600461278d565b6001600160a01b031660009081526020819052604090205490565b3480156107df57600080fd5b506106137f000000000000000000000000000000000000000000000000000000000000dead81565b34801561081357600080fd5b506104a97f00000000000000000000000000000000000000000000001b1ae4d6e2ef50000081565b34801561084757600080fd5b506104a96108563660046129d9565b6110e6565b34801561086757600080fd5b506104a960125481565b34801561087d57600080fd5b506104a960145481565b34801561089357600080fd5b506103d26108a2366004612887565b6111bf565b3480156108b357600080fd5b506104ec6108c236600461282d565b6111ea565b3480156108d357600080fd5b5061042c6111fb565b3480156108e857600080fd5b506104a9600f5481565b3480156108fe57600080fd5b5061061361090d366004612aa2565b61120a565b34801561091e57600080fd5b506104ec61092d366004612801565b611289565b34801561093e57600080fd5b506104a97f000000000000000000000000000000000000000000000000000000000966018081565b34801561097257600080fd5b506104a9600081565b34801561098757600080fd5b506103d2610996366004612801565b6112bd565b3480156109a757600080fd5b506109bb6109b6366004612ae9565b611343565b60408051938452602084019290925260ff16908201526060016103de565b3480156109e557600080fd5b506103d26109f4366004612801565b6113b7565b348015610a0557600080fd5b506104a960135481565b348015610a1b57600080fd5b506104a97f0000000000000000000000000000000000000000000000008ac7230489e8000081565b348015610a4f57600080fd5b506104a9610a5e36600461278d565b60186020526000908152604090205481565b348015610a7c57600080fd5b506104ec610a8b36600461282d565b6113c5565b348015610a9c57600080fd5b506103d2610aab36600461278d565b60116020526000908152604090205460ff1681565b348015610acc57600080fd5b50600854610613906001600160a01b031681565b348015610aec57600080fd5b506104ec610afb36600461278d565b6113d6565b348015610b0c57600080fd5b506104a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610b4057600080fd5b506104ec610b4f366004612887565b611404565b348015610b6057600080fd5b50601754610613906001600160a01b031681565b348015610b8057600080fd5b506104a9610b8f366004612b1e565b611429565b348015610ba057600080fd5b506103d2610baf36600461282d565b60196020526000908152604090205460ff1681565b348015610bd057600080fd5b50600954610613906001600160a01b031681565b348015610bf057600080fd5b506104ec610bff366004612b4c565b611454565b348015610c1057600080fd5b506104ec6119d4565b348015610c2557600080fd5b506104a9600c5481565b348015610c3b57600080fd5b50600a54610613906001600160a01b031681565b348015610c5b57600080fd5b506104a97f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c981565b60006001600160e01b03198216637965db0b60e01b1480610cb457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610cc990612c4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590612c4c565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b600033610d5a818585611a36565b5060019392505050565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612c86565b90506000610de382611b5a565b949350505050565b6000610df681611b8e565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e2481611b8e565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015610e5a573d6000803e3d6000fd5b50505050565b600033610e6e858285611b9b565b610e79858585611bbd565b60019150505b9392505050565b600082815260056020526040902060010154610ea181611b8e565b610eab8383611e51565b505050565b6001600160a01b0381163314610f255760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610f2f8282611ed7565b5050565b600033610d5a818585610f468383611429565b610f509190612cb5565b611a36565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f7f81611b8e565b610eab8383611f3e565b6000610f9481611b8e565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af1158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110079190612cc8565b5050505050565b600061101981611b8e565b50601780546001600160a01b0319166001600160a01b0392909216919091179055565b600061104781611b8e565b506001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b600061107e81611b8e565b60328211156110cf5760405162461bcd60e51b815260206004820152601c60248201527f5461782070657263656e74616765206d757374206265203c3d203530000000006044820152606401610f1c565b50601355565b60006110e081611b8e565b50601555565b6000808311801561111057506001600160a01b03841660009081526011602052604090205460ff16155b156111b5576040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506111638360105483611ffd565b61119f5760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a210282927a7a360991b6044820152606401610f1c565b836012546111ad9190612ce5565b915050610e7f565b5060009392505050565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006111f581611b8e565b50600f55565b606060048054610cc990612c4c565b60008060008061121985611343565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611274573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486112b381611b8e565b610eab8383612013565b600033816112cb8286611429565b90508381101561132b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f1c565b6113388286868403611a36565b506001949350505050565b600080600083516041146113995760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610f1c565b50505060208101516040820151606090920151909260009190911a90565b600033610d5a818585611bbd565b60006113d081611b8e565b50601055565b60006113e181611b8e565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526005602052604090206001015461141f81611b8e565b610eab8383611ed7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000600c541161149a5760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd081cdd185c9d1959607a1b6044820152606401610f1c565b600080600085801561151657506007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115149190612c86565b115b15611699576007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115889190612c86565b9050600061159582611b5a565b90506000600f54826115a79190612ce5565b6007546040516323b872dd60e01b81523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead81166024830152604482018490529293509116906323b872dd906064016020604051808303816000875af1158015611622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116469190612cc8565b6116895760405162461bcd60e51b815260206004820152601460248201527311105492c81d1c985b9cd9995c8819985a5b195960621b6044820152606401610f1c565b6116938287612cb5565b95505050505b6000851180156116b957503360009081526011602052604090205460ff16155b1561177d576040516bffffffffffffffffffffffff193360601b1660208201526034810186905260009060540160405160208183030381529060405280519060200120905061170b8560105483611ffd565b6117475760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a210282927a7a360991b6044820152606401610f1c565b856012546117559190612ce5565b61175f9084612cb5565b336000908152601160205260409020805460ff191660011790559250505b86511580159061179b57503360009081526018602052604090205488115b80156117c15750865160208089019190912060009081526019909152604090205460ff16155b1561195857600033898b6040516020016117dd93929190612cfc565b60405160208183030381529060405280519060200120905060008160405160200161183491907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506000611858828b61120a565b90506001600160a01b0381161580159061187f57506017546001600160a01b038281169116145b6118bf5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610f1c565b336000908152601860205260408120546118d9908d612d51565b90508b60186000336001600160a01b03166001600160a01b03168152602001908152602001600020819055506001601960008d80519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555062015180816119479190612d64565b6119519086612cb5565b9450505050505b6000816119658486612cb5565b61196f9190612cb5565b90508015611981576119813382611f3e565b336001600160a01b03167f84a8d1ef00af6e23c3c651c63b42e573e95dfd12ff65ae9f336883a4225642218b8486886040516119c09493929190612d86565b60405180910390a250505050505050505050565b60006119df81611b8e565b600c5415611a2f5760405162461bcd60e51b815260206004820152601c60248201527f436c61696d20706572696f6420616c72656164792073746172746564000000006044820152606401610f1c565b5042600c55565b6001600160a01b038316611a985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f1c565b6001600160a01b038216611af95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f1c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000600f54670de0b6b3a7640000611b729190612ce5565b611b7c9083612d64565b610cb490670de0b6b3a7640000612ce5565b611b988133612145565b50565b600019611ba88484611429565b03611bb257505050565b610eab83838361219e565b6001600160a01b0383166000908152600b6020526040902054819060ff1680611bfe57506001600160a01b0383166000908152600b602052604090205460ff165b8015611c615750611c2f7f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c9856111bf565b80611c5f5750611c5f7f8a826f4f9047942d5903443425209313d1c5cba3a8c5021523fed3ce4de3e7c9846111bf565b155b15611dae5760006103e860135484611c799190612ce5565b611c839190612d64565b9050611c8f8184612d51565b91508015611dac57611ca2853083612212565b8060146000828254611cb49190612cb5565b90915550506008546001600160a01b031615801590611ceb57506001600160a01b0384166000908152600b602052604090205460ff165b15611dac576008546040516388f3a0ad60e01b81526001600160a01b038781166004830152868116602483015260448201869052909116906388f3a0ad90606401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190612cc8565b611dac5760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610f1c565b505b6001600160a01b0384166000908152600b602052604090205460ff16158015611dd957506000601454115b8015611df35750601554601654611df09042612d51565b10155b15611e465760148054600091829055426016553082526020829052604090912054811115611e2d5750306000908152602081905260409020545b600954611e449082906001600160a01b03166123b6565b505b610e5a848483612212565b611e5b82826111bf565b610f2f5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e933390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611ee182826111bf565b15610f2f5760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038216611f945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f1c565b8060026000828254611fa69190612cb5565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008261200a8584612524565b14949350505050565b6001600160a01b0382166120735760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610f1c565b6001600160a01b038216600090815260208190526040902054818110156120e75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610f1c565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b61214f82826111bf565b610f2f5761215c81612571565b612167836020612583565b604051602001612178929190612ddd565b60408051601f198184030181529082905262461bcd60e51b8252610f1c916004016127ce565b60006121aa8484611429565b90506000198114610e5a57818110156122055760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f1c565b610e5a8484848403611a36565b6001600160a01b0383166122765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610f1c565b6001600160a01b0382166122d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610f1c565b6001600160a01b038316600090815260208190526040902054818110156123505760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f1c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e5a565b600a546040805160028082526060820183526001600160a01b039093169260009260208301908036833701905050905030816000815181106123fa576123fa612e52565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247c9190612e68565b8160018151811061248f5761248f612e52565b6001600160a01b03928316602091820292909201015282166318cbafe585600084876124bd42610384612cb5565b6040518663ffffffff1660e01b81526004016124dd959493929190612e85565b6000604051808303816000875af11580156124fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110079190810190612ef6565b600081815b8451811015612569576125558286838151811061254857612548612e52565b602002602001015161271f565b91508061256181612f87565b915050612529565b509392505050565b6060610cb46001600160a01b03831660145b60606000612592836002612ce5565b61259d906002612cb5565b67ffffffffffffffff8111156125b5576125b5612903565b6040519080825280601f01601f1916602001820160405280156125df576020820181803683370190505b509050600360fc1b816000815181106125fa576125fa612e52565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061262957612629612e52565b60200101906001600160f81b031916908160001a905350600061264d846002612ce5565b612658906001612cb5565b90505b60018111156126d0576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061268c5761268c612e52565b1a60f81b8282815181106126a2576126a2612e52565b60200101906001600160f81b031916908160001a90535060049490941c936126c981612fa0565b905061265b565b508315610e7f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f1c565b600081831061273b576000828152602084905260409020610e7f565b6000838152602083905260409020610e7f565b60006020828403121561276057600080fd5b81356001600160e01b031981168114610e7f57600080fd5b6001600160a01b0381168114611b9857600080fd5b60006020828403121561279f57600080fd5b8135610e7f81612778565b60005b838110156127c55781810151838201526020016127ad565b50506000910152565b60208152600082518060208401526127ed8160408501602087016127aa565b601f01601f19169190910160400192915050565b6000806040838503121561281457600080fd5b823561281f81612778565b946020939093013593505050565b60006020828403121561283f57600080fd5b5035919050565b60008060006060848603121561285b57600080fd5b833561286681612778565b9250602084013561287681612778565b929592945050506040919091013590565b6000806040838503121561289a57600080fd5b8235915060208301356128ac81612778565b809150509250929050565b8015158114611b9857600080fd5b80356128d0816128b7565b919050565b600080604083850312156128e857600080fd5b82356128f381612778565b915060208301356128ac816128b7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561294257612942612903565b604052919050565b600067ffffffffffffffff82111561296457612964612903565b5060051b60200190565b600082601f83011261297f57600080fd5b8135602061299461298f8361294a565b612919565b82815260059290921b840181019181810190868411156129b357600080fd5b8286015b848110156129ce57803583529183019183016129b7565b509695505050505050565b6000806000606084860312156129ee57600080fd5b83356129f981612778565b925060208401359150604084013567ffffffffffffffff811115612a1c57600080fd5b612a288682870161296e565b9150509250925092565b600082601f830112612a4357600080fd5b813567ffffffffffffffff811115612a5d57612a5d612903565b612a70601f8201601f1916602001612919565b818152846020838601011115612a8557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612ab557600080fd5b82359150602083013567ffffffffffffffff811115612ad357600080fd5b612adf85828601612a32565b9150509250929050565b600060208284031215612afb57600080fd5b813567ffffffffffffffff811115612b1257600080fd5b610de384828501612a32565b60008060408385031215612b3157600080fd5b8235612b3c81612778565b915060208301356128ac81612778565b60008060008060008060c08789031215612b6557600080fd5b863567ffffffffffffffff80821115612b7d57600080fd5b818901915089601f830112612b9157600080fd5b81356020612ba161298f8361294a565b82815260059290921b8401810191818101908d841115612bc057600080fd5b948201945b83861015612bde57853582529482019490820190612bc5565b9a50508a01359750506040890135915080821115612bfb57600080fd5b612c078a838b01612a32565b9550612c1560608a016128c5565b94506080890135935060a0890135915080821115612c3257600080fd5b50612c3f89828a0161296e565b9150509295509295509295565b600181811c90821680612c6057607f821691505b602082108103612c8057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612c9857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610cb457610cb4612c9f565b600060208284031215612cda57600080fd5b8151610e7f816128b7565b8082028115828204841417610cb457610cb4612c9f565b6bffffffffffffffffffffffff198460601b1681528260148201526000603482018351602080860160005b83811015612d4357815185529382019390820190600101612d27565b509298975050505050505050565b81810381811115610cb457610cb4612c9f565b600082612d8157634e487b7160e01b600052601260045260246000fd5b500490565b6080808252855190820181905260009060209060a0840190828901845b82811015612dbf57815184529284019290840190600101612da3565b50505090830195909552506040810192909252606090910152919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612e158160178501602088016127aa565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612e468160288401602088016127aa565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612e7a57600080fd5b8151610e7f81612778565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ed55784516001600160a01b031683529383019391830191600101612eb0565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215612f0957600080fd5b825167ffffffffffffffff811115612f2057600080fd5b8301601f81018513612f3157600080fd5b8051612f3f61298f8261294a565b81815260059190911b82018301908381019087831115612f5e57600080fd5b928401925b82841015612f7c57835182529284019290840190612f63565b979650505050505050565b600060018201612f9957612f99612c9f565b5060010190565b600081612faf57612faf612c9f565b50600019019056fea26469706673582212208c89077d598e0821a587d8d4abc36ebacf7d0ab804a72ba6339b96c5701bc87664736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d8682bfa6918b0174f287b888e765b9a1b4dc9c3000000000000000000000000ec5709c0750043cfb4b869dbc871e86efe18b4c500000000000000000000000000000000000000000000000000000000000000e0f6de193156f2ff181bda236b271f406b8ea9332ef0790db58bebc8963e6417fc000000000000000000000000b9b0a05eac77cd7d9749a7fd91704da0fd941a82000000000000000000000000fdc2210d8b9d39076f5f0241eaf3fe34f63c9e120000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000b570000000000000000000000000000000000000000000000000000000000000dc10000000000000000000000000000000000000000000000000000000000001002000000000000000000000000000000000000000000000000000000000000180600000000000000000000000000000000000000000000000000000000000019940000000000000000000000000000000000000000000000000000000000001d7b000000000000000000000000000000000000000000000000000000000000204f000000000000000000000000000000000000000000000000000000000000213d000000000000000000000000000000000000000000000000000000000000237500000000000000000000000000000000000000000000000000000000000026be00000000000000000000000000000000000000000000000000000000000027eb
-----Decoded View---------------
Arg [0] : _mbz (address): 0xD8682bFA6918b0174F287b888e765b9A1b4dc9c3
Arg [1] : _dark (address): 0xeC5709c0750043cfb4B869Dbc871E86efe18b4C5
Arg [2] : divineTokenIds (uint256[]): 732,1488,2903,3521,4098,6150,6548,7547,8271,8509,9077,9918,10219
Arg [3] : _burnedMbzMerkleroot (bytes32): 0xf6de193156f2ff181bda236b271f406b8ea9332ef0790db58bebc8963e6417fc
Arg [4] : _taxReceiver (address): 0xb9B0a05eac77cD7d9749a7FD91704da0FD941A82
Arg [5] : backendAddress (address): 0xFDc2210D8B9D39076f5F0241eAf3Fe34f63C9E12
Arg [6] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 000000000000000000000000d8682bfa6918b0174f287b888e765b9a1b4dc9c3
Arg [1] : 000000000000000000000000ec5709c0750043cfb4b869dbc871e86efe18b4c5
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : f6de193156f2ff181bda236b271f406b8ea9332ef0790db58bebc8963e6417fc
Arg [4] : 000000000000000000000000b9b0a05eac77cd7d9749a7fd91704da0fd941a82
Arg [5] : 000000000000000000000000fdc2210d8b9d39076f5f0241eaf3fe34f63c9e12
Arg [6] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002dc
Arg [9] : 00000000000000000000000000000000000000000000000000000000000005d0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000b57
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000dc1
Arg [12] : 0000000000000000000000000000000000000000000000000000000000001002
Arg [13] : 0000000000000000000000000000000000000000000000000000000000001806
Arg [14] : 0000000000000000000000000000000000000000000000000000000000001994
Arg [15] : 0000000000000000000000000000000000000000000000000000000000001d7b
Arg [16] : 000000000000000000000000000000000000000000000000000000000000204f
Arg [17] : 000000000000000000000000000000000000000000000000000000000000213d
Arg [18] : 0000000000000000000000000000000000000000000000000000000000002375
Arg [19] : 00000000000000000000000000000000000000000000000000000000000026be
Arg [20] : 00000000000000000000000000000000000000000000000000000000000027eb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,418.94 | 0.0001 | $0.241894 |
Loading...
Loading
[ 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.