Contract Overview
Contract Name:
CrosschainERC20
Compiler Version
v0.8.6+commit.11564f7e
/************************************************************ * * Autor: BotPlanet * Blockchain: IoTeX * Swap: MimoProtocol * * 446576656c6f7065723a20416e746f6e20506f6c656e79616b61 ****/ // SPDX-License-Identifier: MIT pragma solidity 0.8.6; interface IERC20 { 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; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(address(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 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); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @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. */ abstract contract Ownable is Context { address private _owner; address private _previousOwner; uint256 private _lockTime; bool private _isOwnershipRenounced = false; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event NewDelay(uint256 indexed newDelay); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @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 { _owner = address(0); _isOwnershipRenounced = true; emit OwnershipTransferred(_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; } function geUnlockTime() public view returns (uint256) { return _lockTime; } //Locks the contract for owner for the amount of time provided function lock(uint256 time) public virtual onlyOwner { _previousOwner = _owner; _owner = address(0); _lockTime = block.timestamp + time; emit OwnershipTransferred(_owner, address(0)); emit NewDelay(_lockTime); } //Unlocks the contract for owner when _lockTime is exceeds function unlock() public virtual { require(_isOwnershipRenounced == false, "Ownership of the contract has been relinquished"); require(_previousOwner == msg.sender, "You don't have permission to unlock the token contract"); require(block.timestamp > _lockTime , "Contract is locked until 7 days"); _owner = _previousOwner; emit OwnershipTransferred(_owner, _previousOwner); } } interface IMimoFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function referral() external view returns (address); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function setReferral(address) external; } interface IMimoV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IMimoV2Router02 is IMimoV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract BotToken is Context, IERC20, Ownable, IERC20Metadata { using SafeMath for uint256; using Address for address; using SafeERC20 for IERC20; address private _dead = 0x000000000000000000000000000000000000dEaD; mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; uint256 private constant MAX = ~uint256(0); uint256 public _totalSupply; uint256 private _rTotal; uint256 private _tFeeTotal; string public _name; string public _symbol; uint8 private _decimals; uint8 public taxFee; uint8 private _previousTaxFee = taxFee; uint8 public liquidityFee; uint8 private _previousLiquidityFee = liquidityFee; uint8 public burnFee; uint8 private _previousBurnFee = burnFee; uint8 public walletFee; uint8 private _previousWalletFee = walletFee; uint8 public buybackFee; uint8 private _previousBuybackFee = buybackFee; IMimoV2Router02 public immutable pcsV2Router; address public immutable pcsV2Pair; address payable public feeWallet; // Mimo Factory: 0xda257cBe968202Dea212bBB65aB49f174Da58b9D address public router = 0x95cB18889B968AbABb9104f30aF5b310bD007Fd8; // Mimo // Mimo SDK: 0x147CdAe2BF7e809b9789aD0765899c06B361C5cE bool private _inSwapAndLiquify; bool public swapAndLiquifyEnabled; uint8 public minMxTxPercentage = 1; uint256 public maxTxAmount; uint8 public minMxWalletPercentage = 1; uint256 public maxWalletAmount; uint256 public numTokensSellToAddToLiquidity; uint256 private _buyBackUpperLimit; uint256 private _buyBackMinLimit; event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity); modifier lockTheSwap { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } constructor () { // Initialization. Start address tokenOwner = address(0xe919621cae4bE24eb2cA43E5D077816690D96767); feeWallet = payable(0xe919621cae4bE24eb2cA43E5D077816690D96767); _name = "BOT"; // Token name _symbol = "BOT"; // Token symbol _decimals = 18; _totalSupply = uint256(1000000000 * 10**_decimals); uint8 setMxTxPer = 100; uint8 setMxWalletPer = 1; taxFee = 0; // 0% liquidityFee = 0; // 0% burnFee = 1; // 1% walletFee = 0; // 0% buybackFee = 1; // 1% _buyBackUpperLimit = 10 * 10**_decimals; _buyBackMinLimit = 10 * 10**_decimals; swapAndLiquifyEnabled = true; // Initialization. End _rTotal = (MAX - (MAX % _totalSupply)); _rOwned[tokenOwner] = _rTotal; _setMaxTxPercent(setMxTxPer); _setMaxWalletPercent(setMxWalletPer); numTokensSellToAddToLiquidity = _totalSupply.mul(1).div(1000); // Create a MimoProtocol pair for this new token IMimoV2Router02 _pcsV2Router = IMimoV2Router02(router); pcsV2Pair = IMimoFactory(_pcsV2Router.factory()).createPair(address(this), _pcsV2Router.WETH()); pcsV2Router = _pcsV2Router; // Exclude owner and contract address from fee _isExcludedFromFee[tokenOwner] = true; _isExcludedFromFee[address(this)] = true; // Emit events emit Transfer(address(0), tokenOwner, _totalSupply); emit SwapAndLiquifyEnabledUpdated(swapAndLiquifyEnabled); } function name() public view override returns (string memory) { return _name; } function symbol() public view override returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { 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, "ERC20: 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, "ERC20: decreased allowance below zero")); return true; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function deliver(uint256 tAmount) public { address sender = _msgSender(); (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 <= _totalSupply, "Amt 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, "Amt must be less than tot refl"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function buyBackUpperLimitAmount() public view returns (uint256) { return _buyBackUpperLimit; } function _setMaxTxPercent(uint256 maxTxPercent) private { require(maxTxPercent >= minMxTxPercentage && maxTxPercent <= 100, "err"); maxTxAmount = _totalSupply.mul(maxTxPercent).div(100); } function _setMaxWalletPercent(uint256 maxWalletPercent) private { require(maxWalletPercent >= minMxWalletPercentage && maxWalletPercent <= 100, "err"); maxWalletAmount = _totalSupply.mul(maxWalletPercent).div(100); } function setFeeWallet(address payable newFeeWallet) external onlyOwner { require(newFeeWallet != address(0), "ZERO ADDRESS"); feeWallet = newFeeWallet; } // To recieve ETH from pcsV2Router when swaping receive() external payable {} function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate()); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity); } function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) { uint256 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } 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 = _totalSupply; if (rSupply < _rTotal.div(_totalSupply)) { return (_rTotal, _totalSupply); } return (rSupply, tSupply); } function _takeLiquidity(uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(taxFee).div(100); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(liquidityFee + burnFee + walletFee + buybackFee).div(100); } function removeAllFee() private { if(taxFee == 0 && liquidityFee == 0 && burnFee == 0 && walletFee == 0 && buybackFee == 0) return; _previousTaxFee = taxFee; _previousLiquidityFee = liquidityFee; _previousBurnFee = burnFee; _previousWalletFee = walletFee; _previousBuybackFee = buybackFee; taxFee = 0; liquidityFee = 0; burnFee = 0; walletFee = 0; buybackFee = 0; } function restoreAllFee() private { taxFee = _previousTaxFee; liquidityFee = _previousLiquidityFee; burnFee = _previousBurnFee; walletFee = _previousWalletFee; buybackFee = _previousBuybackFee; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from zero address"); require(spender != address(0), "ERC20: approve to zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from zero address"); require(to != address(0), "ERC20: transfer to zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if(from != owner() && to != owner()) { require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } if(from != owner() && to != owner() && to != address(0) && to != _dead && to != pcsV2Pair){ uint256 contractBalanceRecepient = balanceOf(to); require(contractBalanceRecepient + amount <= maxWalletAmount, "Exceeds maximum wallet amount"); } // is the token balance of this contract address over the min number of // tokens that we need to initiate a swap + liquidity lock? // also, don't get caught in a circular liquidity event. // also, don't swap & liquify if sender is MimoProtocol pair. uint256 contractTokenBalance = balanceOf(address(this)); if(contractTokenBalance >= maxTxAmount) { contractTokenBalance = maxTxAmount; } bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; if (!_inSwapAndLiquify && to == pcsV2Pair && swapAndLiquifyEnabled) { if(overMinTokenBalance) { contractTokenBalance = numTokensSellToAddToLiquidity; //add liquidity swapAndLiquify(contractTokenBalance); } if(buybackFee !=0) { uint256 balance = address(this).balance; if (balance > _buyBackMinLimit) { if (balance > _buyBackUpperLimit) { balance = _buyBackUpperLimit; } buyBackTokens(balance); } } } // Indicates if fee should be deducted from transfer bool takeFee = true; // If any account belongs to _isExcludedFromFee account then remove the fee if(isExcludedFromFee(from) || isExcludedFromFee(to)) { takeFee = false; } // Transfer amount, it will take tax, burn, liquidity fee _tokenTransfer(from, to, amount, takeFee); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { // This needs to be distributed among burn, wallet and liquidity burn uint8 totFee = burnFee + walletFee + liquidityFee + buybackFee; uint256 spentAmount = 0; uint256 totSpentAmount = 0; if(burnFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(burnFee); _tokenTransferNoFee(address(this), _dead, spentAmount); totSpentAmount = spentAmount; } if(walletFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(walletFee); _tokenTransferNoFee(address(this), feeWallet, spentAmount); totSpentAmount = totSpentAmount + spentAmount; } if(buybackFee != 0) { spentAmount = contractTokenBalance.div(totFee).mul(buybackFee); swapTokensForETH(spentAmount); totSpentAmount = totSpentAmount + spentAmount; } if(liquidityFee != 0) { contractTokenBalance = contractTokenBalance.sub(totSpentAmount); // Split the contract balance into halves uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); // Capture the contract's current ETH balance. // This is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // Swap tokens for ETH swapTokensForETH(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered // How much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // Add liquidity to MimoProtocol addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } } function buyBackTokens(uint256 amount) private lockTheSwap { if (amount > 0) { swapETHForTokens(amount); } } function swapTokensForETH(uint256 tokenAmount) private { // generate the MimoProtocol pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = pcsV2Router.WETH(); _approve(address(this), address(pcsV2Router), tokenAmount); // make the swap uint256 minAmount = uint256(1 * 10**_decimals).div(100); // 0.01 token pcsV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, minAmount, // accept min 0.01 amount of Tokens path, address(this), block.timestamp ); } function swapETHForTokens(uint256 amount) private { // generate the MimoProtocol pair path of token -> weth address[] memory path = new address[](2); path[0] = pcsV2Router.WETH(); path[1] = address(this); // make the swap uint256 minAmount = uint256(1 * 10**_decimals).div(100); // 0.01 token pcsV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}( minAmount, // accept min 0.01 amount of Tokens path, _dead, // Burn address block.timestamp.add(300) ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(pcsV2Router), tokenAmount); // add the liquidity pcsV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable _dead, block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private { if(!takeFee) { removeAllFee(); } _transferStandard(sender, recipient, amount); if(!takeFee) { restoreAllFee(); } } function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _tokenTransferNoFee(address sender, address recipient, uint256 amount) private { uint256 currentRate = _getRate(); uint256 rAmount = amount.mul(currentRate); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rAmount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _tOwned[account] = _tOwned[account].add(amount); // OpenZeppelin: _balances[account] += amount; _rOwned[account] = _rOwned[account].add(amount); // OpenZeppelin: - emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = balanceOf(account); // OpenZeppelin: - require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _tOwned[account] = _tOwned[account].sub(amount); // OpenZeppelin: _balances[account] = accountBalance - amount; _rOwned[account] = _rOwned[account].sub(amount); // OpenZeppelin: - } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} function _setupDecimals(uint8 decimal) internal { _decimals = decimal; } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Burnable.sol) /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, BotToken { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } contract CrosschainERC20 is ERC20Burnable { using SafeERC20 for BotToken; event MinterSet(address indexed minter); modifier onlyMinter() { require(minter == msg.sender, "not the minter"); _; } BotToken public coToken; address public minter; constructor() BotToken() { // minter address on IoTeX is 0x4799d57aBf5F12cA4eF5375c9dadF8fe7fA5A454 // coToken address on IoTeX is address(0) // minter address on Ethereum is 0x964f4f19bc823e72cc1f806021937cfc06f63b45 // the corresponding coToken is bot token address. coToken = BotToken(payable(0)); minter = address(0x4799d57aBf5F12cA4eF5375c9dadF8fe7fA5A454); _setupDecimals(uint8(18)); emit MinterSet(minter); } function transferMintership(address _newMinter) public onlyMinter { minter = _newMinter; emit MinterSet(_newMinter); } function deposit(uint256 _amount) public { depositTo(msg.sender, _amount); } function depositTo(address _to, uint256 _amount) public { require(address(coToken) != address(0), "no co-token"); coToken.safeTransferFrom(msg.sender, address(this), _amount); _mint(_to, _amount); } function withdraw(uint256 _amount) public { withdrawTo(msg.sender, _amount); } function withdrawTo(address _to, uint256 _amount) public { require(address(coToken) != address(0), "no co-token"); require(_amount != 0, "amount is 0"); _burn(msg.sender, _amount); coToken.safeTransfer(_to, _amount); } function mint(address _to, uint256 _amount) public onlyMinter returns (bool) { require(_amount != 0, "amount is 0"); _mint(_to, _amount); return true; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"MinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"NewDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coToken","outputs":[{"internalType":"contract BotToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMxTxPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMxWalletPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Router","outputs":[{"internalType":"contract IMimoV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFeeWallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMinter","type":"address"}],"name":"transferMintership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600436106103035760003560e01c80637f9864f711610190578063b6b55f25116100dc578063dd46706411610095578063f2fde38b1161006f578063f2fde38b14610933578063f887ea4014610953578063fce589d814610973578063ffaad6a51461099457600080fd5b8063dd467064146108a6578063dd62ed3e146108c6578063f25f4b561461090c57600080fd5b8063b6b55f2514610811578063b6c5232414610831578063bdc653ef14610846578063cf86a95a1461085b578063d12a76881461087b578063d28d88521461089157600080fd5b8063a071dcf411610149578063a9059cbb11610123578063a9059cbb146107a5578063aa4bde28146107c5578063ac557f66146107db578063b09f1266146107fc57600080fd5b8063a071dcf414610751578063a457c2d714610770578063a69df4b51461079057600080fd5b80637f9864f7146106a75780638c0b5e22146106c75780638da5cb5b146106dd57806390d49b9d146106fb57806395d89b411461071b57806398118cb41461073057600080fd5b80633b2d081c1161024f5780634a74bb021161020857806370690b11116101e257806370690b111461063857806370a0823114610652578063715018a61461067257806379cc67901461068757600080fd5b80634a74bb02146105aa57806352143290146105cb5780635342acb4146105ff57600080fd5b80633b2d081c146104f35780633bd5d173146105145780633eaaf86b1461053457806340c10f191461054a57806342966c681461056a5780634549b0391461058a57600080fd5b806323b872dd116102bc5780632e1a7d4d116102965780632e1a7d4d1461046c578063313ce5671461048c578063324f8dbf146104b257806339509351146104d357600080fd5b806323b872dd146103f85780632d6abf87146104185780632d8381191461044c57600080fd5b806306fdde031461030f578063075461721461033a578063095ea7b31461037257806313114a9d146103a257806318160ddd146103c1578063205c2878146103d657600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b506103246109b4565b6040516103319190612f5f565b60405180910390f35b34801561034657600080fd5b5060165461035a906001600160a01b031681565b6040516001600160a01b039091168152602001610331565b34801561037e57600080fd5b5061039261038d366004612e4a565b610a46565b6040519015158152602001610331565b3480156103ae57600080fd5b50600a545b604051908152602001610331565b3480156103cd57600080fd5b506008546103b3565b3480156103e257600080fd5b506103f66103f1366004612e4a565b610a5d565b005b34801561040457600080fd5b50610392610413366004612e09565b610b08565b34801561042457600080fd5b5061035a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045857600080fd5b506103b3610467366004612e93565b610b71565b34801561047857600080fd5b506103f6610487366004612e93565b610be2565b34801561049857600080fd5b50600d5460ff165b60405160ff9091168152602001610331565b3480156104be57600080fd5b50600e546104a090600160b01b900460ff1681565b3480156104df57600080fd5b506103926104ee366004612e4a565b610bef565b3480156104ff57600080fd5b50600d546104a090600160481b900460ff1681565b34801561052057600080fd5b506103f661052f366004612e93565b610c25565b34801561054057600080fd5b506103b360085481565b34801561055657600080fd5b50610392610565366004612e4a565b610c9b565b34801561057657600080fd5b506103f6610585366004612e93565b610d2e565b34801561059657600080fd5b506103b36105a5366004612eac565b610d38565b3480156105b657600080fd5b50600e5461039290600160a81b900460ff1681565b3480156105d757600080fd5b5061035a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561060b57600080fd5b5061039261061a366004612d96565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561064457600080fd5b506010546104a09060ff1681565b34801561065e57600080fd5b506103b361066d366004612d96565b610dc5565b34801561067e57600080fd5b506103f6610de7565b34801561069357600080fd5b506103f66106a2366004612e4a565b610e48565b3480156106b357600080fd5b5060155461035a906001600160a01b031681565b3480156106d357600080fd5b506103b3600f5481565b3480156106e957600080fd5b506000546001600160a01b031661035a565b34801561070757600080fd5b506103f6610716366004612d96565b610ece565b34801561072757600080fd5b50610324610f7e565b34801561073c57600080fd5b50600d546104a0906301000000900460ff1681565b34801561075d57600080fd5b50600d546104a090610100900460ff1681565b34801561077c57600080fd5b5061039261078b366004612e4a565b610f8d565b34801561079c57600080fd5b506103f6610fdc565b3480156107b157600080fd5b506103926107c0366004612e4a565b61114a565b3480156107d157600080fd5b506103b360115481565b3480156107e757600080fd5b50600d546104a090600160381b900460ff1681565b34801561080857600080fd5b50610324611157565b34801561081d57600080fd5b506103f661082c366004612e93565b6111e5565b34801561083d57600080fd5b506002546103b3565b34801561085257600080fd5b506013546103b3565b34801561086757600080fd5b506103f6610876366004612d96565b6111ef565b34801561088757600080fd5b506103b360125481565b34801561089d57600080fd5b50610324611284565b3480156108b257600080fd5b506103f66108c1366004612e93565b611291565b3480156108d257600080fd5b506103b36108e1366004612dd0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561091857600080fd5b50600d5461035a90600160581b90046001600160a01b031681565b34801561093f57600080fd5b506103f661094e366004612d96565b611342565b34801561095f57600080fd5b50600e5461035a906001600160a01b031681565b34801561097f57600080fd5b50600d546104a090600160281b900460ff1681565b3480156109a057600080fd5b506103f66109af366004612e4a565b61141a565b6060600b80546109c3906131e7565b80601f01602080910402602001604051908101604052809291908181526020018280546109ef906131e7565b8015610a3c5780601f10610a1157610100808354040283529160200191610a3c565b820191906000526020600020905b815481529060010190602001808311610a1f57829003601f168201915b5050505050905090565b6000610a53338484611543565b5060015b92915050565b6015546001600160a01b0316610aa85760405162461bcd60e51b815260206004820152600b60248201526a37379031b796ba37b5b2b760a91b60448201526064015b60405180910390fd5b80610ae35760405162461bcd60e51b815260206004820152600b60248201526a0616d6f756e7420697320360ac1b6044820152606401610a9f565b610aed3382611650565b601554610b04906001600160a01b031683836117d1565b5050565b6000610b15848484611834565b610b678433610b6285604051806060016040528060288152602001613272602891396001600160a01b038a1660009081526006602090815260408083203384529091529020549190611c25565b611543565b5060019392505050565b6000600954821115610bc55760405162461bcd60e51b815260206004820152601e60248201527f416d74206d757374206265206c657373207468616e20746f74207265666c00006044820152606401610a9f565b6000610bcf611c5f565b9050610bdb8382611501565b9392505050565b610bec3382610a5d565b50565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610a53918590610b629086611c82565b336000610c3183611ce1565b505050506001600160a01b038416600090815260046020526040902054919250610c5d91905082611d30565b6001600160a01b038316600090815260046020526040902055600954610c839082611d30565b600955600a54610c939084611c82565b600a55505050565b6016546000906001600160a01b03163314610ce95760405162461bcd60e51b815260206004820152600e60248201526d3737ba103a34329036b4b73a32b960911b6044820152606401610a9f565b81610d245760405162461bcd60e51b815260206004820152600b60248201526a0616d6f756e7420697320360ac1b6044820152606401610a9f565b610a538383611d72565b610bec3382611650565b6000600854831115610d8c5760405162461bcd60e51b815260206004820152601c60248201527f416d74206d757374206265206c657373207468616e20737570706c79000000006044820152606401610a9f565b81610dab576000610d9c84611ce1565b50939550610a57945050505050565b6000610db684611ce1565b50929550610a57945050505050565b6001600160a01b038116600090815260046020526040812054610a5790610b71565b6000546001600160a01b03163314610e115760405162461bcd60e51b8152600401610a9f90612f92565b600080546001600160a01b03191681556003805460ff19166001179055604051819060008051602061329a833981519152908290a3565b6000610e5483336108e1565b905081811015610eb25760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610a9f565b610ebf8333848403611543565b610ec98383611650565b505050565b6000546001600160a01b03163314610ef85760405162461bcd60e51b8152600401610a9f90612f92565b6001600160a01b038116610f3d5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f204144445245535360a01b6044820152606401610a9f565b600d80546001600160a01b03909216600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055565b6060600c80546109c3906131e7565b6000610a533384610b62856040518060600160405280602581526020016132da602591393360009081526006602090815260408083206001600160a01b038d1684529091529020549190611c25565b60035460ff16156110475760405162461bcd60e51b815260206004820152602f60248201527f4f776e657273686970206f662074686520636f6e74726163742068617320626560448201526e195b881c995b1a5b9c5d5a5cda1959608a1b6064820152608401610a9f565b6001546001600160a01b031633146110c05760405162461bcd60e51b815260206004820152603660248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152751bd8dac81d1a19481d1bdad95b8818dbdb9d1c9858dd60521b6064820152608401610a9f565b60025442116111115760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a9f565b600154600080546001600160a01b0319166001600160a01b039092169182178155604051829160008051602061329a83398151915291a3565b6000610a53338484611834565b600c8054611164906131e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611190906131e7565b80156111dd5780601f106111b2576101008083540402835291602001916111dd565b820191906000526020600020905b8154815290600101906020018083116111c057829003601f168201915b505050505081565b610bec338261141a565b6016546001600160a01b0316331461123a5760405162461bcd60e51b815260206004820152600e60248201526d3737ba103a34329036b4b73a32b960911b6044820152606401610a9f565b601680546001600160a01b0319166001600160a01b0383169081179091556040517f726b590ef91a8c76ad05bbe91a57ef84605276528f49cd47d787f558a4e755b690600090a250565b600b8054611164906131e7565b6000546001600160a01b031633146112bb5760405162461bcd60e51b8152600401610a9f90612f92565b60008054600180546001600160a01b03199081166001600160a01b038416179091551690556112ea8142613038565b600255600080546040516001600160a01b039091169060008051602061329a833981519152908390a36002546040517f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b6000546001600160a01b0316331461136c5760405162461bcd60e51b8152600401610a9f90612f92565b6001600160a01b0381166113d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a9f565b600080546040516001600160a01b038085169392169160008051602061329a83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6015546001600160a01b03166114605760405162461bcd60e51b815260206004820152600b60248201526a37379031b796ba37b5b2b760a91b6044820152606401610a9f565b601554611478906001600160a01b0316333084611e7c565b610b048282611d72565b60008261149157506000610a57565b600061149d8385613185565b9050826114aa8583613075565b14610bdb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a9f565b6000610bdb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eba565b6001600160a01b0383166115995760405162461bcd60e51b815260206004820181905260248201527f45524332303a20617070726f76652066726f6d207a65726f20616464726573736044820152606401610a9f565b6001600160a01b0382166115ef5760405162461bcd60e51b815260206004820152601e60248201527f45524332303a20617070726f766520746f207a65726f206164647265737300006044820152606401610a9f565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382166116b05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a9f565b60006116bb83610dc5565b9050818110156117185760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a9f565b6001600160a01b03831660009081526005602052604090205461173b9083611d30565b6001600160a01b03841660009081526005602090815260408083209390935560049052205461176a9083611d30565b6001600160a01b038416600090815260046020526040812091909155600880548492906117989084906131a4565b90915550506040518281526000906001600160a01b038516906000805160206132ba8339815191529060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052610ec990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ee8565b6001600160a01b0383166118945760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610a9f565b6001600160a01b0382166118ea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610a9f565b6000811161194c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a9f565b6000546001600160a01b0384811691161480159061197857506000546001600160a01b03838116911614155b156119e057600f548111156119e05760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a9f565b6000546001600160a01b03848116911614801590611a0c57506000546001600160a01b03838116911614155b8015611a2057506001600160a01b03821615155b8015611a3f57506003546001600160a01b038381166101009092041614155b8015611a7d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611aed576000611a8d83610dc5565b601154909150611a9d8383613038565b1115611aeb5760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e740000006044820152606401610a9f565b505b6000611af830610dc5565b9050600f548110611b085750600f545b601254600e549082101590600160a01b900460ff16158015611b5b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b8015611b705750600e54600160a81b900460ff165b15611bc1578015611b89576012549150611b8982611fba565b600d54600160481b900460ff1615611bc1576014544790811115611bbf57601354811115611bb657506013545b611bbf816121e3565b505b6001611be5866001600160a01b031660009081526007602052604090205460ff1690565b80611c0857506001600160a01b03851660009081526007602052604090205460ff165b15611c11575060005b611c1d86868684612215565b505050505050565b60008184841115611c495760405162461bcd60e51b8152600401610a9f9190612f5f565b506000611c5684866131a4565b95945050505050565b6000806000611c6c6122f5565b9092509050611c7b8282611501565b9250505090565b600080611c8f8385613038565b905083811015610bdb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a9f565b6000806000806000806000806000611cf88a61232a565b9250925092506000806000611d168d8686611d11611c5f565b61236c565b919f909e50909c50959a5093985091965092945050505050565b6000610bdb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611c25565b6001600160a01b038216611dc85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a9f565b8060086000828254611dda9190613038565b90915550506001600160a01b038216600090815260056020526040902054611e029082611c82565b6001600160a01b038316600090815260056020908152604080832093909355600490522054611e319082611c82565b6001600160a01b0383166000818152600460205260408082209390935591519091906000805160206132ba83398151915290611e709085815260200190565b60405180910390a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611eb49085906323b872dd60e01b906084016117fd565b50505050565b60008183611edb5760405162461bcd60e51b8152600401610a9f9190612f5f565b506000611c568486613075565b6000611f3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123bc9092919063ffffffff16565b805190915015610ec95780806020019051810190611f5b9190612e76565b610ec95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a9f565b600e805460ff60a01b1916600160a01b179055600d54600090600160481b810460ff908116916301000000810482169161200691600160381b8104821691600160281b90910416613050565b6120109190613050565b61201a9190613050565b600d549091506000908190600160281b900460ff161561208057600d5461205b9060ff600160281b9091048116906120559087908716611501565b90611482565b915061207d30600360019054906101000a90046001600160a01b0316846123d3565b50805b600d54600160381b900460ff16156120e257600d546120b39060ff600160381b9091048116906120559087908716611501565b91506120d530600d600b9054906101000a90046001600160a01b0316846123d3565b6120df8282613038565b90505b600d54600160481b900460ff161561212d57600d546121159060ff600160481b9091048116906120559087908716611501565b915061212082612491565b61212a8282613038565b90505b600d546301000000900460ff16156121d0576121498482611d30565b93506000612158856002611501565b905060006121668683611d30565b90504761217283612491565b600061217e4783611d30565b905061218a838261268f565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505050505b5050600e805460ff60a01b191690555050565b600e805460ff60a01b1916600160a01b17905580156122055761220581612788565b50600e805460ff60a01b19169055565b806122225761222261295a565b61222d848484612a96565b80611eb457600d805469ff0000000000000000001967ff00ff00000000001963ff00ff0019831663ff0000001961010062010000860460ff908116919091029182169290921764010000000061ff00199096169091179490940481166301000000029390931790811667ff0000000000000019660100000000000083048516600160281b0290811691909117600160401b65ff000000000019909316909117919091048316600160381b0217908116600160501b909104909116600160481b02179055611eb4565b600954600854600091829161230a8282611501565b821015612321576009546008549350935050509091565b90939092509050565b60008060008061233985612b7b565b9050600061234686612b9b565b9050600061235e826123588986611d30565b90611d30565b979296509094509092505050565b600080808061237b8886611482565b905060006123898887611482565b905060006123978888611482565b905060006123a9826123588686611d30565b939b939a50919850919650505050505050565b60606123cb8484600085612bfc565b949350505050565b60006123dd611c5f565b905060006123eb8383611482565b6001600160a01b0386166000908152600460205260409020549091506124119082611d30565b6001600160a01b0380871660009081526004602052604080822093909355908616815220546124409082611c82565b6001600160a01b0380861660008181526004602052604090819020939093559151908716906000805160206132ba833981519152906124829087815260200190565b60405180910390a35050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124c6576124c6613238565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561253f57600080fd5b505afa158015612553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125779190612db3565b8160018151811061258a5761258a613238565b60200260200101906001600160a01b031690816001600160a01b0316815250506125d5307f000000000000000000000000000000000000000000000000000000000000000084611543565b600d54600090612601906064906125f09060ff16600a6130da565b6125fb906001613185565b90611501565b60405163791ac94760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906126589086908590879030904290600401612ffc565b600060405180830381600087803b15801561267257600080fd5b505af1158015612686573d6000803e3d6000fd5b50505050505050565b6126ba307f000000000000000000000000000000000000000000000000000000000000000084611543565b60035460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526101009091046001600160a01b0390811660848301524260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990839060c4016060604051808303818588803b15801561274857600080fd5b505af115801561275c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127819190612ed1565b5050505050565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561280257600080fd5b505afa158015612816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283a9190612db3565b8160008151811061284d5761284d613238565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061288157612881613238565b6001600160a01b0390921660209283029190910190910152600d546000906128b4906064906125f09060ff16600a6130da565b6003549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163b6f9de95918691859187916101009004166129044261012c611c82565b6040518663ffffffff1660e01b81526004016129239493929190612fc7565b6000604051808303818588803b15801561293c57600080fd5b505af1158015612950573d6000803e3d6000fd5b5050505050505050565b600d54610100900460ff1615801561297c5750600d546301000000900460ff16155b80156129925750600d54600160281b900460ff16155b80156129a85750600d54600160381b900460ff16155b80156129be5750600d54600160481b900460ff16155b156129c557565b600d80546affff00ff00ff00ff00ff001968ff00ff0000000000001964ff00ff000019831664ff0000000019610100850460ff908116620100000291821692909217630100000062ff000019909616909117949094048116640100000000029390931790811668ff000000000000000019600160281b8304851666010000000000000290811691909117600160381b66ff00000000000019909316909117919091048316600160401b0217908116600160481b909104909116600160501b0269ff00ff00ff00ff00ff001916179055565b600080600080600080612aa887611ce1565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612ada9087611d30565b6001600160a01b03808b1660009081526004602052604080822093909355908a1681522054612b099086611c82565b6001600160a01b038916600090815260046020526040902055612b2b81612cef565b612b358483612d39565b876001600160a01b0316896001600160a01b03166000805160206132ba83398151915285604051612b6891815260200190565b60405180910390a3505050505050505050565b600d54600090610a57906064906125fb908590610100900460ff16611482565b600d54600090610a57906064906125fb9060ff600160481b8204811691600160381b8104821691612bde91600160281b8104821691630100000090910416613050565b612be89190613050565b612bf29190613050565b859060ff16611482565b6060612c0785612d5d565b612c535760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a9f565b600080866001600160a01b03168587604051612c6f9190612f43565b60006040518083038185875af1925050503d8060008114612cac576040519150601f19603f3d011682016040523d82523d6000602084013e612cb1565b606091505b50915091508115612cc55791506123cb9050565b805115612cd55780518082602001fd5b8360405162461bcd60e51b8152600401610a9f9190612f5f565b6000612cf9611c5f565b90506000612d078383611482565b30600090815260046020526040902054909150612d249082611c82565b30600090815260046020526040902055505050565b600954612d469083611d30565b600955600a54612d569082611c82565b600a555050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906123cb575050151592915050565b600060208284031215612da857600080fd5b8135610bdb8161324e565b600060208284031215612dc557600080fd5b8151610bdb8161324e565b60008060408385031215612de357600080fd5b8235612dee8161324e565b91506020830135612dfe8161324e565b809150509250929050565b600080600060608486031215612e1e57600080fd5b8335612e298161324e565b92506020840135612e398161324e565b929592945050506040919091013590565b60008060408385031215612e5d57600080fd5b8235612e688161324e565b946020939093013593505050565b600060208284031215612e8857600080fd5b8151610bdb81613263565b600060208284031215612ea557600080fd5b5035919050565b60008060408385031215612ebf57600080fd5b823591506020830135612dfe81613263565b600080600060608486031215612ee657600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b83811015612f385781516001600160a01b031687529582019590820190600101612f13565b509495945050505050565b60008251612f558184602087016131bb565b9190910192915050565b6020815260008251806020840152612f7e8160408501602087016131bb565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b848152608060208201526000612fe06080830186612eff565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061301b60a0830186612eff565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561304b5761304b613222565b500190565b600060ff821660ff84168060ff0382111561306d5761306d613222565b019392505050565b60008261309257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156130d25781600019048211156130b8576130b8613222565b808516156130c557918102915b93841c939080029061309c565b509250929050565b6000610bdb60ff8416836000826130f357506001610a57565b8161310057506000610a57565b816001811461311657600281146131205761313c565b6001915050610a57565b60ff84111561313157613131613222565b50506001821b610a57565b5060208310610133831016604e8410600b841016171561315f575081810a610a57565b6131698383613097565b806000190482111561317d5761317d613222565b029392505050565b600081600019048311821515161561319f5761319f613222565b500290565b6000828210156131b6576131b6613222565b500390565b60005b838110156131d65781810151838201526020016131be565b83811115611eb45750506000910152565b600181811c908216806131fb57607f821691505b6020821081141561321c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610bec57600080fd5b8015158114610bec57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fc1ff6d1929ac97f9e8636c498fb9f791a71f62b986af5550c86e702c7549af964736f6c63430008060033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for
interesting conversations.