Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- MEGAToken
- Optimization enabled
- true
- Compiler version
- v0.8.18+commit.87f61d96
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2023-10-12T23:19:23.397064Z
Constructor Arguments
0x000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d900000000000000000000000002dcdd04e3f455d838cd1249292c58f3b79e3c3c
Arg [0] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
Arg [1] (address) : 0x02dcdd04e3f455d838cd1249292c58f3b79e3c3c
Contract source code
/**
* Make Ethereum Great Again
*
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
* ░███╗░░░███╗███████╗░██████╗░░█████╗░░
* ░████╗░████║██╔════╝██╔════╝░██╔══██╗░
* ░██╔████╔██║█████╗░░██║░░███╗███████║░
* ░██║╚██╔╝██║██╔══╝░░██║░░░██║██╔══██║░
* ░██║░╚═╝░██║███████╗╚██████╔╝██║░░██║░
* ░╚═╝░░░░░╚═╝╚══════╝░╚═════╝░╚═╝░░╚═╝░
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*
* Telegram: https://t.me/PLSMEGA
* Website: https://makeethgreatagain.io/
* Twitter: https://twitter.com/plsmega89815
*
* SPDX-License-Identifier: MIT
*/
pragma solidity =0.8.18;
/**
* Tokenomics:
*
* Burn 1%
* Reflection 2%
*
* Total Supply 888,888,888,888,888
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {return msg.sender;}
function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;}
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked { require(b <= a, errorMessage); return a - b; }
}
}
library Address {
function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0;}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {return functionCallWithValue(target, data, 0, errorMessage);}
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");}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) { return returndata; } else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {revert(errorMessage);}
}
}
}
abstract contract Manageable is Context {
address private _manager;
event ManagementTransferred(address indexed previousManager, address indexed newManager);
constructor(){
address msgSender = _msgSender();
_manager = msgSender;
emit ManagementTransferred(address(0), msgSender);
}
function manager() public view returns(address){ return _manager; }
modifier onlyManager(){
require(_manager == _msgSender(), "Manageable: caller is not the manager");
_;
}
function transferManagement(address newManager) external virtual onlyManager {
emit ManagementTransferred(_manager, newManager);
_manager = newManager;
}
}
interface IPulseXFactory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IPulseXRouter {
function factory() external pure returns (address);
}
abstract contract Tokenomics is Manageable {
using SafeMath for uint256;
// --------------------- Token Settings ------------------- //
string internal constant NAME = "Make Ethereum Great Again";
string internal constant SYMBOL = "MEGA";
uint16 internal constant FEES_DIVISOR = 10**3;
uint8 internal constant DECIMALS = 6;
uint256 internal constant ZEROES = 10**DECIMALS;
uint256 private constant MAX = ~uint256(0);
uint256 internal constant TOTAL_SUPPLY = 888_888_888_888_888 * ZEROES;
uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));
uint256 internal maxTransactionAmount = TOTAL_SUPPLY / 100; // 1% of the total supply
uint256 internal maxWalletBalance = TOTAL_SUPPLY / 50; // 2% of the total supply
uint256 internal constant numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000; // 0.1% of the total supply
enum FeeType { Burn, Reflection }
struct Fee {
FeeType name;
uint256 value;
address recipient;
uint256 total;
}
Fee[] internal fees;
uint256 internal sumOfFees;
constructor() {
_addFees();
}
function _addFee(FeeType name, uint256 value, address recipient) private {
fees.push( Fee(name, value, recipient, 0 ) );
sumOfFees += value;
}
function _addFees() private {
_addFee(FeeType.Reflection, 20, address(this) );
_addFee(FeeType.Burn, 10, address(0) );
}
function _getFeesCount() internal view returns (uint256){ return fees.length; }
function _getFeeStruct(uint256 index) private view returns(Fee storage){
require( index >= 0 && index < fees.length, "FeesSettings._getFeeStruct: Fee index out of bounds");
return fees[index];
}
function _getFee(uint256 index) internal view returns (FeeType, uint256, address, uint256){
Fee memory fee = _getFeeStruct(index);
return ( fee.name, fee.value, fee.recipient, fee.total );
}
function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
Fee storage fee = _getFeeStruct(index);
fee.total = fee.total.add(amount);
}
function getCollectedFeeTotal(uint256 index) external view returns (uint256){
Fee memory fee = _getFeeStruct(index);
return fee.total;
}
function removeWalletLimits() external onlyManager() {
maxTransactionAmount = TOTAL_SUPPLY;
maxWalletBalance = 0; // Unlimited Max
}
}
abstract contract Reflector is IERC20, IERC20Metadata, Manageable, Tokenomics {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) internal _reflectedBalances;
mapping (address => uint256) internal _balances;
mapping (address => mapping (address => uint256)) internal _allowances;
mapping (address => bool) internal _isExcludedFromFee;
mapping (address => bool) internal _isExcludedFromRewards;
address[] private _excluded;
constructor(){
_reflectedBalances[manager()] = _reflectedSupply;
// exclude owner and this contract from fee
_isExcludedFromFee[manager()] = true;
_isExcludedFromFee[address(this)] = true;
// exclude the owner and this contract from rewards
_exclude(manager());
_exclude(address(this));
emit Transfer(address(0), manager(), TOTAL_SUPPLY);
}
/** Functions required by IERC20Metadat **/
function name() external pure override returns (string memory) { return NAME; }
function symbol() external pure override returns (string memory) { return SYMBOL; }
function decimals() external pure override returns (uint8) { return DECIMALS; }
/** Functions required by IERC20Metadat - END **/
/** Functions required by IERC20 **/
function totalSupply() external pure override returns (uint256) {
return TOTAL_SUPPLY;
}
function balanceOf(address account) public view override returns (uint256){
if (_isExcludedFromRewards[account]) return _balances[account];
return tokenFromReflection(_reflectedBalances[account]);
}
function transfer(address recipient, uint256 amount) external override returns (bool){
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) external view override returns (uint256){
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/** Functions required by IERC20 - END **/
/**
* @dev this is really a "soft" burn (total supply is not reduced). RFI holders
* get two benefits from burning tokens:
*
* 1) Tokens in the burn address increase the % of tokens held by holders not
* excluded from rewards (assuming the burn address is excluded)
* 2) Tokens in the burn address cannot be sold (which in turn draing the
* liquidity pool)
*
*
* In RFI holders already get % of each transaction so the value of their tokens
* increases (in a way). Therefore there is really no need to do a "hard" burn
* (reduce the total supply). What matters (in RFI) is to make sure that a large
* amount of tokens cannot be sold = draining the liquidity pool = lowering the
* value of tokens holders own. For this purpose, transfering tokens to a (vanity)
* burn address is the most appropriate way to "burn".
*
* There is an extra check placed into the `transfer` function to make sure the
* burn address cannot withdraw the tokens is has (although the chance of someone
* having/finding the private key is virtually zero).
*/
function burn(uint256 amount) external {
address sender = _msgSender();
require(sender != address(0), "Reflector: burn from the zero address");
uint256 balance = balanceOf(sender);
require(balance >= amount, "Reflector: burn amount exceeds balance");
uint256 reflectedAmount = amount.mul(_getCurrentRate());
// remove the amount from the sender's balance first
_reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount);
if (_isExcludedFromRewards[sender])
_balances[sender] = _balances[sender].sub(amount);
_burnTokens( sender, amount, reflectedAmount );
}
/**
* @dev "Soft" burns the specified amount of tokens by sending them
* to the burn address
*/
function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal {
/**
* @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
* tokens to the burn address (which should be excluded from rewards) is sufficient
* in RFI
*/
_reflectedBalances[address(0)] = _reflectedBalances[address(0)].add(rBurn);
if (_isExcludedFromRewards[address(0)])
_balances[address(0)] = _balances[address(0)].add(tBurn);
/**
* @dev Emit the event so that the burn address balance is updated (on bscscan)
*/
emit Transfer(sender, address(0), tBurn);
}
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, "ERC20: decreased allowance below zero"));
return true;
}
function isExcludedFromReward(address account) external view returns (bool) {
return _isExcludedFromRewards[account];
}
/**
* @dev Calculates and returns the reflected amount for the given amount with or without
* the transfer fees (deductTransferFee true/false)
*/
function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
if (!deductTransferFee) {
(uint256 rAmount,,,,) = _getValues(tAmount,0);
return rAmount;
} else {
(,uint256 rTransferAmount,,,) = _getValues(tAmount,_getSumOfFees(_msgSender(), tAmount));
return rTransferAmount;
}
}
/**
* @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
*/
function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
require(rAmount <= _reflectedSupply, "Amount must be less than total reflections");
uint256 currentRate = _getCurrentRate();
return rAmount.div(currentRate);
}
function excludeFromReward(address account) external onlyManager() {
require(!_isExcludedFromRewards[account], "Account is not included");
_exclude(account);
}
function _exclude(address account) internal {
if(_reflectedBalances[account] > 0) {
_balances[account] = tokenFromReflection(_reflectedBalances[account]);
}
_isExcludedFromRewards[account] = true;
_excluded.push(account);
}
function includeInReward(address account) external onlyManager() {
require(_isExcludedFromRewards[account], "Account is not excluded");
for (uint256 i = 0; i < _excluded.length; i++) {
if (_excluded[i] == account) {
_excluded[i] = _excluded[_excluded.length - 1];
_balances[account] = 0;
_isExcludedFromRewards[account] = false;
_excluded.pop();
break;
}
}
}
function setExcludedFromFee(address account, bool value) external onlyManager { _isExcludedFromFee[account] = value; }
function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; }
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "Reflector: approve from the zero address");
require(spender != address(0), "Reflector: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
*/
function _isUnlimitedSender(address account) internal view returns(bool){
// the owner should be the only whitelisted sender
return (account == manager());
}
/**
*/
function _isUnlimitedRecipient(address account) internal view returns(bool){
// the owner should be a white-listed recipient
// and anyone should be able to burn as many tokens as
// he/she wants
return (account == manager() || account == address(0));
}
function _transfer(address sender, address recipient, uint256 amount) private {
require(sender != address(0), "Reflector: transfer from the zero address");
require(recipient != address(0), "Reflector: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
// indicates whether or not feee should be deducted from the transfer
bool takeFee = true;
/**
* Check the amount is within the max allowed limit as long as a
* unlimited sender/recepient is not involved in the transaction
*/
if ( amount > maxTransactionAmount && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) ){
revert("Transfer amount exceeds the maxTxAmount.");
}
/**
* The pair needs to excluded from the max wallet balance check;
* selling tokens is sending them back to the pair (without this
* check, selling tokens would not work if the pair's balance
* was over the allowed max)
*
* Note: This does NOT take into account the fees which will be deducted
* from the amount. As such it could be a bit confusing
*/
if ( maxWalletBalance > 0 && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) && !_isV2Pair(recipient) ){
uint256 recipientBalance = balanceOf(recipient);
require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance");
}
// if any account belongs to _isExcludedFromFee account then remove the fee
if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ takeFee = false; }
_beforeTokenTransfer(sender, recipient, amount, takeFee);
_transferTokens(sender, recipient, amount, takeFee);
_afterTokenTransfer(sender, recipient, amount);
}
function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private {
/**
* We don't need to know anything about the individual fees here
* All that is required for the transfer is the sum of all fees
* to calculate the % of the total transaction amount which should
* be transferred to the recipient.
*
* The `_takeFees` call will/should take care of the individual fees
*/
uint256 sumOfFees = _getSumOfFees(sender, amount);
if ( !takeFee ){ sumOfFees = 0; }
(uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees);
/**
* Sender's and Recipient's reflected balances must be always updated regardless of
* whether they are excluded from rewards or not.
*/
_reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
_reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount);
/**
* Update the true/nominal balances for excluded accounts
*/
if (_isExcludedFromRewards[sender]){ _balances[sender] = _balances[sender].sub(tAmount); }
if (_isExcludedFromRewards[recipient] ){ _balances[recipient] = _balances[recipient].add(tTransferAmount); }
_takeFees( amount, currentRate, sumOfFees );
emit Transfer(sender, recipient, tTransferAmount);
}
function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees ) private {
if ( sumOfFees > 0 ){
_takeTransactionFees(amount, currentRate);
}
}
function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) {
uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
uint256 tTransferAmount = tAmount.sub(tTotalFees);
uint256 currentRate = _getCurrentRate();
uint256 rAmount = tAmount.mul(currentRate);
uint256 rTotalFees = tTotalFees.mul(currentRate);
uint256 rTransferAmount = rAmount.sub(rTotalFees);
return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate);
}
function _getCurrentRate() internal view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply.div(tSupply);
}
function _getCurrentSupply() internal view returns(uint256, uint256) {
uint256 rSupply = _reflectedSupply;
uint256 tSupply = TOTAL_SUPPLY;
/**
* The code below removes balances of addresses excluded from rewards from
* rSupply and tSupply, which effectively increases the % of transaction fees
* delivered to non-excluded holders
*/
for (uint256 i = 0; i < _excluded.length; i++) {
if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, TOTAL_SUPPLY);
rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
tSupply = tSupply.sub(_balances[_excluded[i]]);
}
if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY)) return (_reflectedSupply, TOTAL_SUPPLY);
return (rSupply, tSupply);
}
/**
* @dev Hook that is called before any transfer of tokens.
*/
function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal virtual;
/**
* @dev Hook that is called after any transfer of tokens.
*/
function _afterTokenTransfer(address sender, address recipient, uint256 amount) internal virtual;
/**
* @dev Returns the total sum of fees to be processed in each transaction.
*
* To separate concerns this contract (class) will take care of ONLY handling RFI, i.e.
* changing the rates and updating the holder's balance (via `_redistribute`).
* It is the responsibility of the dev/user to handle all other fees and taxes
* in the appropriate contracts (classes).
*/
function _getSumOfFees(address sender, uint256 amount) internal view virtual returns (uint256);
/**
* @dev A delegate which should return true if the given address is the V2 Pair and false otherwise
*/
function _isV2Pair(address account) internal view virtual returns(bool);
/**
* @dev Redistributes the specified amount among the current holders via the reflect.finance
* algorithm, i.e. by updating the _reflectedSupply (_rSupply) which ultimately adjusts the
* current rate used by `tokenFromReflection` and, in turn, the value returns from `balanceOf`.
* This is the bit of clever math which allows rfi to redistribute the fee without
* having to iterate through all holders.
*
* Visit our discord at https://discord.gg/dAmr6eUTpM
*/
function _redistribute(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) internal {
uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
uint256 rFee = tFee.mul(currentRate);
_reflectedSupply = _reflectedSupply.sub(rFee);
_addFeeCollectedAmount(index, tFee);
}
/**
* @dev Hook that is called before the `Transfer` event is emitted if fees are enabled for the transfer
*/
function _takeTransactionFees(uint256 amount, uint256 currentRate) internal virtual;
}
abstract contract MEVProtection is Manageable {
using SafeMath for uint256;
// This is a map of addresses to times and is triggered on every transfer.
mapping(address => uint32) internal _transferTime;
// Some addresses should never have a time restriction, such as exchange addresses. Those can be added here.
mapping(address => bool) internal _transferTimeWhitelist;
address[] private _whitelisted;
bool private MEVProtectionEnabled = true;
event MEVProtectionEnabledUpdated(bool enabled);
/**
* @dev Sends the swap and liquify flag to the provided value. If set to `false` tokens collected in the contract will
* NOT be converted into liquidity.
*/
function setMEVProtectionEnabled(bool enabled) external onlyManager {
MEVProtectionEnabled = enabled;
emit MEVProtectionEnabledUpdated(MEVProtectionEnabled);
}
function _checkMEV(address sender) internal view {
// If the sender address is not in the restriction whitelist, verify it is not transferring/selling in the same block.
// If it is, prevent the transfer.
if (MEVProtectionEnabled && _transferTimeWhitelist[sender] != true) {
// Alter the # of seconds according to the chain specifics.
require(_transferTime[sender] != uint32(block.timestamp), "Please wait 1 block (~10-15 seconds) before transferring or selling your tokens.");
}
}
function _trackMEV(address recipient) internal {
// If the to address is not in the restriction whitelist, track the time of buy/receipt.
if (_transferTimeWhitelist[recipient] != true) {
_transferTime[recipient] = uint32(block.timestamp);
}
}
function isExcludedFromMEV(address account) external view returns (bool) {
return _transferTimeWhitelist[account];
}
/**
* Pass in an address to add it to the time restriction whitelist.
*/
function excludeFromMEV(address account) external onlyManager() {
require(!_transferTimeWhitelist[account], "Account is not included");
_whitelist(account);
}
function _whitelist(address account) internal {
_transferTimeWhitelist[account] = true;
_whitelisted.push(account);
}
/**
* Pass in an address to remove it from the time restriction whitelist.
*/
function includeInMEV(address account) external onlyManager() {
require(_transferTimeWhitelist[account], "Account is not excluded");
for (uint256 i = 0; i < _whitelisted.length; i++) {
if (_whitelisted[i] == account) {
_whitelisted[i] = _whitelisted[_whitelisted.length - 1];
_transferTimeWhitelist[account] = false;
_whitelisted.pop();
break;
}
}
}
}
contract MEGAToken is Reflector, MEVProtection {
using SafeMath for uint256;
address _pair;
constructor(address router, address weth){
_pair = IPulseXFactory(IPulseXRouter(router).factory()).createPair(address(this), weth);
// exclude the pair address from rewards - we don't want to redistribute
// tx fees to these two; redistribution is only for holders, dah!
_exclude(_pair);
_exclude(address(0));
//add router and pair to MEV whitelist
_whitelist(address(router));
_whitelist(_pair);
}
function _isV2Pair(address account) internal view override returns(bool){
return (account == _pair);
}
function _getSumOfFees(address, uint256) internal view override returns (uint256){
return sumOfFees;
}
function _beforeTokenTransfer(address sender, address, uint256, bool) internal view override {
_checkMEV(sender);
}
function _afterTokenTransfer(address, address recipient, uint256) internal override {
_trackMEV(recipient);
}
function _takeTransactionFees(uint256 amount, uint256 currentRate) internal override {
uint256 feesCount = _getFeesCount();
for (uint256 index = 0; index < feesCount; index++ ){
(FeeType name, uint256 value,,) = _getFee(index);
// no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1)
if ( value == 0 ) continue;
if ( name == FeeType.Reflection ){
_redistribute( amount, currentRate, value, index );
}
else if ( name == FeeType.Burn ){
_burn( amount, currentRate, value, index );
}
}
}
function _burn(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) private {
uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
uint256 rBurn = tBurn.mul(currentRate);
_burnTokens(address(this), tBurn, rBurn);
_addFeeCollectedAmount(index, tBurn);
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"weth","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":"MEVProtectionEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"ManagementTransferred","inputs":[{"type":"address","name":"previousManager","internalType":"address","indexed":true},{"type":"address","name":"newManager","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":"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":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","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":"excludeFromMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCollectedFeeTotal","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","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":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","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":"removeWalletLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMEVProtectionEnabled","inputs":[{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"pure","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":"transferManagement","inputs":[{"type":"address","name":"newManager","internalType":"address"}]}]
Contract Creation Code
0x6080604052620000126006600a62000a49565b62000025906603287092778e3862000a5a565b620000339060001962000a8a565b620000419060001962000aa1565b6001556064620000546006600a62000a49565b62000067906603287092778e3862000a5a565b62000073919062000ab7565b6002556032620000866006600a62000a49565b62000099906603287092778e3862000a5a565b620000a5919062000ab7565b600355600f805460ff19166001179055348015620000c257600080fd5b5060405162002e2438038062002e24833981016040819052620000e59162000aeb565b600080546001600160a01b031916339081178255604051909182917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a3506200013062000427565b600154600660006200014a6000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160096000620001846200044760201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526009909252902080549091166001179055620001e1620001db6000546001600160a01b031690565b62000456565b620001ec3062000456565b600080546001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620002296006600a62000a49565b6200023c906603287092778e3862000a5a565b60405190815260200160405180910390a3816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b2919062000b23565b6040516364e329cb60e11b81523060048201526001600160a01b038381166024830152919091169063c9c65396906044016020604051808303816000875af115801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000b23565b600f8054610100600160a81b0319166101006001600160a01b03938416810291909117918290556200035e9291041662000456565b6200036a600062000456565b620003c4826001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e8054918201815590915260008051602062002e048339815191520180546001600160a01b0319169091179055565b600f5461010090046001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e8054918201815590915260008051602062002e048339815191520180546001600160a01b0319169091179055505062000b9f565b62000436600160143062000519565b620004456000600a8162000519565b565b6000546001600160a01b031690565b6001600160a01b03811660009081526006602052604090205415620004b3576001600160a01b0381166000908152600660205260409020546200049990620005fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b600460405180608001604052808560018111156200053b576200053b62000b41565b815260208082018690526001600160a01b03851660408301526000606090920182905283546001818101865594835291208251600490920201805492939092839160ff1990911690838181111562000597576200059762000b41565b02179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015550508160056000828254620005f3919062000b57565b9091555050505050565b6000600154821115620006695760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840160405180910390fd5b60006200067562000698565b9050620006918184620006cb60201b62000ee61790919060201c565b9392505050565b60008080620006a6620006e2565b91509150620006c48183620006cb60201b62000ee61790919060201c565b9250505090565b6000620006d9828462000ab7565b90505b92915050565b600154600090819081620006f96006600a62000a49565b6200070c906603287092778e3862000a5a565b905060005b600b54811015620008a2578260066000600b848154811062000737576200073762000b6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620007a657508160076000600b84815481106200077f576200077f62000b6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620007db57600154620007bd6006600a62000a49565b620007d0906603287092778e3862000a5a565b945094505050509091565b6200083260066000600b8481548110620007f957620007f962000b6d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054859162000ef962000928821b17901c565b92506200088b60076000600b848154811062000852576200085262000b6d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054849162000ef962000928821b17901c565b915080620008998162000b83565b91505062000711565b50801580620008eb5750620008e8620008be6006600a62000a49565b620008d1906603287092778e3862000a5a565b600154620006cb60201b62000ee61790919060201c565b82105b156200091f57600154620009026006600a62000a49565b62000915906603287092778e3862000a5a565b9350935050509091565b90939092509050565b6000620006d9828462000aa1565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200098d57816000190482111562000971576200097162000936565b808516156200097f57918102915b93841c939080029062000951565b509250929050565b600082620009a657506001620006dc565b81620009b557506000620006dc565b8160018114620009ce5760028114620009d957620009f9565b6001915050620006dc565b60ff841115620009ed57620009ed62000936565b50506001821b620006dc565b5060208310610133831016604e8410600b841016171562000a1e575081810a620006dc565b62000a2a83836200094c565b806000190482111562000a415762000a4162000936565b029392505050565b6000620006d960ff84168362000995565b8082028115828204841417620006dc57620006dc62000936565b634e487b7160e01b600052601260045260246000fd5b60008262000a9c5762000a9c62000a74565b500690565b81810381811115620006dc57620006dc62000936565b60008262000ac95762000ac962000a74565b500490565b80516001600160a01b038116811462000ae657600080fd5b919050565b6000806040838503121562000aff57600080fd5b62000b0a8362000ace565b915062000b1a6020840162000ace565b90509250929050565b60006020828403121562000b3657600080fd5b620006d98262000ace565b634e487b7160e01b600052602160045260246000fd5b80820180821115620006dc57620006dc62000936565b634e487b7160e01b600052603260045260246000fd5b60006001820162000b985762000b9862000936565b5060010190565b6122558062000baf6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063481c6a75116100de5780638d11551e11610097578063a9059cbb11610071578063a9059cbb146103d3578063bdc4b790146103e6578063dd62ed3e146103f9578063e4edf8521461043257600080fd5b80638d11551e1461038d57806395d89b41146103a0578063a457c2d7146103c057600080fd5b8063481c6a75146102e157806352390c02146102fc5780635342acb41461030f5780636612e66f1461033b57806370a082311461034e57806388f820201461036157600080fd5b806327b1369f1161014b578063395093511161012557806339509351146102a0578063398df196146102b357806342966c68146102bb5780634549b039146102ce57600080fd5b806327b1369f14610252578063313ce5671461027e5780633685d4191461028d57600080fd5b806306fdde0314610193578063095ea7b3146101de57806318160ddd146102015780631826e62a1461021757806322ff5df21461022c57806323b872dd1461023f575b600080fd5b60408051808201909152601981527f4d616b6520457468657265756d20477265617420416761696e0000000000000060208201525b6040516101d59190611e1b565b60405180910390f35b6101f16101ec366004611e85565b610445565b60405190151581526020016101d5565b61020961045c565b6040519081526020016101d5565b61022a610225366004611ebf565b610480565b005b61022a61023a366004611eda565b610500565b6101f161024d366004611ef5565b6105fa565b6101f1610260366004611eda565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051600681526020016101d5565b61022a61029b366004611eda565b610663565b6101f16102ae366004611e85565b610813565b61022a610849565b61022a6102c9366004611f31565b61089a565b6102096102dc366004611f4a565b610a17565b6000546040516001600160a01b0390911681526020016101d5565b61022a61030a366004611eda565b610ac7565b6101f161031d366004611eda565b6001600160a01b031660009081526009602052604090205460ff1690565b61022a610349366004611f76565b610b5d565b61020961035c366004611eda565b610bb2565b6101f161036f366004611eda565b6001600160a01b03166000908152600a602052604090205460ff1690565b61020961039b366004611f31565b610c11565b6040805180820190915260048152634d45474160e01b60208201526101c8565b6101f16103ce366004611e85565b610c88565b6101f16103e1366004611e85565b610cd7565b61022a6103f4366004611eda565b610ce4565b610209610407366004611fa0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61022a610440366004611eda565b610e61565b6000610452338484610f05565b5060015b92915050565b600061046a6006600a6120c4565b61047b906603287092778e386120d3565b905090565b6000546001600160a01b031633146104b35760405162461bcd60e51b81526004016104aa906120ea565b60405180910390fd5b600f805460ff191682151590811790915560405160ff909116151581527f93fe086589e2785f1c3891e1c046851acf9de9434fd52b9295e17c279bad87b79060200160405180910390a150565b6000546001600160a01b0316331461052a5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff161561058d5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f7816001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b50565b6000610607848484611033565b6106598433610654856040518060600160405280602881526020016121d3602891396001600160a01b038a1660009081526008602090815260408083203384529091529020549190611337565b610f05565b5060019392505050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff166106ef5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600b5481101561080f57816001600160a01b0316600b82815481106107195761071961212f565b6000918252602090912001546001600160a01b0316036107fd57600b805461074390600190612145565b815481106107535761075361212f565b600091825260209091200154600b80546001600160a01b03909216918390811061077f5761077f61212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600a90925220805460ff19169055600b8054806107d7576107d7612158565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108078161216e565b9150506106f2565b5050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916104529185906106549086611363565b6000546001600160a01b031633146108735760405162461bcd60e51b81526004016104aa906120ea565b61087f6006600a6120c4565b610890906603287092778e386120d3565b6002556000600355565b33806108f65760405162461bcd60e51b815260206004820152602560248201527f5265666c6563746f723a206275726e2066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104aa565b600061090182610bb2565b9050828110156109625760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a206275726e20616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104aa565b600061097661096f61136f565b8590611392565b6001600160a01b03841660009081526006602052604090205490915061099c9082610ef9565b6001600160a01b038416600090815260066020908152604080832093909355600a9052205460ff1615610a06576001600160a01b0383166000908152600760205260409020546109ec9085610ef9565b6001600160a01b0384166000908152600760205260409020555b610a1183858361139e565b50505050565b6000610a256006600a6120c4565b610a36906603287092778e386120d3565b831115610a855760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016104aa565b81610aa5576000610a978460006114c7565b509294506104569350505050565b6000610ab984610ab460055490565b6114c7565b509194506104569350505050565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff1615610b545760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f78161153d565b6000546001600160a01b03163314610b875760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600a602052604081205460ff1615610bef57506001600160a01b031660009081526007602052604090205490565b6001600160a01b038216600090815260066020526040902054610456906115fd565b600080610c1d8361167a565b60408051608081019091528154909190829060ff166001811115610c4357610c43612187565b6001811115610c5457610c54612187565b81526001820154602082015260028201546001600160a01b0316604082015260039091015460609182015201519392505050565b60006104523384610654856040518060600160405280602581526020016121fb602591393360009081526008602090815260408083206001600160a01b038d1684529091529020549190611337565b6000610452338484611033565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff16610d705760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600e5481101561080f57816001600160a01b0316600e8281548110610d9a57610d9a61212f565b6000918252602090912001546001600160a01b031603610e4f57600e8054610dc490600190612145565b81548110610dd457610dd461212f565b600091825260209091200154600e80546001600160a01b039092169183908110610e0057610e0061212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600d90915260409020805460ff19169055600e8054806107d7576107d7612158565b80610e598161216e565b915050610d73565b6000546001600160a01b03163314610e8b5760405162461bcd60e51b81526004016104aa906120ea565b600080546040516001600160a01b03808516939216917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ef2828461219d565b9392505050565b6000610ef28284612145565b6001600160a01b038316610f6c5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f723a20617070726f76652066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016104aa565b6001600160a01b038216610fd15760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a20617070726f766520746f20746865207a65726f206160448201526564647265737360d01b60648201526084016104aa565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661109b5760405162461bcd60e51b815260206004820152602960248201527f5265666c6563746f723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016104aa565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602760248201527f5265666c6563746f723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016104aa565b600081116111635760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016104aa565b6002546001908211801561118557506000546001600160a01b03858116911614155b8015611197575061119583611711565b155b156111f55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016104aa565b600060035411801561121557506000546001600160a01b03858116911614155b8015611227575061122583611711565b155b80156112465750600f546001600160a01b038481166101009092041614155b156112cc57600061125684610bb2565b60035490915061126684836121bf565b11156112ca5760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016104aa565b505b6001600160a01b03841660009081526009602052604090205460ff168061130b57506001600160a01b03831660009081526009602052604090205460ff165b15611314575060005b61132084848484611737565b61132c84848484611740565b610a118484846118fa565b6000818484111561135b5760405162461bcd60e51b81526004016104aa9190611e1b565b505050900390565b6000610ef282846121bf565b600080600061137c611908565b909250905061138b8282610ee6565b9250505090565b6000610ef282846120d3565b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8546113d39082611363565b600080527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35460ff1615611489576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5461145d9083611363565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df555b6040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611026565b600080808080806114e46103e86114de8a8a611392565b90610ee6565b905060006114f28983610ef9565b905060006114fe61136f565b9050600061150c8b83611392565b9050600061151a8584611392565b905060006115288383610ef9565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526006602052604090205415611597576001600160a01b03811660009081526006602052604090205461157d906115fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b60006001548211156116645760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016104aa565b600061166e61136f565b9050610ef28382610ee6565b600060045482106116e95760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016104aa565b600482815481106116fc576116fc61212f565b90600052602060002090600402019050919050565b600080546001600160a01b03838116911614806104565750506001600160a01b03161590565b610a1184611aff565b600061174b60055490565b905081611756575060005b600080600080600061176888876114c7565b6001600160a01b038f16600090815260066020526040902054949950929750909550935091506117989086610ef9565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546117c79085611363565b6001600160a01b03808b16600090815260066020908152604080832094909455918d168152600a909152205460ff1615611838576001600160a01b038a1660009081526007602052604090205461181e9084610ef9565b6001600160a01b038b166000908152600760205260409020555b6001600160a01b0389166000908152600a602052604090205460ff1615611896576001600160a01b03891660009081526007602052604090205461187c9083611363565b6001600160a01b038a166000908152600760205260409020555b6118a1888288611be3565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e691815260200190565b60405180910390a350505050505050505050565b61190382611bf3565b505050565b60015460009081908161191d6006600a6120c4565b61192e906603287092778e386120d3565b905060005b600b54811015611a92578260066000600b84815481106119555761195561212f565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806119c057508160076000600b84815481106119995761199961212f565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156119f0576001546119d46006600a6120c4565b6119e5906603287092778e386120d3565b945094505050509091565b611a3660066000600b8481548110611a0a57611a0a61212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610ef9565b9250611a7e60076000600b8481548110611a5257611a5261212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610ef9565b915080611a8a8161216e565b915050611933565b50801580611ac75750611ac4611aaa6006600a6120c4565b611abb906603287092778e386120d3565b60015490610ee6565b82105b15611af657600154611adb6006600a6120c4565b611aec906603287092778e386120d3565b9350935050509091565b90939092509050565b600f5460ff168015611b2f57506001600160a01b0381166000908152600d602052604090205460ff161515600114155b156105f7576001600160a01b0381166000908152600c602052604090205463ffffffff4281169116036105f75760405162461bcd60e51b815260206004820152605060248201527f506c656173652077616974203120626c6f636b20287e31302d3135207365636f60448201527f6e647329206265666f7265207472616e7366657272696e67206f722073656c6c60648201526f34b733903cb7bab9103a37b5b2b7399760811b608482015260a4016104aa565b8015611903576119038383611c44565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146105f7576001600160a01b03166000908152600c60205260409020805463ffffffff19164263ffffffff16179055565b6000611c4f60045490565b905060005b81811015610a1157600080611c6883611ce1565b50509150915080600003611c7d575050611ccf565b6001826001811115611c9157611c91612187565b03611ca757611ca286868386611d7c565b611ccc565b6000826001811115611cbb57611cbb612187565b03611ccc57611ccc86868386611dc1565b50505b80611cd98161216e565b915050611c54565b6000806000806000611cf28661167a565b60408051608081019091528154909190829060ff166001811115611d1857611d18612187565b6001811115611d2957611d29612187565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b6000611d8e6103e86114de8786611392565b90506000611d9c8286611392565b600154909150611dac9082610ef9565b600155611db98383611df4565b505050505050565b6000611dd36103e86114de8786611392565b90506000611de18286611392565b9050611dee30838361139e565b611db983835b6000611dff8361167a565b6003810154909150611e119083611363565b6003909101555050565b600060208083528351808285015260005b81811015611e4857858101830151858201604001528201611e2c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611e8057600080fd5b919050565b60008060408385031215611e9857600080fd5b611ea183611e69565b946020939093013593505050565b80358015158114611e8057600080fd5b600060208284031215611ed157600080fd5b610ef282611eaf565b600060208284031215611eec57600080fd5b610ef282611e69565b600080600060608486031215611f0a57600080fd5b611f1384611e69565b9250611f2160208501611e69565b9150604084013590509250925092565b600060208284031215611f4357600080fd5b5035919050565b60008060408385031215611f5d57600080fd5b82359150611f6d60208401611eaf565b90509250929050565b60008060408385031215611f8957600080fd5b611f9283611e69565b9150611f6d60208401611eaf565b60008060408385031215611fb357600080fd5b611fbc83611e69565b9150611f6d60208401611e69565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561201b57816000190482111561200157612001611fca565b8085161561200e57918102915b93841c9390800290611fe5565b509250929050565b60008261203257506001610456565b8161203f57506000610456565b8160018114612055576002811461205f5761207b565b6001915050610456565b60ff84111561207057612070611fca565b50506001821b610456565b5060208310610133831016604e8410600b841016171561209e575081810a610456565b6120a88383611fe0565b80600019048211156120bc576120bc611fca565b029392505050565b6000610ef260ff841683612023565b808202811582820484141761045657610456611fca565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561045657610456611fca565b634e487b7160e01b600052603160045260246000fd5b60006001820161218057612180611fca565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6000826121ba57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561045657610456611fca56fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122087515c0d7db8a5d085c4a4df9327701fada493662a8baba5965581944d9b1ccb64736f6c63430008120033bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d900000000000000000000000002dcdd04e3f455d838cd1249292c58f3b79e3c3c
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063481c6a75116100de5780638d11551e11610097578063a9059cbb11610071578063a9059cbb146103d3578063bdc4b790146103e6578063dd62ed3e146103f9578063e4edf8521461043257600080fd5b80638d11551e1461038d57806395d89b41146103a0578063a457c2d7146103c057600080fd5b8063481c6a75146102e157806352390c02146102fc5780635342acb41461030f5780636612e66f1461033b57806370a082311461034e57806388f820201461036157600080fd5b806327b1369f1161014b578063395093511161012557806339509351146102a0578063398df196146102b357806342966c68146102bb5780634549b039146102ce57600080fd5b806327b1369f14610252578063313ce5671461027e5780633685d4191461028d57600080fd5b806306fdde0314610193578063095ea7b3146101de57806318160ddd146102015780631826e62a1461021757806322ff5df21461022c57806323b872dd1461023f575b600080fd5b60408051808201909152601981527f4d616b6520457468657265756d20477265617420416761696e0000000000000060208201525b6040516101d59190611e1b565b60405180910390f35b6101f16101ec366004611e85565b610445565b60405190151581526020016101d5565b61020961045c565b6040519081526020016101d5565b61022a610225366004611ebf565b610480565b005b61022a61023a366004611eda565b610500565b6101f161024d366004611ef5565b6105fa565b6101f1610260366004611eda565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051600681526020016101d5565b61022a61029b366004611eda565b610663565b6101f16102ae366004611e85565b610813565b61022a610849565b61022a6102c9366004611f31565b61089a565b6102096102dc366004611f4a565b610a17565b6000546040516001600160a01b0390911681526020016101d5565b61022a61030a366004611eda565b610ac7565b6101f161031d366004611eda565b6001600160a01b031660009081526009602052604090205460ff1690565b61022a610349366004611f76565b610b5d565b61020961035c366004611eda565b610bb2565b6101f161036f366004611eda565b6001600160a01b03166000908152600a602052604090205460ff1690565b61020961039b366004611f31565b610c11565b6040805180820190915260048152634d45474160e01b60208201526101c8565b6101f16103ce366004611e85565b610c88565b6101f16103e1366004611e85565b610cd7565b61022a6103f4366004611eda565b610ce4565b610209610407366004611fa0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61022a610440366004611eda565b610e61565b6000610452338484610f05565b5060015b92915050565b600061046a6006600a6120c4565b61047b906603287092778e386120d3565b905090565b6000546001600160a01b031633146104b35760405162461bcd60e51b81526004016104aa906120ea565b60405180910390fd5b600f805460ff191682151590811790915560405160ff909116151581527f93fe086589e2785f1c3891e1c046851acf9de9434fd52b9295e17c279bad87b79060200160405180910390a150565b6000546001600160a01b0316331461052a5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff161561058d5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f7816001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b50565b6000610607848484611033565b6106598433610654856040518060600160405280602881526020016121d3602891396001600160a01b038a1660009081526008602090815260408083203384529091529020549190611337565b610f05565b5060019392505050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff166106ef5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600b5481101561080f57816001600160a01b0316600b82815481106107195761071961212f565b6000918252602090912001546001600160a01b0316036107fd57600b805461074390600190612145565b815481106107535761075361212f565b600091825260209091200154600b80546001600160a01b03909216918390811061077f5761077f61212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600a90925220805460ff19169055600b8054806107d7576107d7612158565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108078161216e565b9150506106f2565b5050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916104529185906106549086611363565b6000546001600160a01b031633146108735760405162461bcd60e51b81526004016104aa906120ea565b61087f6006600a6120c4565b610890906603287092778e386120d3565b6002556000600355565b33806108f65760405162461bcd60e51b815260206004820152602560248201527f5265666c6563746f723a206275726e2066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104aa565b600061090182610bb2565b9050828110156109625760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a206275726e20616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104aa565b600061097661096f61136f565b8590611392565b6001600160a01b03841660009081526006602052604090205490915061099c9082610ef9565b6001600160a01b038416600090815260066020908152604080832093909355600a9052205460ff1615610a06576001600160a01b0383166000908152600760205260409020546109ec9085610ef9565b6001600160a01b0384166000908152600760205260409020555b610a1183858361139e565b50505050565b6000610a256006600a6120c4565b610a36906603287092778e386120d3565b831115610a855760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016104aa565b81610aa5576000610a978460006114c7565b509294506104569350505050565b6000610ab984610ab460055490565b6114c7565b509194506104569350505050565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff1615610b545760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f78161153d565b6000546001600160a01b03163314610b875760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600a602052604081205460ff1615610bef57506001600160a01b031660009081526007602052604090205490565b6001600160a01b038216600090815260066020526040902054610456906115fd565b600080610c1d8361167a565b60408051608081019091528154909190829060ff166001811115610c4357610c43612187565b6001811115610c5457610c54612187565b81526001820154602082015260028201546001600160a01b0316604082015260039091015460609182015201519392505050565b60006104523384610654856040518060600160405280602581526020016121fb602591393360009081526008602090815260408083206001600160a01b038d1684529091529020549190611337565b6000610452338484611033565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff16610d705760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600e5481101561080f57816001600160a01b0316600e8281548110610d9a57610d9a61212f565b6000918252602090912001546001600160a01b031603610e4f57600e8054610dc490600190612145565b81548110610dd457610dd461212f565b600091825260209091200154600e80546001600160a01b039092169183908110610e0057610e0061212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600d90915260409020805460ff19169055600e8054806107d7576107d7612158565b80610e598161216e565b915050610d73565b6000546001600160a01b03163314610e8b5760405162461bcd60e51b81526004016104aa906120ea565b600080546040516001600160a01b03808516939216917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ef2828461219d565b9392505050565b6000610ef28284612145565b6001600160a01b038316610f6c5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f723a20617070726f76652066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016104aa565b6001600160a01b038216610fd15760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a20617070726f766520746f20746865207a65726f206160448201526564647265737360d01b60648201526084016104aa565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661109b5760405162461bcd60e51b815260206004820152602960248201527f5265666c6563746f723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016104aa565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602760248201527f5265666c6563746f723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016104aa565b600081116111635760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016104aa565b6002546001908211801561118557506000546001600160a01b03858116911614155b8015611197575061119583611711565b155b156111f55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016104aa565b600060035411801561121557506000546001600160a01b03858116911614155b8015611227575061122583611711565b155b80156112465750600f546001600160a01b038481166101009092041614155b156112cc57600061125684610bb2565b60035490915061126684836121bf565b11156112ca5760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016104aa565b505b6001600160a01b03841660009081526009602052604090205460ff168061130b57506001600160a01b03831660009081526009602052604090205460ff165b15611314575060005b61132084848484611737565b61132c84848484611740565b610a118484846118fa565b6000818484111561135b5760405162461bcd60e51b81526004016104aa9190611e1b565b505050900390565b6000610ef282846121bf565b600080600061137c611908565b909250905061138b8282610ee6565b9250505090565b6000610ef282846120d3565b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8546113d39082611363565b600080527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35460ff1615611489576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5461145d9083611363565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df555b6040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611026565b600080808080806114e46103e86114de8a8a611392565b90610ee6565b905060006114f28983610ef9565b905060006114fe61136f565b9050600061150c8b83611392565b9050600061151a8584611392565b905060006115288383610ef9565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526006602052604090205415611597576001600160a01b03811660009081526006602052604090205461157d906115fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b60006001548211156116645760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016104aa565b600061166e61136f565b9050610ef28382610ee6565b600060045482106116e95760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016104aa565b600482815481106116fc576116fc61212f565b90600052602060002090600402019050919050565b600080546001600160a01b03838116911614806104565750506001600160a01b03161590565b610a1184611aff565b600061174b60055490565b905081611756575060005b600080600080600061176888876114c7565b6001600160a01b038f16600090815260066020526040902054949950929750909550935091506117989086610ef9565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546117c79085611363565b6001600160a01b03808b16600090815260066020908152604080832094909455918d168152600a909152205460ff1615611838576001600160a01b038a1660009081526007602052604090205461181e9084610ef9565b6001600160a01b038b166000908152600760205260409020555b6001600160a01b0389166000908152600a602052604090205460ff1615611896576001600160a01b03891660009081526007602052604090205461187c9083611363565b6001600160a01b038a166000908152600760205260409020555b6118a1888288611be3565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e691815260200190565b60405180910390a350505050505050505050565b61190382611bf3565b505050565b60015460009081908161191d6006600a6120c4565b61192e906603287092778e386120d3565b905060005b600b54811015611a92578260066000600b84815481106119555761195561212f565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806119c057508160076000600b84815481106119995761199961212f565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156119f0576001546119d46006600a6120c4565b6119e5906603287092778e386120d3565b945094505050509091565b611a3660066000600b8481548110611a0a57611a0a61212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610ef9565b9250611a7e60076000600b8481548110611a5257611a5261212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610ef9565b915080611a8a8161216e565b915050611933565b50801580611ac75750611ac4611aaa6006600a6120c4565b611abb906603287092778e386120d3565b60015490610ee6565b82105b15611af657600154611adb6006600a6120c4565b611aec906603287092778e386120d3565b9350935050509091565b90939092509050565b600f5460ff168015611b2f57506001600160a01b0381166000908152600d602052604090205460ff161515600114155b156105f7576001600160a01b0381166000908152600c602052604090205463ffffffff4281169116036105f75760405162461bcd60e51b815260206004820152605060248201527f506c656173652077616974203120626c6f636b20287e31302d3135207365636f60448201527f6e647329206265666f7265207472616e7366657272696e67206f722073656c6c60648201526f34b733903cb7bab9103a37b5b2b7399760811b608482015260a4016104aa565b8015611903576119038383611c44565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146105f7576001600160a01b03166000908152600c60205260409020805463ffffffff19164263ffffffff16179055565b6000611c4f60045490565b905060005b81811015610a1157600080611c6883611ce1565b50509150915080600003611c7d575050611ccf565b6001826001811115611c9157611c91612187565b03611ca757611ca286868386611d7c565b611ccc565b6000826001811115611cbb57611cbb612187565b03611ccc57611ccc86868386611dc1565b50505b80611cd98161216e565b915050611c54565b6000806000806000611cf28661167a565b60408051608081019091528154909190829060ff166001811115611d1857611d18612187565b6001811115611d2957611d29612187565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b6000611d8e6103e86114de8786611392565b90506000611d9c8286611392565b600154909150611dac9082610ef9565b600155611db98383611df4565b505050505050565b6000611dd36103e86114de8786611392565b90506000611de18286611392565b9050611dee30838361139e565b611db983835b6000611dff8361167a565b6003810154909150611e119083611363565b6003909101555050565b600060208083528351808285015260005b81811015611e4857858101830151858201604001528201611e2c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611e8057600080fd5b919050565b60008060408385031215611e9857600080fd5b611ea183611e69565b946020939093013593505050565b80358015158114611e8057600080fd5b600060208284031215611ed157600080fd5b610ef282611eaf565b600060208284031215611eec57600080fd5b610ef282611e69565b600080600060608486031215611f0a57600080fd5b611f1384611e69565b9250611f2160208501611e69565b9150604084013590509250925092565b600060208284031215611f4357600080fd5b5035919050565b60008060408385031215611f5d57600080fd5b82359150611f6d60208401611eaf565b90509250929050565b60008060408385031215611f8957600080fd5b611f9283611e69565b9150611f6d60208401611eaf565b60008060408385031215611fb357600080fd5b611fbc83611e69565b9150611f6d60208401611e69565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561201b57816000190482111561200157612001611fca565b8085161561200e57918102915b93841c9390800290611fe5565b509250929050565b60008261203257506001610456565b8161203f57506000610456565b8160018114612055576002811461205f5761207b565b6001915050610456565b60ff84111561207057612070611fca565b50506001821b610456565b5060208310610133831016604e8410600b841016171561209e575081810a610456565b6120a88383611fe0565b80600019048211156120bc576120bc611fca565b029392505050565b6000610ef260ff841683612023565b808202811582820484141761045657610456611fca565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561045657610456611fca565b634e487b7160e01b600052603160045260246000fd5b60006001820161218057612180611fca565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6000826121ba57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561045657610456611fca56fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122087515c0d7db8a5d085c4a4df9327701fada493662a8baba5965581944d9b1ccb64736f6c63430008120033