- Contract name:
- CoinToken
- Optimization enabled
- true
- Compiler version
- v0.8.2+commit.661d1103
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-04-16T00:42:27.742981Z
Constructor Arguments
0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000aad2056ddc984af58f83ef636652232c2e199f90000000000000000000000000aad2056ddc984af58f83ef636652232c2e199f9000000000000000000000000051e46fddf884518d96ebea18023f7b2d0a82582a00000000000000000000000000000000000000000000000000000000000000065370c3ad74690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acea3cf80ceafcf84ceb900000000000000000000000000000000000000000000
Arg [0] (string) : Spíti
Arg [1] (string) : Σπίτι
Arg [2] (uint256) : 9
Arg [3] (uint256) : 100000000000000000000
Arg [4] (uint256) : 8
Arg [5] (uint256) : 1
Arg [6] (uint256) : 1
Arg [7] (address) : 0xaad2056ddc984af58f83ef636652232c2e199f90
Arg [8] (address) : 0xaad2056ddc984af58f83ef636652232c2e199f90
Arg [9] (address) : 0x51e46fddf884518d96ebea18023f7b2d0a82582a
Contract source code
/** *Submitted for verification at cronoscan.com on 2022-01-23 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.2; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Interface of the BEP20 standard as defined in the EIP. */ interface IBEP20 { /** * @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); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address public _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract CoinToken is Context, IBEP20, Ownable { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcluded; address[] private _excluded; string private _NAME; string private _SYMBOL; uint256 private _DECIMALS; address public FeeAddress; uint256 private _MAX = ~uint256(0); uint256 private _DECIMALFACTOR; uint256 private _GRANULARITY = 100; uint256 private _tTotal; uint256 private _rTotal; uint256 private _tFeeTotal; uint256 private _tBurnTotal; uint256 private _tCharityTotal; uint256 public _TAX_FEE; uint256 public _BURN_FEE; uint256 public _CHARITY_FEE; // Track original fees to bypass fees for charity account uint256 private ORIG_TAX_FEE; uint256 private ORIG_BURN_FEE; uint256 private ORIG_CHARITY_FEE; constructor (string memory _name, string memory _symbol, uint256 _decimals, uint256 _supply, uint256 _txFee,uint256 _burnFee,uint256 _charityFee,address _FeeAddress,address tokenOwner,address service) payable { _NAME = _name; _SYMBOL = _symbol; _DECIMALS = _decimals; _DECIMALFACTOR = 10 ** _DECIMALS; _tTotal =_supply * _DECIMALFACTOR; _rTotal = (_MAX - (_MAX % _tTotal)); _TAX_FEE = _txFee* 100; _BURN_FEE = _burnFee * 100; _CHARITY_FEE = _charityFee* 100; ORIG_TAX_FEE = _TAX_FEE; ORIG_BURN_FEE = _BURN_FEE; ORIG_CHARITY_FEE = _CHARITY_FEE; FeeAddress = _FeeAddress; _owner = tokenOwner; _rOwned[tokenOwner] = _rTotal; payable(service).transfer(msg.value); emit Transfer(address(0),tokenOwner, _tTotal); } function name() public view returns (string memory) { return _NAME; } function symbol() public view returns (string memory) { return _SYMBOL; } function decimals() public view returns (uint8) { return uint8(_DECIMALS); } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "TOKEN20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "TOKEN20: decreased allowance below zero")); return true; } function isExcluded(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function totalBurn() public view returns (uint256) { return _tBurnTotal; } function totalCharity() public view returns (uint256) { return _tCharityTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); require(!_isExcluded[sender], "Excluded addresses cannot call this function"); (uint256 rAmount,,,,,,) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,,,) = _getValues(tAmount); return rAmount; } else { (,uint256 rTransferAmount,,,,,) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total reflections"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeAccount(address account) external onlyOwner() { require(!_isExcluded[account], "Account is already excluded"); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeAccount(address account) external onlyOwner() { require(_isExcluded[account], "Account is already included"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function setAsCharityAccount(address account) external onlyOwner() { FeeAddress = account; } function updateFee(uint256 _txFee,uint256 _burnFee,uint256 _charityFee) onlyOwner() public{ require(_txFee < 100 && _burnFee < 100 && _charityFee < 100); _TAX_FEE = _txFee* 100; _BURN_FEE = _burnFee * 100; _CHARITY_FEE = _charityFee* 100; ORIG_TAX_FEE = _TAX_FEE; ORIG_BURN_FEE = _BURN_FEE; ORIG_CHARITY_FEE = _CHARITY_FEE; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "TOKEN20: approve from the zero address"); require(spender != address(0), "TOKEN20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address sender, address recipient, uint256 amount) private { require(sender != address(0), "TOKEN20: transfer from the zero address"); require(recipient != address(0), "TOKEN20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); // Remove fees for transfers to and from charity account or to excluded account bool takeFee = true; if (FeeAddress == sender || FeeAddress == recipient || _isExcluded[recipient]) { takeFee = false; } if (!takeFee) removeAllFee(); if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { _transferStandard(sender, recipient, amount); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if (!takeFee) restoreAllFee(); } function _transferStandard(address sender, address recipient, uint256 tAmount) private { uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tCharity) = _getValues(tAmount); uint256 rBurn = tBurn.mul(currentRate); _standardTransferContent(sender, recipient, rAmount, rTransferAmount); _sendToCharity(tCharity, sender); _reflectFee(rFee, rBurn, tFee, tBurn, tCharity); emit Transfer(sender, recipient, tTransferAmount); } function _standardTransferContent(address sender, address recipient, uint256 rAmount, uint256 rTransferAmount) private { _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); } function _transferToExcluded(address sender, address recipient, uint256 tAmount) private { uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tCharity) = _getValues(tAmount); uint256 rBurn = tBurn.mul(currentRate); _excludedFromTransferContent(sender, recipient, tTransferAmount, rAmount, rTransferAmount); _sendToCharity(tCharity, sender); _reflectFee(rFee, rBurn, tFee, tBurn, tCharity); emit Transfer(sender, recipient, tTransferAmount); } function _excludedFromTransferContent(address sender, address recipient, uint256 tTransferAmount, uint256 rAmount, uint256 rTransferAmount) private { _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private { uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tCharity) = _getValues(tAmount); uint256 rBurn = tBurn.mul(currentRate); _excludedToTransferContent(sender, recipient, tAmount, rAmount, rTransferAmount); _sendToCharity(tCharity, sender); _reflectFee(rFee, rBurn, tFee, tBurn, tCharity); emit Transfer(sender, recipient, tTransferAmount); } function _excludedToTransferContent(address sender, address recipient, uint256 tAmount, uint256 rAmount, uint256 rTransferAmount) private { _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); } function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private { uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tBurn, uint256 tCharity) = _getValues(tAmount); uint256 rBurn = tBurn.mul(currentRate); _bothTransferContent(sender, recipient, tAmount, rAmount, tTransferAmount, rTransferAmount); _sendToCharity(tCharity, sender); _reflectFee(rFee, rBurn, tFee, tBurn, tCharity); emit Transfer(sender, recipient, tTransferAmount); } function _bothTransferContent(address sender, address recipient, uint256 tAmount, uint256 rAmount, uint256 tTransferAmount, uint256 rTransferAmount) private { _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); } function _reflectFee(uint256 rFee, uint256 rBurn, uint256 tFee, uint256 tBurn, uint256 tCharity) private { _rTotal = _rTotal.sub(rFee).sub(rBurn); _tFeeTotal = _tFeeTotal.add(tFee); _tBurnTotal = _tBurnTotal.add(tBurn); _tCharityTotal = _tCharityTotal.add(tCharity); _tTotal = _tTotal.sub(tBurn); emit Transfer(address(this), address(0), tBurn); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tFee, uint256 tBurn, uint256 tCharity) = _getTBasics(tAmount, _TAX_FEE, _BURN_FEE, _CHARITY_FEE); uint256 tTransferAmount = getTTransferAmount(tAmount, tFee, tBurn, tCharity); uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rFee) = _getRBasics(tAmount, tFee, currentRate); uint256 rTransferAmount = _getRTransferAmount(rAmount, rFee, tBurn, tCharity, currentRate); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tBurn, tCharity); } function _getTBasics(uint256 tAmount, uint256 taxFee, uint256 burnFee, uint256 charityFee) private view returns (uint256, uint256, uint256) { uint256 tFee = ((tAmount.mul(taxFee)).div(_GRANULARITY)).div(100); uint256 tBurn = ((tAmount.mul(burnFee)).div(_GRANULARITY)).div(100); uint256 tCharity = ((tAmount.mul(charityFee)).div(_GRANULARITY)).div(100); return (tFee, tBurn, tCharity); } function getTTransferAmount(uint256 tAmount, uint256 tFee, uint256 tBurn, uint256 tCharity) private pure returns (uint256) { return tAmount.sub(tFee).sub(tBurn).sub(tCharity); } function _getRBasics(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); return (rAmount, rFee); } function _getRTransferAmount(uint256 rAmount, uint256 rFee, uint256 tBurn, uint256 tCharity, uint256 currentRate) private pure returns (uint256) { uint256 rBurn = tBurn.mul(currentRate); uint256 rCharity = tCharity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rBurn).sub(rCharity); return rTransferAmount; } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _sendToCharity(uint256 tCharity, address sender) private { uint256 currentRate = _getRate(); uint256 rCharity = tCharity.mul(currentRate); _rOwned[FeeAddress] = _rOwned[FeeAddress].add(rCharity); _tOwned[FeeAddress] = _tOwned[FeeAddress].add(tCharity); emit Transfer(sender, FeeAddress, tCharity); } function removeAllFee() private { if(_TAX_FEE == 0 && _BURN_FEE == 0 && _CHARITY_FEE == 0) return; ORIG_TAX_FEE = _TAX_FEE; ORIG_BURN_FEE = _BURN_FEE; ORIG_CHARITY_FEE = _CHARITY_FEE; _TAX_FEE = 0; _BURN_FEE = 0; _CHARITY_FEE = 0; } function restoreAllFee() private { _TAX_FEE = ORIG_TAX_FEE; _BURN_FEE = ORIG_BURN_FEE; _CHARITY_FEE = ORIG_CHARITY_FEE; } function _getTaxFee() private view returns(uint256) { return _TAX_FEE; } }
Contract ABI
[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"},{"type":"uint256","name":"_decimals","internalType":"uint256"},{"type":"uint256","name":"_supply","internalType":"uint256"},{"type":"uint256","name":"_txFee","internalType":"uint256"},{"type":"uint256","name":"_burnFee","internalType":"uint256"},{"type":"uint256","name":"_charityFee","internalType":"uint256"},{"type":"address","name":"_FeeAddress","internalType":"address"},{"type":"address","name":"tokenOwner","internalType":"address"},{"type":"address","name":"service","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"FeeAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_BURN_FEE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_CHARITY_FEE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_TAX_FEE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deliver","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcluded","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAsCharityAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalCharity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateFee","inputs":[{"type":"uint256","name":"_txFee","internalType":"uint256"},{"type":"uint256","name":"_burnFee","internalType":"uint256"},{"type":"uint256","name":"_charityFee","internalType":"uint256"}]}]
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637b7e8bac11610104578063b5862428116100a2578063f2cc0c1811610071578063f2cc0c18146103eb578063f2fde38b146103fe578063f84354f114610411578063fc061a4f14610424576101da565b8063b586242814610375578063cba0e9961461037e578063d608b3b2146103aa578063dd62ed3e146103b2576101da565b8063a457c2d7116100de578063a457c2d714610333578063a9059cbb14610346578063ae9dd5e014610359578063b2bdfa7b14610362576101da565b80637b7e8bac146102ef5780638da5cb5b1461031a57806395d89b411461032b576101da565b8063395093511161017c578063457bdf6c1161014b578063457bdf6c146102b857806370a08231146102cb578063715018a6146102de57806377ef7993146102e6576101da565b806339509351146102755780633bd5d173146102885780633c9f861d1461029d5780634549b039146102a5576101da565b806318160ddd116101b857806318160ddd1461023257806323b872dd1461023a5780632d8381191461024d578063313ce56714610260576101da565b806306fdde03146101df578063095ea7b3146101fd57806313114a9d14610220575b600080fd5b6101e7610437565b6040516101f49190611e66565b60405180910390f35b61021061020b366004611dc7565b6104c9565b60405190151581526020016101f4565b600f545b6040519081526020016101f4565b600d54610224565b610210610248366004611d8c565b6104e0565b61022461025b366004611df0565b610549565b60085460405160ff90911681526020016101f4565b610210610283366004611dc7565b6105d4565b61029b610296366004611df0565b61060a565b005b601054610224565b6102246102b3366004611e08565b6106f6565b61029b6102c6366004611d40565b610785565b6102246102d9366004611d40565b6107d1565b61029b610833565b61022460135481565b600954610302906001600160a01b031681565b6040516001600160a01b0390911681526020016101f4565b6000546001600160a01b0316610302565b6101e76108a7565b610210610341366004611dc7565b6108b6565b610210610354366004611dc7565b610905565b61022460145481565b600054610302906001600160a01b031681565b61022460125481565b61021061038c366004611d40565b6001600160a01b031660009081526004602052604090205460ff1690565b601154610224565b6102246103c0366004611d5a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61029b6103f9366004611d40565b610912565b61029b61040c366004611d40565b610a65565b61029b61041f366004611d40565b610b4f565b61029b610432366004611e3b565b610d3f565b60606006805461044690611f5c565b80601f016020809104026020016040519081016040528092919081815260200182805461047290611f5c565b80156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b5050505050905090565b60006104d6338484610dce565b5060015b92915050565b60006104ed848484610ef6565b61053f843361053a856040518060600160405280602a8152602001611ff0602a91396001600160a01b038a16600090815260036020908152604080832033845290915290205491906111fd565b610dce565b5060019392505050565b6000600e548211156105b55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b60006105bf611237565b90506105cb838261125a565b9150505b919050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916104d691859061053a90866112a3565b3360008181526004602052604090205460ff161561067f5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016105ac565b600061068a83611302565b5050506001600160a01b0386166000908152600160205260409020549394506106b893925084915050611386565b6001600160a01b038316600090815260016020526040902055600e546106de9082611386565b600e55600f546106ee90846112a3565b600f55505050565b6000600d5483111561074a5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016105ac565b8161076a57600061075a84611302565b509496506104da95505050505050565b600061077584611302565b509396506104da95505050505050565b6000546001600160a01b031633146107af5760405162461bcd60e51b81526004016105ac90611eb9565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526004602052604081205460ff161561081157506001600160a01b0381166000908152600260205260409020546105cf565b6001600160a01b0382166000908152600160205260409020546104da90610549565b6000546001600160a01b0316331461085d5760405162461bcd60e51b81526004016105ac90611eb9565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60606007805461044690611f5c565b60006104d6338461053a85604051806060016040528060278152602001611fc9602791393360009081526003602090815260408083206001600160a01b038d16845290915290205491906111fd565b60006104d6338484610ef6565b6000546001600160a01b0316331461093c5760405162461bcd60e51b81526004016105ac90611eb9565b6001600160a01b03811660009081526004602052604090205460ff16156109a55760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016105ac565b6001600160a01b038116600090815260016020526040902054156109ff576001600160a01b0381166000908152600160205260409020546109e590610549565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600460205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b6000546001600160a01b03163314610a8f5760405162461bcd60e51b81526004016105ac90611eb9565b6001600160a01b038116610af45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ac565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610b795760405162461bcd60e51b81526004016105ac90611eb9565b6001600160a01b03811660009081526004602052604090205460ff16610be15760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c75646564000000000060448201526064016105ac565b60005b600554811015610d3b57816001600160a01b031660058281548110610c1957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610d295760058054610c4490600190611f45565b81548110610c6257634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600580546001600160a01b039092169183908110610c9c57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600490925220805460ff191690556005805480610d0257634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610d3b565b80610d3381611f97565b915050610be4565b5050565b6000546001600160a01b03163314610d695760405162461bcd60e51b81526004016105ac90611eb9565b606483108015610d795750606482105b8015610d855750606481105b610d8e57600080fd5b610d99836064611f26565b601255610da7826064611f26565b601355610db5816064611f26565b6014819055601254601555601354601655601755505050565b6001600160a01b038316610e335760405162461bcd60e51b815260206004820152602660248201527f544f4b454e32303a20617070726f76652066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016105ac565b6001600160a01b038216610e955760405162461bcd60e51b8152602060048201526024808201527f544f4b454e32303a20617070726f766520746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ac565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610f5c5760405162461bcd60e51b815260206004820152602760248201527f544f4b454e32303a207472616e736665722066726f6d20746865207a65726f206044820152666164647265737360c81b60648201526084016105ac565b6001600160a01b038216610fc05760405162461bcd60e51b815260206004820152602560248201527f544f4b454e32303a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016105ac565b600081116110225760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016105ac565b6009546001906001600160a01b038581169116148061104e57506009546001600160a01b038481169116145b8061107157506001600160a01b03831660009081526004602052604090205460ff165b1561107a575060005b80611087576110876113c8565b6001600160a01b03841660009081526004602052604090205460ff1680156110c857506001600160a01b03831660009081526004602052604090205460ff16155b156110dd576110d8848484611411565b6111db565b6001600160a01b03841660009081526004602052604090205460ff1615801561111e57506001600160a01b03831660009081526004602052604090205460ff165b1561112e576110d88484846114d5565b6001600160a01b03841660009081526004602052604090205460ff1615801561117057506001600160a01b03831660009081526004602052604090205460ff16155b15611180576110d8848484611527565b6001600160a01b03841660009081526004602052604090205460ff1680156111c057506001600160a01b03831660009081526004602052604090205460ff165b156111d0576110d8848484611578565b6111db848484611527565b806111f7576111f7601554601255601654601355601754601455565b50505050565b600081848411156112215760405162461bcd60e51b81526004016105ac9190611e66565b50600061122e8486611f45565b95945050505050565b60008060006112446115cb565b9092509050611253828261125a565b9250505090565b600061129c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611788565b9392505050565b6000806112b08385611eee565b90508381101561129c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105ac565b6000806000806000806000806000806113238b6012546013546014546117b6565b92509250925060006113378c858585611835565b90506000611343611237565b90506000806113538f888561184d565b9150915060006113668383898988611877565b929e50919c509a5091985093965091945092505050919395979092949650565b600061129c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111fd565b6012541580156113d85750601354155b80156113e45750601454155b156113ee5761140f565b60128054601555601380546016556014805460175560009283905590829055555b565b600061141b611237565b9050600080600080600080600061143189611302565b9650965096509650965096509650600061145489846118b390919063ffffffff16565b90506114638c8c8c8b8b611932565b61146d828d6119d6565b61147a8682868686611ab7565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516114bf91815260200190565b60405180910390a3505050505050505050505050565b60006114df611237565b905060008060008060008060006114f589611302565b9650965096509650965096509650600061151889846118b390919063ffffffff16565b90506114638c8c878b8b611b52565b6000611531611237565b9050600080600080600080600061154789611302565b9650965096509650965096509650600061156a89846118b390919063ffffffff16565b90506114638c8c8a8a611bda565b6000611582611237565b9050600080600080600080600061159889611302565b965096509650965096509650965060006115bb89846118b390919063ffffffff16565b90506114638c8c8c8b898c611c4e565b600e54600d546000918291825b6005548110156117565782600160006005848154811061160857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611681575081600260006005848154811061165a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561169857600e54600d5494509450505050611784565b6116ec60016000600584815481106116c057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611386565b9250611742600260006005848154811061171657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611386565b91508061174e81611f97565b9150506115d8565b50600d54600e546117669161125a565b82101561177e57600e54600d54935093505050611784565b90925090505b9091565b600081836117a95760405162461bcd60e51b81526004016105ac9190611e66565b50600061122e8486611f06565b6000806000806117e060646117da600c546117da8b8d6118b390919063ffffffff16565b9061125a565b9050600061180260646117da600c546117da8b8e6118b390919063ffffffff16565b9050600061182460646117da600c546117da8b8f6118b390919063ffffffff16565b929a91995091975095505050505050565b600061122e8261184785818989611386565b90611386565b6000808061185b86856118b3565b9050600061186986866118b3565b919791965090945050505050565b60008061188485846118b3565b9050600061189285856118b3565b905060006118a68261184785818d8d611386565b9998505050505050505050565b6000826118c2575060006104da565b60006118ce8385611f26565b9050826118db8583611f06565b1461129c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016105ac565b6001600160a01b0385166000908152600260205260409020546119559084611386565b6001600160a01b0386166000908152600260209081526040808320939093556001905220546119849083611386565b6001600160a01b0380871660009081526001602052604080822093909355908616815220546119b390826112a3565b6001600160a01b0390941660009081526001602052604090209390935550505050565b60006119e0611237565b905060006119ee84836118b3565b6009546001600160a01b0316600090815260016020526040902054909150611a1690826112a3565b600980546001600160a01b039081166000908152600160209081526040808320959095559254909116815260029091522054611a5290856112a3565b600980546001600160a01b03908116600090815260026020908152604091829020949094559154915187815291811692908616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b611ad08461184787600e5461138690919063ffffffff16565b600e55600f54611ae090846112a3565b600f55601054611af090836112a3565b601055601154611b0090826112a3565b601155600d54611b109083611386565b600d5560405182815260009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b6001600160a01b038516600090815260016020526040902054611b759083611386565b6001600160a01b03808716600090815260016020908152604080832094909455918716815260029091522054611bab90846112a3565b6001600160a01b0385166000908152600260209081526040808320939093556001905220546119b390826112a3565b6001600160a01b038416600090815260016020526040902054611bfd9083611386565b6001600160a01b038086166000908152600160205260408082209390935590851681522054611c2c90826112a3565b6001600160a01b03909316600090815260016020526040902092909255505050565b6001600160a01b038616600090815260026020526040902054611c719085611386565b6001600160a01b038716600090815260026020908152604080832093909355600190522054611ca09084611386565b6001600160a01b03808816600090815260016020908152604080832094909455918816815260029091522054611cd690836112a3565b6001600160a01b038616600090815260026020908152604080832093909355600190522054611d0590826112a3565b6001600160a01b039095166000908152600160205260409020949094555050505050565b80356001600160a01b03811681146105cf57600080fd5b600060208284031215611d51578081fd5b61129c82611d29565b60008060408385031215611d6c578081fd5b611d7583611d29565b9150611d8360208401611d29565b90509250929050565b600080600060608486031215611da0578081fd5b611da984611d29565b9250611db760208501611d29565b9150604084013590509250925092565b60008060408385031215611dd9578182fd5b611de283611d29565b946020939093013593505050565b600060208284031215611e01578081fd5b5035919050565b60008060408385031215611e1a578182fd5b8235915060208301358015158114611e30578182fd5b809150509250929050565b600080600060608486031215611e4f578283fd5b505081359360208301359350604090920135919050565b6000602080835283518082850152825b81811015611e9257858101830151858201604001528201611e76565b81811115611ea35783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611f0157611f01611fb2565b500190565b600082611f2157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611f4057611f40611fb2565b500290565b600082821015611f5757611f57611fb2565b500390565b600281046001821680611f7057607f821691505b60208210811415611f9157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fab57611fab611fb2565b5060010190565b634e487b7160e01b600052601160045260246000fdfe544f4b454e32303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f544f4b454e32303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a264697066735822122013dc6a5ec76f15b737502438be35df52ea193ad6bdbb313d110a0bde11d50a4b64736f6c63430008020033