Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Pika
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.10; import "../Base.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract Pika is Base { using Strings for uint256; receive() external payable { // Do nothing } function _transfer( address sender, address recipient, uint256 amount ) internal override { // add liquidity // user => pair, msg.sender = router // remove liquidity // pair => router, msg.sender = pair // router => user, msg.sender = router // buy tokens for eth // pair => user, msg.sender = pair // sell tokens for eth // user => pair, msg.sender = router address pair = uniswapPair; // don't take a fee when // 1. fees are disabled // 2. the uniswap pair is neither sender nor recipient (non uniswap buy or sell) // 3. sender or recipient is excluded from fees // 4. sender is pair and recipient is router (2 transfers take place when liquidity is removed) if ( !feesEnabled || (sender != pair && recipient != pair) || isExcludedFromFee[sender] || isExcludedFromFee[recipient] || (sender == pair && recipient == address(router())) ) { ERC20Upgradeable._transfer(sender, recipient, amount); return; } // get fees and recipients from storage (address beneficiaryAddress, uint256 transferFee) = unpackBeneficiary(beneficiary); if (transferFee > 0) { transferFee = handleFeeTransfer(sender, amount, beneficiaryAddress, transferFee); // don't autoswap when uniswap pair or router are sending tokens if (swapEnabled && sender != pair && sender != address(router())) { _swapTokensForEth(address(this)); // if there are any ETH in the contract distribute rewards uint256 ethBalance = address(this).balance; (address stakingContract, uint256 stakingFee) = unpackBeneficiary(staking); uint256 stakingRewards = _calculateFee(ethBalance, stakingFee); if (stakingRewards > 0) { _safeTransfer(stakingContract, stakingRewards); } _safeTransfer(beneficiaryAddress, ethBalance - stakingRewards); } } ERC20Upgradeable._transfer(sender, recipient, amount - transferFee); } function _safeTransfer(address _to, uint256 _value) internal { (bool success, ) = _to.call{value: _value}(""); require(success, string(abi.encodePacked("ETH_TRANSFER_FAILED: ", uint256(uint160(_to)).toHexString(20)))); } uint256[50] private __gap; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.10; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; import "../OwnedInitializable.sol"; import "../interfaces/IUniswapV2Router.sol"; contract Base is OwnedInitializable, ERC20PermitUpgradeable { address public WETH; uint256 public minSupply; mapping(address => bool) public isExcludedFromFee; bool public feesEnabled; bool public swapEnabled; address public uniswapPair; // combine recipient and fee into a single storage slot uint256 public beneficiary; uint256 public staking; uint256 public liquidity; event MinSupplyUpdated(uint256 oldAmount, uint256 newAmount); event BeneficiaryRewardUpdated(address oldBeneficiary, address newBeneficiary, uint256 oldFee, uint256 newFee); event StakingRewardUpdated(address oldBeneficiary, address newBeneficiary, uint256 oldFee, uint256 newFee); event LiquidityRewardUpdated(address oldBeneficiary, address newBeneficiary, uint256 oldFee, uint256 newFee); event FeesEnabledUpdated(bool enabled); event SwapEnabledUpdated(bool enabled); event ExcludedFromFeeUpdated(address account, bool excluded); modifier ensureAddressSet(address _beneficiary, uint256 _fee) { if (_fee > 0) { require(_beneficiary != address(0), "address not set"); } else { require(_beneficiary == address(0), "set address to zero"); } _; } function initialize( uint256 _minSupply, uint256 _totalSupply, address _beneficiary, string calldata _name, string calldata _symbol, uint256 _initial_fee ) public virtual initializer { __Ownable_init(); __ERC20_init(_name, _symbol); __ERC20Permit_init(_name); minSupply = _minSupply; _mint(_msgSender(), _totalSupply); // calculate future Uniswap V2 pair address address uniswapFactory = router().factory(); address _WETH = router().WETH(); WETH = _WETH; // calculate future uniswap pair address (address token0, address token1) = (_WETH < address(this) ? (_WETH, address(this)) : (address(this), _WETH)); address pair = address( uint160( uint256( keccak256( abi.encodePacked( hex"ff", uniswapFactory, keccak256(abi.encodePacked(token0, token1)), hex"96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" ) ) ) ) ); uniswapPair = pair; beneficiary = packBeneficiary(_beneficiary, _initial_fee); isExcludedFromFee[address(this)] = true; isExcludedFromFee[_beneficiary] = true; isExcludedFromFee[_msgSender()] = true; } /** * @notice adds or removes an account that is exempt from fee collection * @dev only callable by owner * @param _account account to modify * @param _excluded new value */ function setExcludeFromFee(address _account, bool _excluded) public virtual onlyOwner { isExcludedFromFee[_account] = _excluded; emit ExcludedFromFeeUpdated(_account, _excluded); } /** * @dev helper function to pack address and fee into one storage slot */ function packBeneficiary(address _beneficiary, uint256 _fee) public pure virtual returns (uint256) { require(_fee <= 10000, "INVALID_FEE"); uint256 storedBeneficiary = uint256(uint160(_beneficiary)); storedBeneficiary |= _fee << 160; return storedBeneficiary; } /** * @dev helper function to unpack address and fee from single storage slot */ function unpackBeneficiary(uint256 _beneficiary) public pure virtual returns (address, uint256) { return (address(uint160(_beneficiary)), uint256(uint96(_beneficiary >> 160))); } /** * @notice allows to burn tokens from own balance * @dev only allows burning tokens until minimum supply is reached * @param value amount of tokens to burn */ function burn(uint256 value) external virtual { _burn(_msgSender(), value); require(totalSupply() >= minSupply, "total supply exceeds min supply"); } /** * @notice sets minimum supply of the token * @dev only callable by owner * @param _newMinSupply new minimum supply */ function setMinSupply(uint256 _newMinSupply) external virtual onlyOwner { emit MinSupplyUpdated(minSupply, _newMinSupply); minSupply = _newMinSupply; } /** * @notice sets recipient and fee amount of transfer fee * @dev excludes new beneficiary from fee * @dev only callable by owner * @param _newBeneficiary address of new beneficiary * @param _fee fee sent to new beneficiary in permyriad */ function setBeneficiary(address _newBeneficiary, uint256 _fee) external virtual ensureAddressSet(_newBeneficiary, _fee) onlyOwner { setExcludeFromFee(_newBeneficiary, true); (address currentBeneficiary, uint256 currentFee) = unpackBeneficiary(beneficiary); setExcludeFromFee(currentBeneficiary, false); uint256 newBeneficiary = packBeneficiary(_newBeneficiary, _fee); emit BeneficiaryRewardUpdated(currentBeneficiary, _newBeneficiary, currentFee, _fee); beneficiary = newBeneficiary; } /** * @notice sets recipient and fee amount of staking rewards * @dev excludes staking pool from fee * @dev only callable by owner * @param _contractAddress address of staking contract * @param _fee fee sent to staking contract in permyriad */ function setStaking(address _contractAddress, uint256 _fee) external virtual ensureAddressSet(_contractAddress, _fee) onlyOwner { setExcludeFromFee(_contractAddress, true); (address currentAddress, uint256 currentFee) = unpackBeneficiary(staking); setExcludeFromFee(currentAddress, false); uint256 newStaking = packBeneficiary(_contractAddress, _fee); emit StakingRewardUpdated(currentAddress, _contractAddress, currentFee, _fee); staking = newStaking; } /** * @notice sets recipient and fee amount of liquidity rewards * @dev excludes liquidity rewards pool from fee * @dev only callable by owner * @param _contractAddress address of liquidity rewards pool contract * @param _fee fee sent to new liquidity rewards pool in permyriad */ function setLiquidity(address _contractAddress, uint256 _fee) external virtual ensureAddressSet(_contractAddress, _fee) onlyOwner { setExcludeFromFee(_contractAddress, true); (address currentAddress, uint256 currentFee) = unpackBeneficiary(liquidity); setExcludeFromFee(currentAddress, false); uint256 newLiquidity = packBeneficiary(_contractAddress, _fee); emit LiquidityRewardUpdated(currentAddress, _contractAddress, currentFee, _fee); liquidity = newLiquidity; } /** * @notice sets whether account collects fees on token transfer * @dev only callable by owner * @param _enabled bool whether fees are enabled */ function setFeesEnabled(bool _enabled) external virtual onlyOwner { emit FeesEnabledUpdated(_enabled); feesEnabled = _enabled; } /** * @notice sets whether collected fees are autoswapped * @dev only callable by owner * @param _enabled bool whether swap is enabled */ function setSwapEnabled(bool _enabled) external virtual onlyOwner { emit SwapEnabledUpdated(_enabled); swapEnabled = _enabled; } function router() public pure virtual returns (IUniswapV2Router) { return IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); } function _transfer( address sender, address recipient, uint256 amount ) internal virtual override { if ( !feesEnabled || isExcludedFromFee[sender] || isExcludedFromFee[recipient] || // when removing liquidity from uniswap, don't take fee multiple times (sender == uniswapPair && recipient == address(router())) ) { ERC20Upgradeable._transfer(sender, recipient, amount); return; } // get fees and recipients from storage (address beneficiaryAddress, uint256 transferFee) = unpackBeneficiary(beneficiary); (address stakingContract, uint256 stakingFee) = unpackBeneficiary(staking); (address liquidityContract, uint256 liquidityFee) = unpackBeneficiary(liquidity); if (transferFee > 0) { transferFee = handleFeeTransfer(sender, amount, beneficiaryAddress, transferFee); } uint256 amountWithFee = amount - transferFee; require(amountWithFee > 0); // burn tokens if min supply not reached yet uint256 burnedFee = _calculateFee(amount, 25); if (totalSupply() - burnedFee >= minSupply) { _burn(sender, burnedFee); amountWithFee -= burnedFee; } if (stakingFee > 0) { stakingFee = _calculateFee(amount, stakingFee); ERC20Upgradeable._transfer(sender, stakingContract, stakingFee); amountWithFee -= stakingFee; } if (liquidityFee > 0) { liquidityFee = _calculateFee(amount, liquidityFee); ERC20Upgradeable._transfer(sender, liquidityContract, liquidityFee); amountWithFee -= liquidityFee; } // don't autoswap when uniswap pair or router are sending tokens if (swapEnabled && sender != uniswapPair && sender != address(router())) { _swapTokensForEth(beneficiaryAddress); } ERC20Upgradeable._transfer(sender, recipient, amountWithFee); } function handleFeeTransfer( address _sender, uint256 _amount, address _beneficiaryAddress, uint256 transferFee ) internal virtual returns (uint256) { transferFee = _calculateFee(_amount, transferFee); address feeRecipient = swapEnabled ? address(this) : _beneficiaryAddress; ERC20Upgradeable._transfer(_sender, feeRecipient, transferFee); return transferFee; } function _swapTokensForEth(address _to) internal virtual { uint256 tokenAmount = balanceOf(address(this)); // only swap if more than 1e-5 tokens are in contract to avoid "UniswapV2: K" error if (tokenAmount > 10**13) { address[] memory path = new address[](2); path[0] = address(this); path[1] = WETH; _approve(address(this), address(router()), tokenAmount); router().swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, _to, block.timestamp); } } function _calculateFee(uint256 _amount, uint256 _fee) internal pure virtual returns (uint256) { return (_amount * _fee) / 10000; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./draft-IERC20PermitUpgradeable.sol"; import "../ERC20Upgradeable.sol"; import "../../../utils/cryptography/draft-EIP712Upgradeable.sol"; import "../../../utils/cryptography/ECDSAUpgradeable.sol"; import "../../../utils/CountersUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; mapping(address => CountersUpgradeable.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function __ERC20Permit_init(string memory name) internal initializer { __Context_init_unchained(); __EIP712_init_unchained(name, "1"); __ERC20Permit_init_unchained(name); } function __ERC20Permit_init_unchained(string memory name) internal initializer { _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; contract OwnedInitializable is Initializable, ContextUpgradeable { address public owner; address public proposedOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { owner = _msgSender(); emit OwnershipTransferred(address(0), _msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() virtual { require(msg.sender == owner, "Owned: not owner"); _; } /** * @dev propeses a new owner * Can only be called by the current owner. */ function proposeOwner(address payable _newOwner) external onlyOwner { proposedOwner = _newOwner; } /** * @dev claims ownership of the contract * Can only be called by the new proposed owner. */ function claimOwnership() external { require(msg.sender == proposedOwner); emit OwnershipTransferred(owner, proposedOwner); owner = proposedOwner; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _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: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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 {} uint256[45] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSAUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712Upgradeable is Initializable { /* solhint-disable var-name-mixedcase */ bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal initializer { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal initializer { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712NameHash() internal virtual view returns (bytes32) { return _HASHED_NAME; } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712VersionHash() internal virtual view returns (bytes32) { return _HASHED_VERSION; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return recover(hash, r, vs); } else { revert("ECDSA: invalid signature length"); } } /** * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
{ "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"oldBeneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"BeneficiaryRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludedFromFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"FeesEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldBeneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"LiquidityRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"MinSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldBeneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"newBeneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"StakingRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"beneficiary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","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":"feesEnabled","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":"uint256","name":"_minSupply","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_initial_fee","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"packBeneficiary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"proposeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newBeneficiary","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinSupply","type":"uint256"}],"name":"setMinSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_beneficiary","type":"uint256"}],"name":"unpackBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506136e9806100206000396000f3fe6080604052600436106102a45760003560e01c80637ecebe001161016e578063b5ed298a116100cb578063dd62ed3e1161007f578063f370988811610064578063f370988814610785578063f4069cba146107a5578063f887ea40146107c557600080fd5b8063dd62ed3e1461071f578063e01af92c1461076557600080fd5b8063d153b60c116100b0578063d153b60c146106bf578063d505accf146106df578063d61e8956146106ff57600080fd5b8063b5ed298a14610679578063c816841b1461069957600080fd5b8063a64e4f8a11610122578063a9059cbb11610107578063a9059cbb14610619578063ad5c464814610639578063af9549e01461065957600080fd5b8063a64e4f8a146105df578063a901dd92146105f957600080fd5b80638fe6cae3116101535780638fe6cae31461059457806395d89b41146105aa578063a457c2d7146105bf57600080fd5b80637ecebe001461053c5780638da5cb5b1461055c57600080fd5b8063395093511161021c57806356e8e08e116101d05780636fd1f270116101b55780636fd1f270146104c657806370a08231146104e657806379c4ad7e1461051c57600080fd5b806356e8e08e146104645780636ddd1713146104a757600080fd5b80634cf088d9116102015780634cf088d9146104095780634e71e0c81461041f5780635342acb41461043457600080fd5b806339509351146103c957806342966c68146103e957600080fd5b80631ac2874b11610273578063313ce56711610258578063313ce567146103825780633644e5151461039e57806338af3eed146103b357600080fd5b80631ac2874b1461034057806323b872dd1461036257600080fd5b806306fdde03146102b0578063095ea7b3146102db57806318160ddd1461030b5780631a6865021461032a57600080fd5b366102ab57005b600080fd5b3480156102bc57600080fd5b506102c56107ec565b6040516102d29190613125565b60405180910390f35b3480156102e757600080fd5b506102fb6102f636600461318b565b61087e565b60405190151581526020016102d2565b34801561031757600080fd5b506037545b6040519081526020016102d2565b34801561033657600080fd5b5061031c60d45481565b34801561034c57600080fd5b5061036061035b3660046131b7565b610894565b005b34801561036e57600080fd5b506102fb61037d3660046131d0565b610934565b34801561038e57600080fd5b50604051601281526020016102d2565b3480156103aa57600080fd5b5061031c6109f3565b3480156103bf57600080fd5b5061031c60d25481565b3480156103d557600080fd5b506102fb6103e436600461318b565b610a02565b3480156103f557600080fd5b506103606104043660046131b7565b610a3e565b34801561041557600080fd5b5061031c60d35481565b34801561042b57600080fd5b50610360610a9f565b34801561044057600080fd5b506102fb61044f366004613211565b60d06020526000908152604090205460ff1681565b34801561047057600080fd5b5061048861047f3660046131b7565b9060a082901c90565b604080516001600160a01b0390931683526020830191909152016102d2565b3480156104b357600080fd5b5060d1546102fb90610100900460ff1681565b3480156104d257600080fd5b506103606104e136600461318b565b610b31565b3480156104f257600080fd5b5061031c610501366004613211565b6001600160a01b031660009081526035602052604090205490565b34801561052857600080fd5b50610360610537366004613277565b610cdd565b34801561054857600080fd5b5061031c610557366004613211565b6111ef565b34801561056857600080fd5b5060335461057c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d2565b3480156105a057600080fd5b5061031c60cf5481565b3480156105b657600080fd5b506102c561120f565b3480156105cb57600080fd5b506102fb6105da36600461318b565b61121e565b3480156105eb57600080fd5b5060d1546102fb9060ff1681565b34801561060557600080fd5b50610360610614366004613329565b6112cf565b34801561062557600080fd5b506102fb61063436600461318b565b61138f565b34801561064557600080fd5b5060ce5461057c906001600160a01b031681565b34801561066557600080fd5b50610360610674366004613344565b61139c565b34801561068557600080fd5b50610360610694366004613211565b611477565b3480156106a557600080fd5b5060d15461057c906201000090046001600160a01b031681565b3480156106cb57600080fd5b5060345461057c906001600160a01b031681565b3480156106eb57600080fd5b506103606106fa366004613379565b61150b565b34801561070b57600080fd5b5061031c61071a36600461318b565b611651565b34801561072b57600080fd5b5061031c61073a3660046133f0565b6001600160a01b03918216600090815260366020908152604080832093909416825291909152205490565b34801561077157600080fd5b50610360610780366004613329565b6116bc565b34801561079157600080fd5b506103606107a036600461318b565b611765565b3480156107b157600080fd5b506103606107c036600461318b565b611911565b3480156107d157600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d61057c565b6060603880546107fb90613429565b80601f016020809104026020016040519081016040528092919081815260200182805461082790613429565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b5050505050905090565b600061088b338484611abd565b50600192915050565b6033546001600160a01b031633146108f35760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b60cf5460408051918252602082018390527f8e485513f38ca4c23b0c8170161c4fd5c16f934ea7c068b376f646b0194d1b8e910160405180910390a160cf55565b6000610941848484611c16565b6001600160a01b0384166000908152603660209081526040808320338452909152902054828110156109db5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016108ea565b6109e88533858403611abd565b506001949350505050565b60006109fd611dee565b905090565b3360008181526036602090815260408083206001600160a01b0387168452909152812054909161088b918590610a399086906134a6565b611abd565b610a483382611e69565b60cf546037541015610a9c5760405162461bcd60e51b815260206004820152601f60248201527f746f74616c20737570706c792065786365656473206d696e20737570706c790060448201526064016108ea565b50565b6034546001600160a01b03163314610ab657600080fd5b6034546033546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603454603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b81818015610b94576001600160a01b038216610b8f5760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b610beb565b6001600160a01b03821615610beb5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b03163314610c455760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b610c5084600161139c565b600080610c6260d2549060a082901c90565b91509150610c7182600061139c565b6000610c7d8787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507f453873136650c88eb8b940e72829c86df6b8f7b66ebc69173766deb2b24808629060800160405180910390a160d255505050505050565b600054610100900460ff1680610cf6575060005460ff16155b610d685760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015610d8a576000805461ffff19166101011790555b610d92611feb565b610e0586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061210492505050565b610e4486868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d992505050565b60cf899055610e5333896122ec565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb91906134be565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4591906134be565b60ce80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915590915060009081903011610f90573083610f93565b82305b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915060009085906048016040516020818303038152906040528051906020012060405160200161107c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012060d180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905590506110f68c88611651565b60d281905550600160d06000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d060006111853390565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555050831592506111e4915050576000805461ff00191690555b505050505050505050565b6001600160a01b0381166000908152609b60205260408120545b92915050565b6060603980546107fb90613429565b3360009081526036602090815260408083206001600160a01b0386168452909152812054828110156112b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016108ea565b6112c53385858403611abd565b5060019392505050565b6033546001600160a01b031633146113295760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b60405181151581527fba500994dffbabeeb9e430f03a978d7b975359a20c5bde3a6ccb5a0c454680c89060200160405180910390a160d180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600061088b338484611c16565b6033546001600160a01b031633146113f65760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b6001600160a01b038216600081815260d0602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b6033546001600160a01b031633146114d15760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b603480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b8342111561155b5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108ea565b6000609c5488888861156c8c6123cb565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006115c7826123f3565b905060006115d78287878761245c565b9050896001600160a01b0316816001600160a01b03161461163a5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016108ea565b6116458a8a8a611abd565b50505050505050505050565b60006127108211156116a55760405162461bcd60e51b815260206004820152600b60248201527f494e56414c49445f46454500000000000000000000000000000000000000000060448201526064016108ea565b5060a081901b6001600160a01b0383161792915050565b6033546001600160a01b031633146117165760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b60405181151581527f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129060200160405180910390a160d180549115156101000261ff0019909216919091179055565b818180156117c8576001600160a01b0382166117c35760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b61181f565b6001600160a01b0382161561181f5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b031633146118795760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b61188484600161139c565b60008061189660d3549060a082901c90565b915091506118a582600061139c565b60006118b18787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507f01882fab9b299e3573d2e9bf73d533bb8f9b5fd998713b63df51a02dcb57867b9060800160405180910390a160d355505050505050565b81818015611974576001600160a01b03821661196f5760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b6119cb565b6001600160a01b038216156119cb5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b03163314611a255760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b611a3084600161139c565b600080611a4260d4549060a082901c90565b91509150611a5182600061139c565b6000611a5d8787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507fcac88aa2c82aea657ebaca31d44065bb708ab6bc483f5db5868fc3dde2644cc39060800160405180910390a160d455505050505050565b6001600160a01b038316611b385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038216611bb45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0383811660008181526036602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60d1546001600160a01b03620100008204169060ff161580611c675750806001600160a01b0316846001600160a01b031614158015611c675750806001600160a01b0316836001600160a01b031614155b80611c8a57506001600160a01b038416600090815260d0602052604090205460ff165b80611cad57506001600160a01b038316600090815260d0602052604090205460ff165b80611cf05750806001600160a01b0316846001600160a01b0316148015611cf057506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d145b15611d0657611d00848484612659565b50505050565b600080611d1860d2549060a082901c90565b90925090508015611dd257611d2f86858484612870565b60d154909150610100900460ff168015611d5b5750826001600160a01b0316866001600160a01b031614155b8015611d8457506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611dd257611d92306128b0565b60d354479060a081901c6000611da884836129fb565b90508015611dba57611dba8382612a1b565b611dcd86611dc883876134db565b612a1b565b505050505b611de68686611de184886134db565b612659565b505050505050565b60006109fd7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611e1d60675490565b6068546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b038216611ee55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b03821660009081526035602052604090205481811015611f745760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0383166000908152603560205260408120838303905560378054849290611fa39084906134db565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c09565b505050565b600054610100900460ff1680612004575060005460ff16155b6120765760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612098576000805461ffff19166101011790555b603380547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610a9c576000805461ff001916905550565b600054610100900460ff168061211d575060005460ff16155b61218f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff161580156121b1576000805461ffff19166101011790555b6121b9612ac5565b6121c38383612b86565b8015611fe6576000805461ff0019169055505050565b600054610100900460ff16806121f2575060005460ff16155b6122645760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612286576000805461ffff19166101011790555b61228e612ac5565b6122cd826040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612c71565b6122d682612d51565b80156122e8576000805461ff00191690555b5050565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108ea565b806037600082825461235491906134a6565b90915550506001600160a01b038216600090815260356020526040812080548392906123819084906134a6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b6000611209612400611dee565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156124f45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b8360ff16601b148061250957508360ff16601c145b61257b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156125cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166126505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ea565b95945050505050565b6001600160a01b0383166126d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0382166127515760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038316600090815260356020526040902054818110156127e05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038085166000908152603560205260408082208585039055918516815290812080548492906128179084906134a6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161286391815260200190565b60405180910390a3611d00565b600061287c84836129fb565b60d154909250600090610100900460ff166128975783612899565b305b90506128a6868285612659565b5090949350505050565b306000908152603560205260409020546509184e72a0008111156122e857604080516002808252606082018352600092602083019080368337019050509050308160008151811061290357612903613521565b6001600160a01b03928316602091820292909201015260ce5482519116908290600190811061293457612934613521565b6001600160a01b039092166020928302919091019091015261296b30737a250d5630b4cf539739df2c5dacb4c659f2488d84611abd565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906129c4908590600090869089904290600401613550565b600060405180830381600087803b1580156129de57600080fd5b505af11580156129f2573d6000803e3d6000fd5b50505050505050565b6000612710612a0a83856135c1565b612a1491906135fe565b9392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b50909150819050612a886001600160a01b0385166014612e37565b604051602001612a989190613639565b60405160208183030381529060405290611d005760405162461bcd60e51b81526004016108ea9190613125565b600054610100900460ff1680612ade575060005460ff16155b612b505760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612b72576000805461ffff19166101011790555b8015610a9c576000805461ff001916905550565b600054610100900460ff1680612b9f575060005460ff16155b612c115760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612c33576000805461ffff19166101011790555b8251612c46906038906020860190613060565b508151612c5a906039906020850190613060565b508015611fe6576000805461ff0019169055505050565b600054610100900460ff1680612c8a575060005460ff16155b612cfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612d1e576000805461ffff19166101011790555b82516020808501919091208351918401919091206067919091556068558015611fe6576000805461ff0019169055505050565b600054610100900460ff1680612d6a575060005460ff16155b612ddc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612dfe576000805461ffff19166101011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609c5580156122e8576000805461ff00191690555050565b60606000612e468360026135c1565b612e519060026134a6565b67ffffffffffffffff811115612e6957612e696134f2565b6040519080825280601f01601f191660200182016040528015612e93576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612eca57612eca613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f2d57612f2d613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612f698460026135c1565b612f749060016134a6565b90505b6001811115613011577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612fb557612fb5613521565b1a60f81b828281518110612fcb57612fcb613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361300a8161367e565b9050612f77565b508315612a145760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108ea565b82805461306c90613429565b90600052602060002090601f01602090048101928261308e57600085556130d4565b82601f106130a757805160ff19168380011785556130d4565b828001600101855582156130d4579182015b828111156130d45782518255916020019190600101906130b9565b506130e09291506130e4565b5090565b5b808211156130e057600081556001016130e5565b60005b838110156131145781810151838201526020016130fc565b83811115611d005750506000910152565b60208152600082518060208401526131448160408501602087016130f9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b0381168114610a9c57600080fd5b6000806040838503121561319e57600080fd5b82356131a981613176565b946020939093013593505050565b6000602082840312156131c957600080fd5b5035919050565b6000806000606084860312156131e557600080fd5b83356131f081613176565b9250602084013561320081613176565b929592945050506040919091013590565b60006020828403121561322357600080fd5b8135612a1481613176565b60008083601f84011261324057600080fd5b50813567ffffffffffffffff81111561325857600080fd5b60208301915083602082850101111561327057600080fd5b9250929050565b60008060008060008060008060c0898b03121561329357600080fd5b883597506020890135965060408901356132ac81613176565b9550606089013567ffffffffffffffff808211156132c957600080fd5b6132d58c838d0161322e565b909750955060808b01359150808211156132ee57600080fd5b506132fb8b828c0161322e565b999c989b50969995989497949560a00135949350505050565b8035801515811461332457600080fd5b919050565b60006020828403121561333b57600080fd5b612a1482613314565b6000806040838503121561335757600080fd5b823561336281613176565b915061337060208401613314565b90509250929050565b600080600080600080600060e0888a03121561339457600080fd5b873561339f81613176565b965060208801356133af81613176565b95506040880135945060608801359350608088013560ff811681146133d357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561340357600080fd5b823561340e81613176565b9150602083013561341e81613176565b809150509250929050565b600181811c9082168061343d57607f821691505b602082108114156123ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156134b9576134b9613477565b500190565b6000602082840312156134d057600080fd5b8151612a1481613176565b6000828210156134ed576134ed613477565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135a05784516001600160a01b03168352938301939183019160010161357b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135f9576135f9613477565b500290565b600082613634577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4554485f5452414e534645525f4641494c45443a2000000000000000000000008152600082516136718160158501602087016130f9565b9190910160150192915050565b60008161368d5761368d613477565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220cd1a09b17313ca5c0cdbb3c2afd067641a85a8d555dab4de4a104d3bba51b41464736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106102a45760003560e01c80637ecebe001161016e578063b5ed298a116100cb578063dd62ed3e1161007f578063f370988811610064578063f370988814610785578063f4069cba146107a5578063f887ea40146107c557600080fd5b8063dd62ed3e1461071f578063e01af92c1461076557600080fd5b8063d153b60c116100b0578063d153b60c146106bf578063d505accf146106df578063d61e8956146106ff57600080fd5b8063b5ed298a14610679578063c816841b1461069957600080fd5b8063a64e4f8a11610122578063a9059cbb11610107578063a9059cbb14610619578063ad5c464814610639578063af9549e01461065957600080fd5b8063a64e4f8a146105df578063a901dd92146105f957600080fd5b80638fe6cae3116101535780638fe6cae31461059457806395d89b41146105aa578063a457c2d7146105bf57600080fd5b80637ecebe001461053c5780638da5cb5b1461055c57600080fd5b8063395093511161021c57806356e8e08e116101d05780636fd1f270116101b55780636fd1f270146104c657806370a08231146104e657806379c4ad7e1461051c57600080fd5b806356e8e08e146104645780636ddd1713146104a757600080fd5b80634cf088d9116102015780634cf088d9146104095780634e71e0c81461041f5780635342acb41461043457600080fd5b806339509351146103c957806342966c68146103e957600080fd5b80631ac2874b11610273578063313ce56711610258578063313ce567146103825780633644e5151461039e57806338af3eed146103b357600080fd5b80631ac2874b1461034057806323b872dd1461036257600080fd5b806306fdde03146102b0578063095ea7b3146102db57806318160ddd1461030b5780631a6865021461032a57600080fd5b366102ab57005b600080fd5b3480156102bc57600080fd5b506102c56107ec565b6040516102d29190613125565b60405180910390f35b3480156102e757600080fd5b506102fb6102f636600461318b565b61087e565b60405190151581526020016102d2565b34801561031757600080fd5b506037545b6040519081526020016102d2565b34801561033657600080fd5b5061031c60d45481565b34801561034c57600080fd5b5061036061035b3660046131b7565b610894565b005b34801561036e57600080fd5b506102fb61037d3660046131d0565b610934565b34801561038e57600080fd5b50604051601281526020016102d2565b3480156103aa57600080fd5b5061031c6109f3565b3480156103bf57600080fd5b5061031c60d25481565b3480156103d557600080fd5b506102fb6103e436600461318b565b610a02565b3480156103f557600080fd5b506103606104043660046131b7565b610a3e565b34801561041557600080fd5b5061031c60d35481565b34801561042b57600080fd5b50610360610a9f565b34801561044057600080fd5b506102fb61044f366004613211565b60d06020526000908152604090205460ff1681565b34801561047057600080fd5b5061048861047f3660046131b7565b9060a082901c90565b604080516001600160a01b0390931683526020830191909152016102d2565b3480156104b357600080fd5b5060d1546102fb90610100900460ff1681565b3480156104d257600080fd5b506103606104e136600461318b565b610b31565b3480156104f257600080fd5b5061031c610501366004613211565b6001600160a01b031660009081526035602052604090205490565b34801561052857600080fd5b50610360610537366004613277565b610cdd565b34801561054857600080fd5b5061031c610557366004613211565b6111ef565b34801561056857600080fd5b5060335461057c906001600160a01b031681565b6040516001600160a01b0390911681526020016102d2565b3480156105a057600080fd5b5061031c60cf5481565b3480156105b657600080fd5b506102c561120f565b3480156105cb57600080fd5b506102fb6105da36600461318b565b61121e565b3480156105eb57600080fd5b5060d1546102fb9060ff1681565b34801561060557600080fd5b50610360610614366004613329565b6112cf565b34801561062557600080fd5b506102fb61063436600461318b565b61138f565b34801561064557600080fd5b5060ce5461057c906001600160a01b031681565b34801561066557600080fd5b50610360610674366004613344565b61139c565b34801561068557600080fd5b50610360610694366004613211565b611477565b3480156106a557600080fd5b5060d15461057c906201000090046001600160a01b031681565b3480156106cb57600080fd5b5060345461057c906001600160a01b031681565b3480156106eb57600080fd5b506103606106fa366004613379565b61150b565b34801561070b57600080fd5b5061031c61071a36600461318b565b611651565b34801561072b57600080fd5b5061031c61073a3660046133f0565b6001600160a01b03918216600090815260366020908152604080832093909416825291909152205490565b34801561077157600080fd5b50610360610780366004613329565b6116bc565b34801561079157600080fd5b506103606107a036600461318b565b611765565b3480156107b157600080fd5b506103606107c036600461318b565b611911565b3480156107d157600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d61057c565b6060603880546107fb90613429565b80601f016020809104026020016040519081016040528092919081815260200182805461082790613429565b80156108745780601f1061084957610100808354040283529160200191610874565b820191906000526020600020905b81548152906001019060200180831161085757829003601f168201915b5050505050905090565b600061088b338484611abd565b50600192915050565b6033546001600160a01b031633146108f35760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064015b60405180910390fd5b60cf5460408051918252602082018390527f8e485513f38ca4c23b0c8170161c4fd5c16f934ea7c068b376f646b0194d1b8e910160405180910390a160cf55565b6000610941848484611c16565b6001600160a01b0384166000908152603660209081526040808320338452909152902054828110156109db5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016108ea565b6109e88533858403611abd565b506001949350505050565b60006109fd611dee565b905090565b3360008181526036602090815260408083206001600160a01b0387168452909152812054909161088b918590610a399086906134a6565b611abd565b610a483382611e69565b60cf546037541015610a9c5760405162461bcd60e51b815260206004820152601f60248201527f746f74616c20737570706c792065786365656473206d696e20737570706c790060448201526064016108ea565b50565b6034546001600160a01b03163314610ab657600080fd5b6034546033546040516001600160a01b0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603454603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055565b81818015610b94576001600160a01b038216610b8f5760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b610beb565b6001600160a01b03821615610beb5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b03163314610c455760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b610c5084600161139c565b600080610c6260d2549060a082901c90565b91509150610c7182600061139c565b6000610c7d8787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507f453873136650c88eb8b940e72829c86df6b8f7b66ebc69173766deb2b24808629060800160405180910390a160d255505050505050565b600054610100900460ff1680610cf6575060005460ff16155b610d685760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015610d8a576000805461ffff19166101011790555b610d92611feb565b610e0586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061210492505050565b610e4486868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506121d992505050565b60cf899055610e5333896122ec565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb91906134be565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4591906134be565b60ce80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811790915590915060009081903011610f90573083610f93565b82305b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b166034820152919350915060009085906048016040516020818303038152906040528051906020012060405160200161107c9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012060d180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905590506110f68c88611651565b60d281905550600160d06000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550600160d060006111853390565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555050831592506111e4915050576000805461ff00191690555b505050505050505050565b6001600160a01b0381166000908152609b60205260408120545b92915050565b6060603980546107fb90613429565b3360009081526036602090815260408083206001600160a01b0386168452909152812054828110156112b85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016108ea565b6112c53385858403611abd565b5060019392505050565b6033546001600160a01b031633146113295760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b60405181151581527fba500994dffbabeeb9e430f03a978d7b975359a20c5bde3a6ccb5a0c454680c89060200160405180910390a160d180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600061088b338484611c16565b6033546001600160a01b031633146113f65760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b6001600160a01b038216600081815260d0602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b6033546001600160a01b031633146114d15760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b603480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b8342111561155b5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108ea565b6000609c5488888861156c8c6123cb565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006115c7826123f3565b905060006115d78287878761245c565b9050896001600160a01b0316816001600160a01b03161461163a5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016108ea565b6116458a8a8a611abd565b50505050505050505050565b60006127108211156116a55760405162461bcd60e51b815260206004820152600b60248201527f494e56414c49445f46454500000000000000000000000000000000000000000060448201526064016108ea565b5060a081901b6001600160a01b0383161792915050565b6033546001600160a01b031633146117165760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b60405181151581527f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129060200160405180910390a160d180549115156101000261ff0019909216919091179055565b818180156117c8576001600160a01b0382166117c35760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b61181f565b6001600160a01b0382161561181f5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b031633146118795760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b61188484600161139c565b60008061189660d3549060a082901c90565b915091506118a582600061139c565b60006118b18787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507f01882fab9b299e3573d2e9bf73d533bb8f9b5fd998713b63df51a02dcb57867b9060800160405180910390a160d355505050505050565b81818015611974576001600160a01b03821661196f5760405162461bcd60e51b815260206004820152600f60248201527f61646472657373206e6f7420736574000000000000000000000000000000000060448201526064016108ea565b6119cb565b6001600160a01b038216156119cb5760405162461bcd60e51b815260206004820152601360248201527f736574206164647265737320746f207a65726f0000000000000000000000000060448201526064016108ea565b6033546001600160a01b03163314611a255760405162461bcd60e51b815260206004820152601060248201527f4f776e65643a206e6f74206f776e65720000000000000000000000000000000060448201526064016108ea565b611a3084600161139c565b600080611a4260d4549060a082901c90565b91509150611a5182600061139c565b6000611a5d8787611651565b604080516001600160a01b0380871682528a166020820152908101849052606081018890529091507fcac88aa2c82aea657ebaca31d44065bb708ab6bc483f5db5868fc3dde2644cc39060800160405180910390a160d455505050505050565b6001600160a01b038316611b385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038216611bb45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0383811660008181526036602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60d1546001600160a01b03620100008204169060ff161580611c675750806001600160a01b0316846001600160a01b031614158015611c675750806001600160a01b0316836001600160a01b031614155b80611c8a57506001600160a01b038416600090815260d0602052604090205460ff165b80611cad57506001600160a01b038316600090815260d0602052604090205460ff165b80611cf05750806001600160a01b0316846001600160a01b0316148015611cf057506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d145b15611d0657611d00848484612659565b50505050565b600080611d1860d2549060a082901c90565b90925090508015611dd257611d2f86858484612870565b60d154909150610100900460ff168015611d5b5750826001600160a01b0316866001600160a01b031614155b8015611d8457506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15611dd257611d92306128b0565b60d354479060a081901c6000611da884836129fb565b90508015611dba57611dba8382612a1b565b611dcd86611dc883876134db565b612a1b565b505050505b611de68686611de184886134db565b612659565b505050505050565b60006109fd7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611e1d60675490565b6068546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6001600160a01b038216611ee55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b03821660009081526035602052604090205481811015611f745760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0383166000908152603560205260408120838303905560378054849290611fa39084906134db565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c09565b505050565b600054610100900460ff1680612004575060005460ff16155b6120765760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612098576000805461ffff19166101011790555b603380547fffffffffffffffffffffffff000000000000000000000000000000000000000016339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610a9c576000805461ff001916905550565b600054610100900460ff168061211d575060005460ff16155b61218f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff161580156121b1576000805461ffff19166101011790555b6121b9612ac5565b6121c38383612b86565b8015611fe6576000805461ff0019169055505050565b600054610100900460ff16806121f2575060005460ff16155b6122645760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612286576000805461ffff19166101011790555b61228e612ac5565b6122cd826040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612c71565b6122d682612d51565b80156122e8576000805461ff00191690555b5050565b6001600160a01b0382166123425760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108ea565b806037600082825461235491906134a6565b90915550506001600160a01b038216600090815260356020526040812080548392906123819084906134a6565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0381166000908152609b602052604090208054600181018255905b50919050565b6000611209612400611dee565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156124f45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b8360ff16601b148061250957508360ff16601c145b61257b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156125cf573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166126505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ea565b95945050505050565b6001600160a01b0383166126d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b0382166127515760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038316600090815260356020526040902054818110156127e05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016108ea565b6001600160a01b038085166000908152603560205260408082208585039055918516815290812080548492906128179084906134a6565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161286391815260200190565b60405180910390a3611d00565b600061287c84836129fb565b60d154909250600090610100900460ff166128975783612899565b305b90506128a6868285612659565b5090949350505050565b306000908152603560205260409020546509184e72a0008111156122e857604080516002808252606082018352600092602083019080368337019050509050308160008151811061290357612903613521565b6001600160a01b03928316602091820292909201015260ce5482519116908290600190811061293457612934613521565b6001600160a01b039092166020928302919091019091015261296b30737a250d5630b4cf539739df2c5dacb4c659f2488d84611abd565b6040517f791ac947000000000000000000000000000000000000000000000000000000008152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906129c4908590600090869089904290600401613550565b600060405180830381600087803b1580156129de57600080fd5b505af11580156129f2573d6000803e3d6000fd5b50505050505050565b6000612710612a0a83856135c1565b612a1491906135fe565b9392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a68576040519150601f19603f3d011682016040523d82523d6000602084013e612a6d565b606091505b50909150819050612a886001600160a01b0385166014612e37565b604051602001612a989190613639565b60405160208183030381529060405290611d005760405162461bcd60e51b81526004016108ea9190613125565b600054610100900460ff1680612ade575060005460ff16155b612b505760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612b72576000805461ffff19166101011790555b8015610a9c576000805461ff001916905550565b600054610100900460ff1680612b9f575060005460ff16155b612c115760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612c33576000805461ffff19166101011790555b8251612c46906038906020860190613060565b508151612c5a906039906020850190613060565b508015611fe6576000805461ff0019169055505050565b600054610100900460ff1680612c8a575060005460ff16155b612cfc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612d1e576000805461ffff19166101011790555b82516020808501919091208351918401919091206067919091556068558015611fe6576000805461ff0019169055505050565b600054610100900460ff1680612d6a575060005460ff16155b612ddc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ea565b600054610100900460ff16158015612dfe576000805461ffff19166101011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609c5580156122e8576000805461ff00191690555050565b60606000612e468360026135c1565b612e519060026134a6565b67ffffffffffffffff811115612e6957612e696134f2565b6040519080825280601f01601f191660200182016040528015612e93576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612eca57612eca613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f2d57612f2d613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612f698460026135c1565b612f749060016134a6565b90505b6001811115613011577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612fb557612fb5613521565b1a60f81b828281518110612fcb57612fcb613521565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361300a8161367e565b9050612f77565b508315612a145760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108ea565b82805461306c90613429565b90600052602060002090601f01602090048101928261308e57600085556130d4565b82601f106130a757805160ff19168380011785556130d4565b828001600101855582156130d4579182015b828111156130d45782518255916020019190600101906130b9565b506130e09291506130e4565b5090565b5b808211156130e057600081556001016130e5565b60005b838110156131145781810151838201526020016130fc565b83811115611d005750506000910152565b60208152600082518060208401526131448160408501602087016130f9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b0381168114610a9c57600080fd5b6000806040838503121561319e57600080fd5b82356131a981613176565b946020939093013593505050565b6000602082840312156131c957600080fd5b5035919050565b6000806000606084860312156131e557600080fd5b83356131f081613176565b9250602084013561320081613176565b929592945050506040919091013590565b60006020828403121561322357600080fd5b8135612a1481613176565b60008083601f84011261324057600080fd5b50813567ffffffffffffffff81111561325857600080fd5b60208301915083602082850101111561327057600080fd5b9250929050565b60008060008060008060008060c0898b03121561329357600080fd5b883597506020890135965060408901356132ac81613176565b9550606089013567ffffffffffffffff808211156132c957600080fd5b6132d58c838d0161322e565b909750955060808b01359150808211156132ee57600080fd5b506132fb8b828c0161322e565b999c989b50969995989497949560a00135949350505050565b8035801515811461332457600080fd5b919050565b60006020828403121561333b57600080fd5b612a1482613314565b6000806040838503121561335757600080fd5b823561336281613176565b915061337060208401613314565b90509250929050565b600080600080600080600060e0888a03121561339457600080fd5b873561339f81613176565b965060208801356133af81613176565b95506040880135945060608801359350608088013560ff811681146133d357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561340357600080fd5b823561340e81613176565b9150602083013561341e81613176565b809150509250929050565b600181811c9082168061343d57607f821691505b602082108114156123ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156134b9576134b9613477565b500190565b6000602082840312156134d057600080fd5b8151612a1481613176565b6000828210156134ed576134ed613477565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135a05784516001600160a01b03168352938301939183019160010161357b565b50506001600160a01b03969096166060850152505050608001529392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135f9576135f9613477565b500290565b600082613634577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4554485f5452414e534645525f4641494c45443a2000000000000000000000008152600082516136718160158501602087016130f9565b9190910160150192915050565b60008161368d5761368d613477565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220cd1a09b17313ca5c0cdbb3c2afd067641a85a8d555dab4de4a104d3bba51b41464736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.