More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4646630 | 315 days ago | 2.82531159 ETH | ||||
4399508 | 321 days ago | 0.02825311 ETH | ||||
4340330 | 322 days ago | 0.09417705 ETH | ||||
4324036 | 323 days ago | 0.11301246 ETH | ||||
4180584 | 326 days ago | 0.02825311 ETH | ||||
4088987 | 328 days ago | 0.47088526 ETH | ||||
4041603 | 329 days ago | 0.08475934 ETH | ||||
3924987 | 332 days ago | 0.02825311 ETH | ||||
3907894 | 332 days ago | 0.02825311 ETH | ||||
3862253 | 333 days ago | 0.09417705 ETH | ||||
3857060 | 334 days ago | 0.02825311 ETH | ||||
3856872 | 334 days ago | 0.02825311 ETH | ||||
3856789 | 334 days ago | 0.13184787 ETH | ||||
3830769 | 334 days ago | 0.04708852 ETH | ||||
3830526 | 334 days ago | 0.1883541 ETH | ||||
3830372 | 334 days ago | 0.04708852 ETH | ||||
3823912 | 334 days ago | 0.94177053 ETH | ||||
3793432 | 335 days ago | 0.02825311 ETH | ||||
3792968 | 335 days ago | 0.02825311 ETH | ||||
3792567 | 335 days ago | 2.35442633 ETH | ||||
3790083 | 335 days ago | 0.09417705 ETH | ||||
3789810 | 335 days ago | 0.02825311 ETH | ||||
3788981 | 335 days ago | 0.23544263 ETH | ||||
3788257 | 335 days ago | 0.03767082 ETH | ||||
3783593 | 335 days ago | 0.02825311 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PEW
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 100 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract PEW is ERC20, Ownable { event Deposited( address depositor, uint amountETHdeposited, uint totalSubscription ); event Claimed( address depositor, uint amountTokensClaimed, uint amountETHRefunded ); event ClaimedWithProof(uint256 _amount, address indexed _account); bool public liquidityMinted; bool public transfersEnabled; mapping(bytes32 => bool) private claimedMap; mapping(address => uint) public deposits; mapping(address => bool) public depositClaimed; uint public constant maxDepositForAddress = 3 ether; uint public constant minimumDeposit = 0.03 ether; uint public depositEndDate; uint public subscription; uint public immutable timeout; uint public immutable cap; uint public immutable fairLaunchAllocation; uint public immutable liquidityAllocation; uint public immutable communityFundAllocation; uint public immutable referralAllocation; uint public immutable degenAllocation; address public immutable lpDeployer; address public immutable communityFund; address public immutable blasterswapRouter; uint public referralTokensClaimed; uint public degenTokensClaimed; bytes32 public degenRoot; bytes32 public referralRoot; constructor( uint _timeout, uint _cap, uint _totalSupply, address _communityFund, address _lpDeployer, address _router ) ERC20("PEW", "PEW") Ownable(msg.sender) { require(_timeout > 0, "PEW: _timeout is zero"); timeout = _timeout; cap = _cap; communityFund = _communityFund; fairLaunchAllocation = (45 * _totalSupply) / 100; liquidityAllocation = (30 * _totalSupply) / 100; referralAllocation = (10 * _totalSupply) / 100; degenAllocation = (5 * _totalSupply) / 100; communityFundAllocation = (10 * _totalSupply) / 100; lpDeployer = _lpDeployer; blasterswapRouter = _router; super._mint(address(this), fairLaunchAllocation); super._mint(address(this), referralAllocation); super._mint(address(this), degenAllocation); } function startDeposit() external onlyOwner { require(depositEndDate == 0); depositEndDate = block.timestamp + timeout; } function deposit() external payable { _deposit(); } function claim() external payable { require( block.timestamp >= depositEndDate, "PEW: deposit period not ended" ); require(!depositClaimed[msg.sender], "PEW: claimed already"); require(deposits[msg.sender] > 0, "PEW: no deposits made"); // first claims adds liquidity to the lpDeployer if (!liquidityMinted) { uint ethLiquidity = subscription > cap ? cap : subscription; _mintLiquidityAndCommunityFund(ethLiquidity); } uint amountETH = deposits[msg.sender]; uint allocation; uint refund; if (subscription > cap) { allocation = (amountETH * fairLaunchAllocation) / subscription; this.transfer(msg.sender, allocation); //refund if oversubscribed refund = amountETH - ((amountETH * cap) / subscription + 1); payable(msg.sender).transfer(refund); } else { allocation = (amountETH * fairLaunchAllocation) / cap; this.transfer(msg.sender, allocation); } depositClaimed[msg.sender] = true; emit Claimed(msg.sender, allocation, refund); } function setDegenRoot(bytes32 _root) external onlyOwner { degenRoot = _root; } function setReferralRoot(bytes32 _root) external onlyOwner { referralRoot = _root; } function isClaimed(bytes32 _hash) public view returns (bool) { return claimedMap[_hash]; } function claimReferral( uint256 _amount, bytes32[] memory _merkleProof ) external { _treeClaim(_amount, referralRoot, _merkleProof); } function claimDegen( uint256 _amount, bytes32[] memory _merkleProof ) external { _treeClaim(_amount, degenRoot, _merkleProof); } function enableTransfers() external onlyOwner { transfersEnabled = true; renounceOwnership(); } function _treeClaim( uint256 _amount, bytes32 _root, bytes32[] memory _merkleProof ) internal { uint rootIdentifier = _root == referralRoot ? 1 : 2; if (rootIdentifier == 1) { require( referralTokensClaimed + _amount <= referralAllocation, "PEW: all referral allocation is claimed" ); } else { require( degenTokensClaimed + _amount <= degenAllocation, "PEW: all degen allocation is claimed" ); } bytes32 leaf = keccak256( abi.encodePacked(msg.sender, _amount, rootIdentifier) ); require(!isClaimed(leaf), "PEW: already claimed with proof"); require( MerkleProof.verify(_merkleProof, _root, leaf), "PEW: invalid proof" ); claimedMap[leaf] = true; this.transfer(msg.sender, _amount); if (rootIdentifier == 1) { referralTokensClaimed += _amount; } else { degenTokensClaimed += _amount; } emit ClaimedWithProof(_amount, msg.sender); } function _update( address from, address to, uint256 value ) internal override { // only allow mint and transfers from the contract before liquidity is added if (!transfersEnabled) { if ( from == address(this) || from == address(0) || from == blasterswapRouter || from == lpDeployer ) { super._update(from, to, value); return; } else { revert("PEW: no transfers until enabled"); } } // no transfers until liquidity added super._update(from, to, value); } function _deposit() internal { require( address(msg.sender).code.length == 0, "PEW: not contract deposits allowed" ); require(depositEndDate != 0, "PEW: deposits not started"); require(block.timestamp < depositEndDate, "PEW: deposit period ended"); require( msg.value >= minimumDeposit, "PEW: deposit is less than minimum" ); require( deposits[msg.sender] + msg.value <= maxDepositForAddress, "PEW: deposit exceeds maximum" ); subscription += msg.value; deposits[msg.sender] += msg.value; emit Deposited(msg.sender, msg.value, subscription); } function _mintLiquidityAndCommunityFund(uint ethLiquidity) internal { super._mint(address(lpDeployer), liquidityAllocation); super._mint(communityFund, communityFundAllocation); (bool success, ) = payable(lpDeployer).call{value: ethLiquidity}(""); require(success, "PEW: failed to send WETH"); liquidityMinted = true; } receive() external payable { _deposit(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC20Metadata} from "./extensions/IERC20Metadata.sol"; import {Context} from "../../utils/Context.sol"; import {IERC20Errors} from "../../interfaces/draft-IERC6093.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}. * * 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]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 default value returned by this function, unless * it's 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 returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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 `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` 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 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); 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 `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` 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. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` 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. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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 (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @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 The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @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} */ 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. */ 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} */ 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. */ 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. */ 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). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { 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. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ 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) } } }
{ "optimizer": { "enabled": true, "runs": 100 }, "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"_timeout","type":"uint256"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"address","name":"_communityFund","type":"address"},{"internalType":"address","name":"_lpDeployer","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokensClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountETHRefunded","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"ClaimedWithProof","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountETHdeposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSubscription","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"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":"value","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":[],"name":"blasterswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claimDegen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claimReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFundAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"degenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"degenRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"degenTokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fairLaunchAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDepositForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralTokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setDegenRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setReferralRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscription","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeout","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":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101c06040523480156200001257600080fd5b50604051620025a9380380620025a98339810160408190526200003591620004d5565b60408051808201825260038082526250455760e81b602080840182905284518086019095528285528401523392906200006f8382620005e1565b5060046200007e8282620005e1565b5050506001600160a01b038116620000b157604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000bc816200021b565b50600086116200010f5760405162461bcd60e51b815260206004820152601560248201527f5045573a205f74696d656f7574206973207a65726f00000000000000000000006044820152606401620000a8565b608086905260a08590526001600160a01b0383166101805260646200013685602d620006c3565b620001429190620006e3565b60c05260646200015485601e620006c3565b620001609190620006e3565b60e05260646200017285600a620006c3565b6200017e9190620006e3565b61012052606462000191856005620006c3565b6200019d9190620006e3565b610140526064620001b085600a620006c3565b620001bc9190620006e3565b610100526001600160a01b038083166101605281166101a05260c051620001e59030906200026d565b620001fa30610120516200026d60201b60201c565b6200020f30610140516200026d60201b60201c565b5050505050506200071c565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002995760405163ec442f0560e01b815260006004820152602401620000a8565b620002a760008383620002ab565b5050565b600554600160a81b900460ff166200037d576001600160a01b038316301480620002dc57506001600160a01b038316155b80620002fc57506101a0516001600160a01b0316836001600160a01b0316145b806200031c5750610160516001600160a01b0316836001600160a01b0316145b1562000334576200032f83838362000385565b505050565b60405162461bcd60e51b815260206004820152601f60248201527f5045573a206e6f207472616e736665727320756e74696c20656e61626c6564006044820152606401620000a8565b6200032f8383835b6001600160a01b038316620003b4578060026000828254620003a8919062000706565b90915550620004289050565b6001600160a01b03831660009081526020819052604090205481811015620004095760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000a8565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620004465760028054829003905562000465565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004ab91815260200190565b60405180910390a3505050565b80516001600160a01b0381168114620004d057600080fd5b919050565b60008060008060008060c08789031215620004ef57600080fd5b8651955060208701519450604087015193506200050f60608801620004b8565b92506200051f60808801620004b8565b91506200052f60a08801620004b8565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200056657607f821691505b6020821081036200058757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032f576000816000526020600020601f850160051c81016020861015620005b85750805b601f850160051c820191505b81811015620005d957828155600101620005c4565b505050505050565b81516001600160401b03811115620005fd57620005fd6200053b565b62000615816200060e845462000551565b846200058d565b602080601f8311600181146200064d5760008415620006345750858301515b600019600386901b1c1916600185901b178555620005d9565b600085815260208120601f198616915b828110156200067e578886015182559484019460019091019084016200065d565b50858210156200069d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620006dd57620006dd620006ad565b92915050565b6000826200070157634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620006dd57620006dd620006ad565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051611d9a6200080f60003960008181610380015261179501526000818161028501526111bf0152600081816107e1015281816111750152818161120801526117d1015260008181610615015261138f01526000818161081501526112fd01526000818161054d01526111e001526000818161066901526111960152600081816106f801528181610d330152610e760152600081816103d001528181610c8e01528181610cbf01528181610d0601528181610dd60152610e520152600081816105190152610fc40152611d9a6000f3fe60806040526004361061025f5760003560e01c806379df4fa211610144578063bacd2230116100b6578063dd62ed3e1161007a578063dd62ed3e14610779578063f1b4006614610799578063f2fde38b146107af578063f88c90fb146107cf578063f8d3d15e14610803578063fc7e286d1461083757600080fd5b8063bacd2230146106e6578063bef97c871461071a578063cac246ef1461073b578063d0e30db014610751578063d6e554ce1461075957600080fd5b8063a52381b311610108578063a52381b314610603578063a9059cbb14610637578063abd653d714610657578063af35c6c71461068b578063b2cfe77a146106a0578063b89c3952146106b657600080fd5b806379df4fa2146105845780638902cc21146105995780638da5cb5b146105af5780638eab0751146105cd57806395d89b41146105ee57600080fd5b80634e71d92d116101dd5780636ec20115116101a15780636ec20115146104915780637013c9b8146104b157806370a08231146104d157806370dea79a1461050757806371273a0e1461053b578063715018a61461056f57600080fd5b80634e71d92d1461040857806357ddb9661461041057806360703b6614610426578063636bfbab14610446578063641980171461046157600080fd5b806323b872dd1161022457806323b872dd1461034e57806327e5b97e1461036e578063313ce567146103a2578063355274ea146103be57806344387cc2146103f257600080fd5b8062f380f41461027357806302a2756a146102bd57806306fdde03146102e7578063095ea7b31461030957806318160ddd1461033957600080fd5b3661026e5761026c610864565b005b600080fd5b34801561027f57600080fd5b506102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516102b49190611a40565b60405180910390f35b3480156102c957600080fd5b506102d96729a2241af62c000081565b6040519081526020016102b4565b3480156102f357600080fd5b506102fc610aac565b6040516102b49190611a54565b34801561031557600080fd5b50610329610324366004611abf565b610b3e565b60405190151581526020016102b4565b34801561034557600080fd5b506002546102d9565b34801561035a57600080fd5b50610329610369366004611ae9565b610b58565b34801561037a57600080fd5b506102a77f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ae57600080fd5b50604051601281526020016102b4565b3480156103ca57600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fe57600080fd5b506102d9600a5481565b61026c610b7c565b34801561041c57600080fd5b506102d9600c5481565b34801561043257600080fd5b5061026c610441366004611b3b565b610f6b565b34801561045257600080fd5b506102d9666a94d74f43000081565b34801561046d57600080fd5b5061032961047c366004611c05565b60086020526000908152604090205460ff1681565b34801561049d57600080fd5b5061026c6104ac366004611c20565b610f7c565b3480156104bd57600080fd5b5061026c6104cc366004611c20565b610f89565b3480156104dd57600080fd5b506102d96104ec366004611c05565b6001600160a01b031660009081526020819052604090205490565b34801561051357600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561054757600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b5061026c610f96565b34801561059057600080fd5b5061026c610faa565b3480156105a557600080fd5b506102d9600d5481565b3480156105bb57600080fd5b506005546001600160a01b03166102a7565b3480156105d957600080fd5b5060055461032990600160a01b900460ff1681565b3480156105fa57600080fd5b506102fc610fee565b34801561060f57600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561064357600080fd5b50610329610652366004611abf565b610ffd565b34801561066357600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561069757600080fd5b5061026c61100b565b3480156106ac57600080fd5b506102d9600e5481565b3480156106c257600080fd5b506103296106d1366004611c20565b60009081526006602052604090205460ff1690565b3480156106f257600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561072657600080fd5b5060055461032990600160a81b900460ff1681565b34801561074757600080fd5b506102d960095481565b61026c61102e565b34801561076557600080fd5b5061026c610774366004611b3b565b611036565b34801561078557600080fd5b506102d9610794366004611c39565b611043565b3480156107a557600080fd5b506102d9600b5481565b3480156107bb57600080fd5b5061026c6107ca366004611c05565b61106e565b3480156107db57600080fd5b506102a77f000000000000000000000000000000000000000000000000000000000000000081565b34801561080f57600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561084357600080fd5b506102d9610852366004611c05565b60076020526000908152604090205481565b333b156108c35760405162461bcd60e51b815260206004820152602260248201527f5045573a206e6f7420636f6e7472616374206465706f7369747320616c6c6f77604482015261195960f21b60648201526084015b60405180910390fd5b6009546000036109115760405162461bcd60e51b8152602060048201526019602482015278141155ce8819195c1bdcda5d1cc81b9bdd081cdd185c9d1959603a1b60448201526064016108ba565b600954421061095e5760405162461bcd60e51b8152602060048201526019602482015278141155ce8819195c1bdcda5d081c195c9a5bd908195b991959603a1b60448201526064016108ba565b666a94d74f4300003410156109bf5760405162461bcd60e51b815260206004820152602160248201527f5045573a206465706f736974206973206c657373207468616e206d696e696d756044820152606d60f81b60648201526084016108ba565b336000908152600760205260409020546729a2241af62c0000906109e4903490611c82565b1115610a325760405162461bcd60e51b815260206004820152601c60248201527f5045573a206465706f7369742065786365656473206d6178696d756d0000000060448201526064016108ba565b34600a6000828254610a449190611c82565b90915550503360009081526007602052604081208054349290610a68908490611c82565b9091555050600a546040517f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca91610aa29133913491611c95565b60405180910390a1565b606060038054610abb90611cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae790611cb6565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b600033610b4c8185856110ac565b60019150505b92915050565b600033610b668582856110be565b610b71858585611111565b506001949350505050565b600954421015610bce5760405162461bcd60e51b815260206004820152601d60248201527f5045573a206465706f73697420706572696f64206e6f7420656e64656400000060448201526064016108ba565b3360009081526008602052604090205460ff1615610c255760405162461bcd60e51b81526020600482015260146024820152735045573a20636c61696d656420616c726561647960601b60448201526064016108ba565b33600090815260076020526040902054610c795760405162461bcd60e51b81526020600482015260156024820152745045573a206e6f206465706f73697473206d61646560581b60448201526064016108ba565b600554600160a01b900460ff16610cec5760007f0000000000000000000000000000000000000000000000000000000000000000600a5411610cbd57600a54610cdf565b7f00000000000000000000000000000000000000000000000000000000000000005b9050610cea81611170565b505b33600090815260076020526040812054600a5490919081907f00000000000000000000000000000000000000000000000000000000000000001015610e5057600a54610d587f000000000000000000000000000000000000000000000000000000000000000085611cf0565b610d629190611d07565b60405163a9059cbb60e01b8152909250309063a9059cbb90610d8a9033908690600401611d29565b6020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190611d42565b50600a54610dfb7f000000000000000000000000000000000000000000000000000000000000000085611cf0565b610e059190611d07565b610e10906001611c82565b610e1a9084611d64565b604051909150339082156108fc029083906000818181858888f19350505050158015610e4a573d6000803e3d6000fd5b50610f12565b7f0000000000000000000000000000000000000000000000000000000000000000610e9b7f000000000000000000000000000000000000000000000000000000000000000085611cf0565b610ea59190611d07565b60405163a9059cbb60e01b8152909250309063a9059cbb90610ecd9033908690600401611d29565b6020604051808303816000875af1158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f109190611d42565b505b3360008181526008602052604090819020805460ff19166001179055517f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a91610f5e9185908590611c95565b60405180910390a1505050565b610f7882600d54836112d9565b5050565b610f8461160a565b600d55565b610f9161160a565b600e55565b610f9e61160a565b610fa86000611637565b565b610fb261160a565b60095415610fbf57600080fd5b610fe97f000000000000000000000000000000000000000000000000000000000000000042611c82565b600955565b606060048054610abb90611cb6565b600033610b4c818585611111565b61101361160a565b6005805460ff60a81b1916600160a81b179055610fa8610f96565b610fa8610864565b610f7882600e54836112d9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61107661160a565b6001600160a01b0381166110a0576000604051631e4fbdf760e01b81526004016108ba9190611a40565b6110a981611637565b50565b6110b98383836001611689565b505050565b60006110ca8484611043565b9050600019811461110b57818110156110fc57828183604051637dc7a0d960e11b81526004016108ba93929190611c95565b61110b84848484036000611689565b50505050565b6001600160a01b03831661113b576000604051634b637e8f60e11b81526004016108ba9190611a40565b6001600160a01b03821661116557600060405163ec442f0560e01b81526004016108ba9190611a40565b6110b983838361175e565b6111ba7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611868565b6112047f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611868565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168260405160006040518083038185875af1925050503d8060008114611271576040519150601f19603f3d011682016040523d82523d6000602084013e611276565b606091505b50509050806112c25760405162461bcd60e51b81526020600482015260186024820152770a08aae7440ccc2d2d8cac840e8de40e6cadcc840ae8aa8960431b60448201526064016108ba565b50506005805460ff60a01b1916600160a01b179055565b6000600e5483146112eb5760026112ee565b60015b60ff1690508060010361138d577f000000000000000000000000000000000000000000000000000000000000000084600b5461132a9190611c82565b11156113885760405162461bcd60e51b815260206004820152602760248201527f5045573a20616c6c20726566657272616c20616c6c6f636174696f6e2069732060448201526618db185a5b595960ca1b60648201526084016108ba565b611416565b7f000000000000000000000000000000000000000000000000000000000000000084600c546113bc9190611c82565b11156114165760405162461bcd60e51b8152602060048201526024808201527f5045573a20616c6c20646567656e20616c6c6f636174696f6e20697320636c616044820152631a5b595960e21b60648201526084016108ba565b6040516bffffffffffffffffffffffff193360601b16602082015260348101859052605481018290526000906074016040516020818303038152906040528051906020012090506114768160009081526006602052604090205460ff1690565b156114c35760405162461bcd60e51b815260206004820152601f60248201527f5045573a20616c726561647920636c61696d656420776974682070726f6f660060448201526064016108ba565b6114ce83858361189e565b61150f5760405162461bcd60e51b81526020600482015260126024820152712822ab9d1034b73b30b634b210383937b7b360711b60448201526064016108ba565b60008181526006602052604090819020805460ff191660011790555163a9059cbb60e01b8152309063a9059cbb9061154d9033908990600401611d29565b6020604051808303816000875af115801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190611d42565b50816001036115b65784600b60008282546115ab9190611c82565b909155506115ce9050565b84600c60008282546115c89190611c82565b90915550505b60405185815233907f99884029b4d14aee2ba91e78862e8ebd8121f397b330b267903575622db42ab29060200160405180910390a25050505050565b6005546001600160a01b03163314610fa8573360405163118cdaa760e01b81526004016108ba9190611a40565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166116b357600060405163e602df0560e01b81526004016108ba9190611a40565b6001600160a01b0383166116dd576000604051634a1406b160e11b81526004016108ba9190611a40565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561110b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161175091815260200190565b60405180910390a350505050565b600554600160a81b900460ff1661185d576001600160a01b03831630148061178d57506001600160a01b038316155b806117c957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b8061180557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b15611815576110b98383836118b4565b60405162461bcd60e51b815260206004820152601f60248201527f5045573a206e6f207472616e736665727320756e74696c20656e61626c65640060448201526064016108ba565b6110b98383836118b4565b6001600160a01b03821661189257600060405163ec442f0560e01b81526004016108ba9190611a40565b610f786000838361175e565b6000826118ab85846119cb565b14949350505050565b6001600160a01b0383166118df5780600260008282546118d49190611c82565b9091555061193e9050565b6001600160a01b0383166000908152602081905260409020548181101561191f5783818360405163391434e360e21b81526004016108ba93929190611c95565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661195a57600280548290039055611979565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119be91815260200190565b60405180910390a3505050565b600081815b8451811015611a06576119fc828683815181106119ef576119ef611d77565b6020026020010151611a0e565b91506001016119d0565b509392505050565b6000818310611a2a576000828152602084905260409020611a39565b60008381526020839052604090205b9392505050565b6001600160a01b0391909116815260200190565b60006020808352835180602085015260005b81811015611a8257858101830151858201604001528201611a66565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611aba57600080fd5b919050565b60008060408385031215611ad257600080fd5b611adb83611aa3565b946020939093013593505050565b600080600060608486031215611afe57600080fd5b611b0784611aa3565b9250611b1560208501611aa3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611b4e57600080fd5b8235915060208084013567ffffffffffffffff80821115611b6e57600080fd5b818601915086601f830112611b8257600080fd5b813581811115611b9457611b94611b25565b8060051b604051601f19603f83011681018181108582111715611bb957611bb9611b25565b604052918252848201925083810185019189831115611bd757600080fd5b938501935b82851015611bf557843584529385019392850192611bdc565b8096505050505050509250929050565b600060208284031215611c1757600080fd5b611a3982611aa3565b600060208284031215611c3257600080fd5b5035919050565b60008060408385031215611c4c57600080fd5b611c5583611aa3565b9150611c6360208401611aa3565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b5257610b52611c6c565b6001600160a01b039390931683526020830191909152604082015260600190565b600181811c90821680611cca57607f821691505b602082108103611cea57634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610b5257610b52611c6c565b600082611d2457634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03929092168252602082015260400190565b600060208284031215611d5457600080fd5b81518015158114611a3957600080fd5b81810381811115610b5257610b52611c6c565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000818000a000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000052c0eb803f40ed8dc182a38e1dc5972392fe8bc30000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da000000000000000000000000c972fae6b524e8a6e0af21875675bf58a3133e60
Deployed Bytecode
0x60806040526004361061025f5760003560e01c806379df4fa211610144578063bacd2230116100b6578063dd62ed3e1161007a578063dd62ed3e14610779578063f1b4006614610799578063f2fde38b146107af578063f88c90fb146107cf578063f8d3d15e14610803578063fc7e286d1461083757600080fd5b8063bacd2230146106e6578063bef97c871461071a578063cac246ef1461073b578063d0e30db014610751578063d6e554ce1461075957600080fd5b8063a52381b311610108578063a52381b314610603578063a9059cbb14610637578063abd653d714610657578063af35c6c71461068b578063b2cfe77a146106a0578063b89c3952146106b657600080fd5b806379df4fa2146105845780638902cc21146105995780638da5cb5b146105af5780638eab0751146105cd57806395d89b41146105ee57600080fd5b80634e71d92d116101dd5780636ec20115116101a15780636ec20115146104915780637013c9b8146104b157806370a08231146104d157806370dea79a1461050757806371273a0e1461053b578063715018a61461056f57600080fd5b80634e71d92d1461040857806357ddb9661461041057806360703b6614610426578063636bfbab14610446578063641980171461046157600080fd5b806323b872dd1161022457806323b872dd1461034e57806327e5b97e1461036e578063313ce567146103a2578063355274ea146103be57806344387cc2146103f257600080fd5b8062f380f41461027357806302a2756a146102bd57806306fdde03146102e7578063095ea7b31461030957806318160ddd1461033957600080fd5b3661026e5761026c610864565b005b600080fd5b34801561027f57600080fd5b506102a77f00000000000000000000000052c0eb803f40ed8dc182a38e1dc5972392fe8bc381565b6040516102b49190611a40565b60405180910390f35b3480156102c957600080fd5b506102d96729a2241af62c000081565b6040519081526020016102b4565b3480156102f357600080fd5b506102fc610aac565b6040516102b49190611a54565b34801561031557600080fd5b50610329610324366004611abf565b610b3e565b60405190151581526020016102b4565b34801561034557600080fd5b506002546102d9565b34801561035a57600080fd5b50610329610369366004611ae9565b610b58565b34801561037a57600080fd5b506102a77f000000000000000000000000c972fae6b524e8a6e0af21875675bf58a3133e6081565b3480156103ae57600080fd5b50604051601281526020016102b4565b3480156103ca57600080fd5b506102d97f00000000000000000000000000000000000000000000000ad78ebc5ac620000081565b3480156103fe57600080fd5b506102d9600a5481565b61026c610b7c565b34801561041c57600080fd5b506102d9600c5481565b34801561043257600080fd5b5061026c610441366004611b3b565b610f6b565b34801561045257600080fd5b506102d9666a94d74f43000081565b34801561046d57600080fd5b5061032961047c366004611c05565b60086020526000908152604090205460ff1681565b34801561049d57600080fd5b5061026c6104ac366004611c20565b610f7c565b3480156104bd57600080fd5b5061026c6104cc366004611c20565b610f89565b3480156104dd57600080fd5b506102d96104ec366004611c05565b6001600160a01b031660009081526020819052604090205490565b34801561051357600080fd5b506102d97f000000000000000000000000000000000000000000000000000000000001518081565b34801561054757600080fd5b506102d97f000000000000000000000000000000000000000000084595161401484a00000081565b34801561057b57600080fd5b5061026c610f96565b34801561059057600080fd5b5061026c610faa565b3480156105a557600080fd5b506102d9600d5481565b3480156105bb57600080fd5b506005546001600160a01b03166102a7565b3480156105d957600080fd5b5060055461032990600160a01b900460ff1681565b3480156105fa57600080fd5b506102fc610fee565b34801561060f57600080fd5b506102d97f0000000000000000000000000000000000000000000422ca8b0a00a42500000081565b34801561064357600080fd5b50610329610652366004611abf565b610ffd565b34801561066357600080fd5b506102d97f00000000000000000000000000000000000000000018d0bf423c03d8de00000081565b34801561069757600080fd5b5061026c61100b565b3480156106ac57600080fd5b506102d9600e5481565b3480156106c257600080fd5b506103296106d1366004611c20565b60009081526006602052604090205460ff1690565b3480156106f257600080fd5b506102d97f00000000000000000000000000000000000000000025391ee35a05c54d00000081565b34801561072657600080fd5b5060055461032990600160a81b900460ff1681565b34801561074757600080fd5b506102d960095481565b61026c61102e565b34801561076557600080fd5b5061026c610774366004611b3b565b611036565b34801561078557600080fd5b506102d9610794366004611c39565b611043565b3480156107a557600080fd5b506102d9600b5481565b3480156107bb57600080fd5b5061026c6107ca366004611c05565b61106e565b3480156107db57600080fd5b506102a77f0000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da81565b34801561080f57600080fd5b506102d97f000000000000000000000000000000000000000000084595161401484a00000081565b34801561084357600080fd5b506102d9610852366004611c05565b60076020526000908152604090205481565b333b156108c35760405162461bcd60e51b815260206004820152602260248201527f5045573a206e6f7420636f6e7472616374206465706f7369747320616c6c6f77604482015261195960f21b60648201526084015b60405180910390fd5b6009546000036109115760405162461bcd60e51b8152602060048201526019602482015278141155ce8819195c1bdcda5d1cc81b9bdd081cdd185c9d1959603a1b60448201526064016108ba565b600954421061095e5760405162461bcd60e51b8152602060048201526019602482015278141155ce8819195c1bdcda5d081c195c9a5bd908195b991959603a1b60448201526064016108ba565b666a94d74f4300003410156109bf5760405162461bcd60e51b815260206004820152602160248201527f5045573a206465706f736974206973206c657373207468616e206d696e696d756044820152606d60f81b60648201526084016108ba565b336000908152600760205260409020546729a2241af62c0000906109e4903490611c82565b1115610a325760405162461bcd60e51b815260206004820152601c60248201527f5045573a206465706f7369742065786365656473206d6178696d756d0000000060448201526064016108ba565b34600a6000828254610a449190611c82565b90915550503360009081526007602052604081208054349290610a68908490611c82565b9091555050600a546040517f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca91610aa29133913491611c95565b60405180910390a1565b606060038054610abb90611cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae790611cb6565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b600033610b4c8185856110ac565b60019150505b92915050565b600033610b668582856110be565b610b71858585611111565b506001949350505050565b600954421015610bce5760405162461bcd60e51b815260206004820152601d60248201527f5045573a206465706f73697420706572696f64206e6f7420656e64656400000060448201526064016108ba565b3360009081526008602052604090205460ff1615610c255760405162461bcd60e51b81526020600482015260146024820152735045573a20636c61696d656420616c726561647960601b60448201526064016108ba565b33600090815260076020526040902054610c795760405162461bcd60e51b81526020600482015260156024820152745045573a206e6f206465706f73697473206d61646560581b60448201526064016108ba565b600554600160a01b900460ff16610cec5760007f00000000000000000000000000000000000000000000000ad78ebc5ac6200000600a5411610cbd57600a54610cdf565b7f00000000000000000000000000000000000000000000000ad78ebc5ac62000005b9050610cea81611170565b505b33600090815260076020526040812054600a5490919081907f00000000000000000000000000000000000000000000000ad78ebc5ac62000001015610e5057600a54610d587f00000000000000000000000000000000000000000025391ee35a05c54d00000085611cf0565b610d629190611d07565b60405163a9059cbb60e01b8152909250309063a9059cbb90610d8a9033908690600401611d29565b6020604051808303816000875af1158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd9190611d42565b50600a54610dfb7f00000000000000000000000000000000000000000000000ad78ebc5ac620000085611cf0565b610e059190611d07565b610e10906001611c82565b610e1a9084611d64565b604051909150339082156108fc029083906000818181858888f19350505050158015610e4a573d6000803e3d6000fd5b50610f12565b7f00000000000000000000000000000000000000000000000ad78ebc5ac6200000610e9b7f00000000000000000000000000000000000000000025391ee35a05c54d00000085611cf0565b610ea59190611d07565b60405163a9059cbb60e01b8152909250309063a9059cbb90610ecd9033908690600401611d29565b6020604051808303816000875af1158015610eec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f109190611d42565b505b3360008181526008602052604090819020805460ff19166001179055517f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a91610f5e9185908590611c95565b60405180910390a1505050565b610f7882600d54836112d9565b5050565b610f8461160a565b600d55565b610f9161160a565b600e55565b610f9e61160a565b610fa86000611637565b565b610fb261160a565b60095415610fbf57600080fd5b610fe97f000000000000000000000000000000000000000000000000000000000001518042611c82565b600955565b606060048054610abb90611cb6565b600033610b4c818585611111565b61101361160a565b6005805460ff60a81b1916600160a81b179055610fa8610f96565b610fa8610864565b610f7882600e54836112d9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61107661160a565b6001600160a01b0381166110a0576000604051631e4fbdf760e01b81526004016108ba9190611a40565b6110a981611637565b50565b6110b98383836001611689565b505050565b60006110ca8484611043565b9050600019811461110b57818110156110fc57828183604051637dc7a0d960e11b81526004016108ba93929190611c95565b61110b84848484036000611689565b50505050565b6001600160a01b03831661113b576000604051634b637e8f60e11b81526004016108ba9190611a40565b6001600160a01b03821661116557600060405163ec442f0560e01b81526004016108ba9190611a40565b6110b983838361175e565b6111ba7f0000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da7f00000000000000000000000000000000000000000018d0bf423c03d8de000000611868565b6112047f00000000000000000000000052c0eb803f40ed8dc182a38e1dc5972392fe8bc37f000000000000000000000000000000000000000000084595161401484a000000611868565b60007f0000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611271576040519150601f19603f3d011682016040523d82523d6000602084013e611276565b606091505b50509050806112c25760405162461bcd60e51b81526020600482015260186024820152770a08aae7440ccc2d2d8cac840e8de40e6cadcc840ae8aa8960431b60448201526064016108ba565b50506005805460ff60a01b1916600160a01b179055565b6000600e5483146112eb5760026112ee565b60015b60ff1690508060010361138d577f000000000000000000000000000000000000000000084595161401484a00000084600b5461132a9190611c82565b11156113885760405162461bcd60e51b815260206004820152602760248201527f5045573a20616c6c20726566657272616c20616c6c6f636174696f6e2069732060448201526618db185a5b595960ca1b60648201526084016108ba565b611416565b7f0000000000000000000000000000000000000000000422ca8b0a00a42500000084600c546113bc9190611c82565b11156114165760405162461bcd60e51b8152602060048201526024808201527f5045573a20616c6c20646567656e20616c6c6f636174696f6e20697320636c616044820152631a5b595960e21b60648201526084016108ba565b6040516bffffffffffffffffffffffff193360601b16602082015260348101859052605481018290526000906074016040516020818303038152906040528051906020012090506114768160009081526006602052604090205460ff1690565b156114c35760405162461bcd60e51b815260206004820152601f60248201527f5045573a20616c726561647920636c61696d656420776974682070726f6f660060448201526064016108ba565b6114ce83858361189e565b61150f5760405162461bcd60e51b81526020600482015260126024820152712822ab9d1034b73b30b634b210383937b7b360711b60448201526064016108ba565b60008181526006602052604090819020805460ff191660011790555163a9059cbb60e01b8152309063a9059cbb9061154d9033908990600401611d29565b6020604051808303816000875af115801561156c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115909190611d42565b50816001036115b65784600b60008282546115ab9190611c82565b909155506115ce9050565b84600c60008282546115c89190611c82565b90915550505b60405185815233907f99884029b4d14aee2ba91e78862e8ebd8121f397b330b267903575622db42ab29060200160405180910390a25050505050565b6005546001600160a01b03163314610fa8573360405163118cdaa760e01b81526004016108ba9190611a40565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166116b357600060405163e602df0560e01b81526004016108ba9190611a40565b6001600160a01b0383166116dd576000604051634a1406b160e11b81526004016108ba9190611a40565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561110b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161175091815260200190565b60405180910390a350505050565b600554600160a81b900460ff1661185d576001600160a01b03831630148061178d57506001600160a01b038316155b806117c957507f000000000000000000000000c972fae6b524e8a6e0af21875675bf58a3133e606001600160a01b0316836001600160a01b0316145b8061180557507f0000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da6001600160a01b0316836001600160a01b0316145b15611815576110b98383836118b4565b60405162461bcd60e51b815260206004820152601f60248201527f5045573a206e6f207472616e736665727320756e74696c20656e61626c65640060448201526064016108ba565b6110b98383836118b4565b6001600160a01b03821661189257600060405163ec442f0560e01b81526004016108ba9190611a40565b610f786000838361175e565b6000826118ab85846119cb565b14949350505050565b6001600160a01b0383166118df5780600260008282546118d49190611c82565b9091555061193e9050565b6001600160a01b0383166000908152602081905260409020548181101561191f5783818360405163391434e360e21b81526004016108ba93929190611c95565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661195a57600280548290039055611979565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516119be91815260200190565b60405180910390a3505050565b600081815b8451811015611a06576119fc828683815181106119ef576119ef611d77565b6020026020010151611a0e565b91506001016119d0565b509392505050565b6000818310611a2a576000828152602084905260409020611a39565b60008381526020839052604090205b9392505050565b6001600160a01b0391909116815260200190565b60006020808352835180602085015260005b81811015611a8257858101830151858201604001528201611a66565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611aba57600080fd5b919050565b60008060408385031215611ad257600080fd5b611adb83611aa3565b946020939093013593505050565b600080600060608486031215611afe57600080fd5b611b0784611aa3565b9250611b1560208501611aa3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611b4e57600080fd5b8235915060208084013567ffffffffffffffff80821115611b6e57600080fd5b818601915086601f830112611b8257600080fd5b813581811115611b9457611b94611b25565b8060051b604051601f19603f83011681018181108582111715611bb957611bb9611b25565b604052918252848201925083810185019189831115611bd757600080fd5b938501935b82851015611bf557843584529385019392850192611bdc565b8096505050505050509250929050565b600060208284031215611c1757600080fd5b611a3982611aa3565b600060208284031215611c3257600080fd5b5035919050565b60008060408385031215611c4c57600080fd5b611c5583611aa3565b9150611c6360208401611aa3565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b5257610b52611c6c565b6001600160a01b039390931683526020830191909152604082015260600190565b600181811c90821680611cca57607f821691505b602082108103611cea57634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610b5257610b52611c6c565b600082611d2457634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b03929092168252602082015260400190565b600060208284031215611d5457600080fd5b81518015158114611a3957600080fd5b81810381811115610b5257610b52611c6c565b634e487b7160e01b600052603260045260246000fdfea164736f6c6343000818000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000052c0eb803f40ed8dc182a38e1dc5972392fe8bc30000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da000000000000000000000000c972fae6b524e8a6e0af21875675bf58a3133e60
-----Decoded View---------------
Arg [0] : _timeout (uint256): 86400
Arg [1] : _cap (uint256): 200000000000000000000
Arg [2] : _totalSupply (uint256): 100000000000000000000000000
Arg [3] : _communityFund (address): 0x52C0eb803F40eD8dc182a38E1dc5972392fE8bc3
Arg [4] : _lpDeployer (address): 0x1fEbf49332b11A74Cf44B1DF36EFFad1cBDfa7dA
Arg [5] : _router (address): 0xc972FaE6b524E8A6e0af21875675bF58a3133e60
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [1] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [2] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [3] : 00000000000000000000000052c0eb803f40ed8dc182a38e1dc5972392fe8bc3
Arg [4] : 0000000000000000000000001febf49332b11a74cf44b1df36effad1cbdfa7da
Arg [5] : 000000000000000000000000c972fae6b524e8a6e0af21875675bf58a3133e60
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BLAST | 100.00% | $1,792.83 | 5.6252 | $10,084.99 |
Loading...
Loading
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.