Contract
0x990a524EBc0A54fd2A7ebC02A1CE54D309fb5CD3
7
Polygon Sponsored slots available. Book your slot here!
[ Download CSV Export ]
OVERVIEW
Cypherdog offers secure file transfer, cloud storage, and messaging with no third-party access to data and absolute protection of the private key for business and private use.Contract Name:
CypherDogToken
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ // SPDX-License-Identifier: MIT // based on https://github.com/CoinbaseStablecoin/eip-3009 pragma solidity ^0.8.0; abstract contract EIP712Domain { /** * @dev EIP712 Domain Separator */ bytes32 public DOMAIN_SEPARATOR; uint256 public CHAINID; bytes32 public EIP712_DOMAIN_TYPEHASH; } error InvalidSignature(); error InvalidS(); error InvalidV(); /** * @title ECRecover * @notice A library that provides a safe ECDSA recovery function */ library ECRecover { /** * @notice Recover signer's address from a signed message * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/65e4ffde586ec89af3b7e9140bdc9235d1254853/contracts/cryptography/ECDSA.sol * Modifications: Accept v, r, and s as separate arguments * @param digest Keccak-256 hash digest of the signed message * @param v v of the signature * @param r r of the signature * @param s s of the signature * @return Signer address */ function recover( bytes32 digest, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { revert InvalidS(); } if (v < 27 || v > 28) { revert InvalidV(); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(digest, v, r, s); if (signer == address(0)) revert InvalidSignature(); return signer; } } /** * @title EIP712 * @notice A library that provides EIP712 helper functions */ library EIP712 { // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") bytes32 public constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; /** * @notice Make EIP712 domain separator * @param name Contract name * @param version Contract version * @return Domain separator */ function makeDomainSeparator( string memory name, string memory version, uint256 chainId ) internal view returns (bytes32) { return keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), chainId, address(this) ) ); } /** * @notice Recover signer's address from a EIP712 signature * @param domainSeparator Domain separator * @param v v of the signature * @param r r of the signature * @param s s of the signature * @param typeHashAndData Type hash concatenated with data * @return Signer's address */ function recover( bytes32 domainSeparator, uint8 v, bytes32 r, bytes32 s, bytes memory typeHashAndData ) internal pure returns (address) { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, keccak256(typeHashAndData) ) ); return ECRecover.recover(digest, v, r, s); } } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; /** Internal functions from ERC20 token to be used for IEP2612 and IEP3009 */ abstract contract ERC20Internal { // internal _approve call function _approve( address owner, address spender, uint256 amount ) internal virtual; // internal _transfer call function _transfer( address from, address to, uint256 amount ) internal virtual; } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; /** Ownership contract Modified https://eips.ethereum.org/EIPS/eip-173 A confirmation of ownership transfer has been added to prevent ownership from being transferred to the wrong address */ contract Ownable { /// Current contract owner address public owner; /// New contract owner to be confirmed address public newOwner; /// Emit on every owner change event OwnershipChanged(address indexed from, address indexed to); /** Set default owner as contract deployer */ constructor() { owner = msg.sender; } /** Use this modifier to limit function to contract owner */ modifier onlyOwner() { require(msg.sender == owner, "Only for Owner"); _; } /** Prepare to change ownersip. New owner need to confirm it. @param user address delegated to be new contract owner */ function giveOwnership(address user) external onlyOwner { require(user != address(0x0), "renounceOwnership() instead"); newOwner = user; } /** Accept contract ownership by new owner. */ function acceptOwnership() external { require( newOwner != address(0x0) && msg.sender == newOwner, "Only newOwner can accept" ); emit OwnershipChanged(owner, newOwner); owner = newOwner; newOwner = address(0x0); } /** Renounce ownership of the contract. Any function uses "onlyOwner" modifier will be inaccessible. */ function renounceOwnership() external onlyOwner { emit OwnershipChanged(owner, address(0x0)); owner = address(0x0); } } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; /** Full ERC20 interface */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * ////////IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev 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); /** * @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 ); } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // Following https://eips.ethereum.org/EIPS/eip-3009 // based on https://github.com/CoinbaseStablecoin/eip-3009 pragma solidity ^0.8.0; ////import "./ERC20Internal.sol"; ////import "./EIP712.sol"; /** EIP3009 implementation */ abstract contract ERC3009 is ERC20Internal, EIP712Domain { // events event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); event AuthorizationCanceled( address indexed authorizer, bytes32 indexed nonce ); // constant typehashes // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)") bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267; // keccak256("ReceiveWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)") bytes32 public constant RECEIVE_WITH_AUTHORIZATION_TYPEHASH = 0xd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8; // keccak256("CancelAuthorization(address authorizer,bytes32 nonce)") bytes32 public constant CANCEL_AUTHORIZATION_TYPEHASH = 0x158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429; // errors error AuthorizationReused(); error CallerMustBeThePayee(); error AuthorizationIsNotYetValid(); error AuthorizationExpired(); /** * @dev authorizer address => nonce => state (true = used / false = unused) */ mapping(address => mapping(bytes32 => bool)) internal _authorizationStates; // viewers /** * @notice Returns the state of an authorization * @dev Nonces are randomly generated 32-byte data unique to the authorizer's * address * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @return True if the nonce is used */ function authorizationState(address authorizer, bytes32 nonce) external view returns (bool) { return _authorizationStates[authorizer][nonce]; } // functions /** * @notice Execute a transfer with a signed authorization * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function transferWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) external { _transferWithAuthorization( TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce, v, r, s ); } /** * @notice Receive a transfer with a signed authorization from the payer * @dev This has an additional check to ensure that the payee's address matches * the caller of this function to prevent front-running attacks. (See security * considerations) * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function receiveWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) external { if (to != msg.sender) revert CallerMustBeThePayee(); _transferWithAuthorization( RECEIVE_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce, v, r, s ); } function _transferWithAuthorization( bytes32 typeHash, address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) internal { uint256 timeNow = block.timestamp; if (timeNow < validAfter) revert AuthorizationIsNotYetValid(); if (timeNow > validBefore) revert AuthorizationExpired(); if (_authorizationStates[from][nonce]) revert AuthorizationReused(); bytes memory data = abi.encode( typeHash, from, to, value, validAfter, validBefore, nonce ); if (EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) != from) revert InvalidSignature(); _authorizationStates[from][nonce] = true; emit AuthorizationUsed(from, nonce); _transfer(from, to, value); } /** * @notice Attempt to cancel an authorization * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function cancelAuthorization( address authorizer, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) external { if (_authorizationStates[authorizer][nonce]) revert AuthorizationReused(); bytes memory data = abi.encode( CANCEL_AUTHORIZATION_TYPEHASH, authorizer, nonce ); if (EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) != authorizer) revert InvalidSignature(); _authorizationStates[authorizer][nonce] = true; emit AuthorizationCanceled(authorizer, nonce); } } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // Following https://eips.ethereum.org/EIPS/eip-2612 // based on https://github.com/CoinbaseStablecoin/eip-3009 pragma solidity ^0.8.0; ////import "./ERC20Internal.sol"; ////import "./EIP712.sol"; /** EIP2612 implementation */ abstract contract ERC2612 is ERC20Internal, EIP712Domain { // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) internal _nonces; error PermitExpired(); /** * @notice Nonces for permit * @param owner Token owner's address * @return Next nonce */ function nonces(address owner) external view returns (uint256) { return _nonces[owner]; } /** * @notice update allowance with a signed permit * @param owner Token owner's address (Authorizer) * @param spender Spender's address * @param value Amount of allowance * @param deadline The time at which this expires (unix time) * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { if (deadline < block.timestamp) revert PermitExpired(); bytes memory data = abi.encode( PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline ); if (EIP712.recover(DOMAIN_SEPARATOR, v, r, s, data) != owner) revert InvalidSignature(); _approve(owner, spender, value); } } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "./IERC20.sol"; ////import "./Ownable.sol"; /** ERC20 token and native coin recovery functions */ abstract contract Recoverable is Ownable { error NothingToRecover(); /// Recover native coin from contract function recoverETH() external onlyOwner { uint256 amt = address(this).balance; if (amt == 0) revert NothingToRecover(); payable(owner).transfer(amt); } /// Recover ERC20 token from contract function recoverERC20(address token) external virtual onlyOwner { uint256 amt = IERC20(token).balanceOf(address(this)); if (amt == 0) revert NothingToRecover(); IERC20(token).transfer(owner, amt); } } /** * SourceUnit: cypherdog/contracts/CypherDogToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.10; ////import "./IERC20.sol"; ////import "./Recovery.sol"; ////import "./ERC20Internal.sol"; ////import "./ERC2612.sol"; ////import "./ERC3009.sol"; contract CypherDogToken is IERC20, ERC20Internal, Recoverable, ERC2612, ERC3009 { /** part of transaction fee that will be burned until reach minTotalSupply */ uint256 public burnFees = 5; /** Part of transaction fee that is distributed among hodlers */ uint256 public constant rewardFees = 5; /** Minimum total supply, when reached burning stops */ uint256 public immutable minTotalSupply; struct Summary { uint256 totalExcluded; // total held by excluded accounts uint256 totalHolding; // total held by holder accounts uint256 totalRewards; // total rewards uint256 totalSupply; // total supply } // metadata string public constant override name = "CYPHER.DOG"; string public constant override symbol = "CDOG"; uint8 public constant override decimals = 18; Summary public summary; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _excluded; // events /** * @dev Emitted when fees are updated * @param burnFees burn fees * @param rewardFees rewards fees */ event FeesUpdated(uint256 burnFees, uint256 rewardFees); /** * @dev Emitted when account is excluded * @param account account address */ event AccountExcluded(address indexed account); /** * @dev Emitted when total rewards amount is updated * @param totalRewards total rewards amount */ event TotalRewardsUpdated(uint256 totalRewards); // // error messages // error OnlyExcludedCanBurn(); error ZeroAddressDisallowed(); error FeesToHigh(); error AllowanceToLow(); error NothingToChange(); error BalanceToLow(); error MinimumSupplyReached(); // // modifiers // modifier notZeroAddress(address user) { if (user == address(0)) revert ZeroAddressDisallowed(); _; } /** @dev Initializes the contract @param _minTotalSupply min total supply @param _supply total supply of tokens minted to owner */ constructor( uint256 _minTotalSupply, uint256 _supply, address[] memory _excluded_ ) { minTotalSupply = _minTotalSupply; // excludes owner account _excluded[msg.sender] = true; emit AccountExcluded(msg.sender); // mint supply _balances[msg.sender] = _supply; summary.totalExcluded = _supply; summary.totalSupply = _supply; emit Transfer(address(0), msg.sender, _supply); // adds predefined excluded accounts uint256 _excludedLen = _excluded_.length; uint256 index; for (index; index < _excludedLen; index++) { address user = _excluded_[index]; _excluded[user] = true; emit AccountExcluded(user); } // initialize EIP712 uint256 chainId = block.chainid; DOMAIN_SEPARATOR = EIP712.makeDomainSeparator(name, "1", chainId); CHAINID = chainId; EIP712_DOMAIN_TYPEHASH = EIP712.EIP712_DOMAIN_TYPEHASH; } // // external functions // /** * @dev Excludes account from paying fees * @param account account address */ function excludeAccount(address account) external onlyOwner { if (_excluded[account]) revert NothingToChange(); uint256 balance = _balances[account]; if (balance > 0) { // we need to kind of _transferToExcludedAccount uint256 toExcluded = balance; if (summary.totalRewards != 0) { uint256 rewards = _calcRewards(account); toExcluded += rewards; _balances[account] += rewards; } summary.totalExcluded += toExcluded; summary.totalHolding -= balance; } _excluded[account] = true; emit AccountExcluded(account); } /** * @dev Approve spending limit * @param spender spender address * @param amount spending limit */ function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev Burns tokens from msg.sender * @param amount tokens amount */ function burn(uint256 amount) external { if (!_excluded[msg.sender]) revert OnlyExcludedCanBurn(); //ERC20 allows to send 0, so we allow to burn 0 if (amount > 0) { if (_balances[msg.sender] < amount) revert BalanceToLow(); summary.totalSupply -= amount; _balances[msg.sender] -= amount; summary.totalExcluded -= amount; } emit Transfer(msg.sender, address(0), amount); } /** * @dev Transfers tokens to recipient * @param recipient recipient address * @param amount tokens amount */ function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev Transfers tokens from sender to recipient * @param sender sender address * @param recipient recipient address * @param amount tokens amount */ function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { uint256 _allowance = _allowances[sender][msg.sender]; if (_allowance < amount) revert AllowanceToLow(); if (_allowance < type(uint256).max) { unchecked { _allowance -= amount; } _allowances[sender][msg.sender] = _allowance; } _transfer(sender, recipient, amount); return true; } // // external functions (views) // /** * @dev Gets excluded account * @param account account address */ function getExcludedAccount(address account) external view returns (bool) { return (_excluded[account]); } /** * @dev Gets total supply * @return total supply */ function totalSupply() external view override returns (uint256) { return summary.totalSupply; } /** * @dev Gets allowance * @param sender address * @param spender address * @return allowance */ function allowance(address sender, address spender) external view override returns (uint256) { return _allowances[sender][spender]; } /** * @dev Gets balance of * @param account account address * @return result account balance */ function balanceOf(address account) external view override returns (uint256) { return _balances[account] + _calcRewards(account); } /** * @dev Gets balance summary * @param account account address */ function getBalanceSummary(address account) external view returns ( uint256 totalBalance, uint256 holdingBalance, uint256 totalRewards ) { holdingBalance = _balances[account]; totalRewards = _calcRewards(account); totalBalance = holdingBalance + totalRewards; return (totalBalance, holdingBalance, totalRewards); } // // private functions // function _approve( address sender, address spender, uint256 amount ) internal override notZeroAddress(spender) { _allowances[sender][spender] = amount; emit Approval(sender, spender, amount); } function _transfer( address sender, address recipient, uint256 amount ) internal override notZeroAddress(sender) notZeroAddress(recipient) { //ERC20 allows to send 0 tokens if (amount > 0) { if (_excluded[sender]) { if (_excluded[recipient]) { _transferBetweenExcludedAccounts(sender, recipient, amount); } else _transferFromExcludedAccount(sender, recipient, amount); } else if (_excluded[recipient]) { _transferToExcludedAccount(sender, recipient, amount); } else _transferBetweenHolderAccounts(sender, recipient, amount); } else emit Transfer(sender, recipient, amount); } function _transferBetweenHolderAccounts( address sender, address recipient, uint256 amount ) private { uint256 senderAmount; uint256 recipientAmount = amount; uint256 burnFee; uint256 totalFee; Summary memory s = summary; uint256 totalSupply_ = s.totalSupply; (totalFee, burnFee) = _calcTransferFees(amount); (totalSupply_, totalFee, burnFee) = _matchTotalSupplyWithFees( totalSupply_, totalFee, burnFee ); senderAmount = amount + totalFee; // appends total rewards if (s.totalRewards != 0) { uint256 inclRewards = s.totalHolding + s.totalRewards; unchecked { senderAmount = (senderAmount * s.totalHolding) / inclRewards; recipientAmount = (recipientAmount * s.totalHolding) / inclRewards; totalFee = (totalFee * s.totalHolding) / inclRewards; } } uint256 currSender = _balances[sender]; if (currSender < senderAmount) revert BalanceToLow(); unchecked { _balances[sender] = currSender - senderAmount; _balances[recipient] += recipientAmount; summary.totalSupply = totalSupply_; summary.totalHolding = s.totalHolding - totalFee; } emit Transfer(sender, recipient, amount); if (burnFee > 0) { emit Transfer(sender, address(0), burnFee); } _updateTotalRewards(); } function _transferFromExcludedAccount( address sender, address recipient, uint256 amount ) private { uint256 currSender = _balances[sender]; if (currSender < amount) revert BalanceToLow(); unchecked { _balances[sender] = currSender - amount; _balances[recipient] += amount; summary.totalExcluded -= amount; summary.totalHolding += amount; } emit Transfer(sender, recipient, amount); _updateTotalRewards(); } function _transferToExcludedAccount( address sender, address recipient, uint256 amount ) private { uint256 totalFee; uint256 burnFee; Summary memory s = summary; uint256 totalSupply_ = s.totalSupply; (totalFee, burnFee) = _calcTransferFees(amount); (totalSupply_, totalFee, burnFee) = _matchTotalSupplyWithFees( totalSupply_, totalFee, burnFee ); uint256 senderAmount = amount + totalFee; // append total rewards if (s.totalRewards != 0) { uint256 totalHolding = s.totalHolding; unchecked { senderAmount = (senderAmount * totalHolding) / (totalHolding + s.totalRewards); } } uint256 currSender = _balances[sender]; if (currSender < senderAmount) revert BalanceToLow(); unchecked { _balances[sender] = currSender - senderAmount; _balances[recipient] += amount; summary.totalSupply = totalSupply_; summary.totalExcluded = s.totalExcluded + amount; summary.totalHolding = s.totalHolding - senderAmount; } emit Transfer(sender, recipient, amount); if (burnFee > 0) { emit Transfer(sender, address(0), burnFee); } _updateTotalRewards(); } function _transferBetweenExcludedAccounts( address sender, address recipient, uint256 amount ) private { uint256 currSender = _balances[sender]; if (currSender < amount) revert BalanceToLow(); unchecked { _balances[sender] = currSender - amount; _balances[recipient] += amount; } emit Transfer(sender, recipient, amount); } function _calcTransferFees(uint256 amount) private view returns (uint256 totalFee, uint256 burnFee) { burnFee = _percent(amount, burnFees); totalFee = _percent(amount, rewardFees) + burnFee; } function _updateTotalRewards() private { // totalRewards = totalSupply - totalExcluded - totalHolding uint256 totalRewards = summary.totalSupply - summary.totalExcluded - summary.totalHolding; if (totalRewards != summary.totalRewards) { summary.totalRewards = totalRewards; emit TotalRewardsUpdated(totalRewards); } } function _matchTotalSupplyWithFees( uint256 totalSupply_, uint256 totalFee, uint256 burnFee ) private returns ( uint256, uint256, uint256 ) { if (burnFee != 0) { uint256 newTotalSupply = totalSupply_ - burnFee; if (newTotalSupply >= minTotalSupply) { totalSupply_ = newTotalSupply; } else { // turn off burn fee, this will happen only once burnFees = 0; // are we still over minimum at start? if (totalSupply_ > minTotalSupply) { totalSupply_ = minTotalSupply; // refund burn fee difference uint256 diff = minTotalSupply - newTotalSupply; burnFee -= diff; totalFee += diff; } else { // it was already under minimum - refund burn fee totalFee -= burnFee; burnFee = 0; } } } return (totalSupply_, totalFee, burnFee); } // // private functions (views) // function _calcRewards(address account) private view returns (uint256 result) { Summary memory s = summary; if ( !_excluded[account] && s.totalRewards != 0 // only for holders ) { result = (s.totalRewards * _balances[account]) / s.totalHolding; } } // // private functions (pure) // /** Calculate given percent (1/100) of amount. @param amount to divide @param pct percent to calculate @return result caluclated value */ function _percent(uint256 amount, uint256 pct) internal pure returns (uint256 result) { if (pct == 0 || amount == 0) { return result; } result = (amount * pct) / 100; } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_minTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"address[]","name":"_excluded_","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceToLow","type":"error"},{"inputs":[],"name":"AuthorizationExpired","type":"error"},{"inputs":[],"name":"AuthorizationIsNotYetValid","type":"error"},{"inputs":[],"name":"AuthorizationReused","type":"error"},{"inputs":[],"name":"BalanceToLow","type":"error"},{"inputs":[],"name":"CallerMustBeThePayee","type":"error"},{"inputs":[],"name":"FeesToHigh","type":"error"},{"inputs":[],"name":"InvalidS","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidV","type":"error"},{"inputs":[],"name":"MinimumSupplyReached","type":"error"},{"inputs":[],"name":"NothingToChange","type":"error"},{"inputs":[],"name":"NothingToRecover","type":"error"},{"inputs":[],"name":"OnlyExcludedCanBurn","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"ZeroAddressDisallowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountExcluded","type":"event"},{"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":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardFees","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalRewards","type":"uint256"}],"name":"TotalRewardsUpdated","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":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHAINID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","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":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"burnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getBalanceSummary","outputs":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"holdingBalance","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getExcludedAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"giveOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"summary","outputs":[{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"totalHolding","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405260056007553480156200001657600080fd5b50604051620023d1380380620023d1833981016040819052620000399162000262565b600080546001600160a01b0319163390811782556080859052808252600e6020526040808320805460ff191660011790555190916000805160206200239183398151915291a2336000818152600c602090815260408083208690556008869055600b869055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3805160005b818110156200014f576000838281518110620000f257620000f26200034b565b6020908102919091018101516001600160a01b0381166000818152600e9093526040808420805460ff1916600117905551919350916000805160206200239183398151915291a25080620001468162000361565b915050620000d2565b6000469050620001a76040518060400160405280600a8152602001694359504845522e444f4760b01b815250604051806040016040528060018152602001603160f81b81525083620001cc60201b6200100b1760201c565b6002556003555050600080516020620023b1833981519152600455506200038b915050565b825160209384012082519284019290922060408051600080516020620023b18339815191528187015280820194909452606084019190915260808301919091523060a0808401919091528151808403909101815260c09092019052805191012090565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200025d57600080fd5b919050565b6000806000606084860312156200027857600080fd5b835160208086015160408701519295509350906001600160401b0380821115620002a157600080fd5b818701915087601f830112620002b657600080fd5b815181811115620002cb57620002cb6200022f565b8060051b604051601f19603f83011681018181108582111715620002f357620002f36200022f565b60405291825284820192508381018501918a8311156200031257600080fd5b938501935b828510156200033b576200032b8562000245565b8452938501939285019262000317565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200038457634e487b7160e01b600052601160045260246000fd5b5060010190565b608051611fd5620003bc6000396000818161039401528181611ae401528181611b180152611b400152611fd56000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637f2eecc311610130578063d4ee1d90116100b8578063e3a0a1481161007c578063e3a0a1481461059b578063e3ee160e146105ae578063e94a0102146105c1578063ef55bec6146105fa578063f2cc0c181461060d57600080fd5b8063d4ee1d90146104e9578063d505accf146104fc578063d91694871461050f578063da498b8314610536578063dd62ed3e1461056257600080fd5b8063a0cc6a68116100ff578063a0cc6a6814610467578063a9059cbb1461048e578063b16a867c146104a1578063c7977be7146104d7578063cc79f97b146104e057600080fd5b80637f2eecc3146103df5780638da5cb5b1461040657806395d89b41146104315780639e8c708e1461045457600080fd5b80633644e515116101b357806370a082311161018257806370a082311461036c578063715018a61461037f57806379ba50971461038757806379db63461461038f5780637ecebe00146103b657600080fd5b80633644e5151461033457806340f6ac311461033d57806342966c68146103465780635a049a701461035957600080fd5b806323b872dd116101fa57806323b872dd146102aa5780632bf8e8f6146102bd5780632d380315146102c557806330adf81f146102f3578063313ce5671461031a57600080fd5b80630614117a1461022c57806306fdde0314610236578063095ea7b31461027557806318160ddd14610298575b600080fd5b610234610620565b005b61025f6040518060400160405280600a8152602001694359504845522e444f4760b01b81525081565b60405161026c9190611be0565b60405180910390f35b610288610283366004611c51565b6106af565b604051901515815260200161026c565b600b545b60405190815260200161026c565b6102886102b8366004611c7b565b6106c6565b61029c600581565b6102d86102d3366004611cb7565b610757565b6040805193845260208401929092529082015260600161026c565b61029c7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610322601281565b60405160ff909116815260200161026c565b61029c60025481565b61029c60075481565b610234610354366004611cd2565b61078e565b610234610367366004611cfc565b610876565b61029c61037a366004611cb7565b6109b2565b6102346109e0565b610234610a54565b61029c7f000000000000000000000000000000000000000000000000000000000000000081565b61029c6103c4366004611cb7565b6001600160a01b031660009081526005602052604090205490565b61029c7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de881565b600054610419906001600160a01b031681565b6040516001600160a01b03909116815260200161026c565b61025f6040518060400160405280600481526020016343444f4760e01b81525081565b610234610462366004611cb7565b610b28565b61029c7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b61028861049c366004611c51565b610c59565b600854600954600a54600b546104b79392919084565b60408051948552602085019390935291830152606082015260800161026c565b61029c60045481565b61029c60035481565b600154610419906001600160a01b031681565b61023461050a366004611d4a565b610c66565b61029c7f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742981565b610288610544366004611cb7565b6001600160a01b03166000908152600e602052604090205460ff1690565b61029c610570366004611db4565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b6102346105a9366004611cb7565b610d76565b6102346105bc366004611de7565b610e18565b6102886105cf366004611c51565b6001600160a01b03919091166000908152600660209081526040808320938352929052205460ff1690565b610234610608366004611de7565b610e55565b61023461061b366004611cb7565b610eb0565b6000546001600160a01b031633146106535760405162461bcd60e51b815260040161064a90611e65565b60405180910390fd5b47806106725760405163157474a960e31b815260040160405180910390fd5b600080546040516001600160a01b039091169183156108fc02918491818181858888f193505050501580156106ab573d6000803e3d6000fd5b5050565b60006106bc33848461107f565b5060015b92915050565b6001600160a01b0383166000908152600d602090815260408083203384529091528120548281101561070b5760405163a628c8ff60e01b815260040160405180910390fd5b600019811015610741576001600160a01b0385166000908152600d60209081526040808320338452909152902090839003908190555b61074c85858561110a565b506001949350505050565b6001600160a01b0381166000908152600c60205260408120548161077a84611237565b90506107868183611ea3565b949193509150565b336000908152600e602052604090205460ff166107be57604051630a7787c560e11b815260040160405180910390fd5b801561084d57336000908152600c60205260409020548111156107f457604051633d57bedb60e01b815260040160405180910390fd5b80600860030160008282546108099190611ebb565b9091555050336000908152600c60205260408120805483929061082d908490611ebb565b909155505060088054829190600090610847908490611ebb565b90915550505b6040518181526000903390600080516020611f808339815191529060200160405180910390a350565b6001600160a01b038516600090815260066020908152604080832087845290915290205460ff16156108bb57604051630b45e91560e11b815260040160405180910390fd5b604080517f158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a159742960208201526001600160a01b03871691810191909152606081018590526000906080016040516020818303038152906040529050856001600160a01b031661092d600254868686866112de565b6001600160a01b03161461095457604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0386166000818152600660209081526040808320898452909152808220805460ff19166001179055518792917f1cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d8191a3505050505050565b60006109bd82611237565b6001600160a01b0383166000908152600c60205260409020546106c09190611ea3565b6000546001600160a01b03163314610a0a5760405162461bcd60e51b815260040161064a90611e65565b600080546040516001600160a01b03909116907f0384899bd253d83b23daa4d29aaa2efe0563d1132b43101e9ad667235aeb951b908390a3600080546001600160a01b0319169055565b6001546001600160a01b031615801590610a7857506001546001600160a01b031633145b610ac45760405162461bcd60e51b815260206004820152601860248201527f4f6e6c79206e65774f776e65722063616e206163636570740000000000000000604482015260640161064a565b600154600080546040516001600160a01b0393841693909116917f0384899bd253d83b23daa4d29aaa2efe0563d1132b43101e9ad667235aeb951b91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b03163314610b525760405162461bcd60e51b815260040161064a90611e65565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd9190611ed2565b905080610bdd5760405163157474a960e31b815260040160405180910390fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611eeb565b505050565b60006106bc33848461110a565b42841015610c875760405163068568f360e21b815260040160405180910390fd5b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a919086610cd483611f0d565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040529050876001600160a01b0316610d3a600254868686866112de565b6001600160a01b031614610d6157604051638baa579f60e01b815260040160405180910390fd5b610d6c88888861107f565b5050505050505050565b6000546001600160a01b03163314610da05760405162461bcd60e51b815260040161064a90611e65565b6001600160a01b038116610df65760405162461bcd60e51b815260206004820152601b60248201527f72656e6f756e63654f776e657273686970282920696e73746561640000000000604482015260640161064a565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610e4a7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22678a8a8a8a8a8a8a8a8a611340565b505050505050505050565b6001600160a01b0388163314610e7e57604051639301fec360e01b815260040160405180910390fd5b610e4a7fd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de88a8a8a8a8a8a8a8a8a611340565b6000546001600160a01b03163314610eda5760405162461bcd60e51b815260040161064a90611e65565b6001600160a01b0381166000908152600e602052604090205460ff1615610f14576040516328e9001b60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600c60205260409020548015610fbe57600a54819015610f88576000610f4884611237565b9050610f548183611ea3565b6001600160a01b0385166000908152600c6020526040812080549294508392909190610f81908490611ea3565b9091555050505b8060086000016000828254610f9d9190611ea3565b909155505060098054839190600090610fb7908490611ebb565b9091555050505b6001600160a01b0382166000818152600e6020526040808220805460ff19166001179055517fc43ac1ed89a6611862c89bd827657f1406e2a407bc2be9eaa4844539d0b583ed9190a25050565b8251602093840120825192840192909220604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8187015280820194909452606084019190915260808301919091523060a0808401919091528151808403909101815260c09092019052805191012090565b816001600160a01b0381166110a757604051637e9a8a9560e01b815260040160405180910390fd5b6001600160a01b038481166000818152600d602090815260408083209488168084529482529182902086905590518581527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a350505050565b826001600160a01b03811661113257604051637e9a8a9560e01b815260040160405180910390fd5b826001600160a01b03811661115a57604051637e9a8a9560e01b815260040160405180910390fd5b82156111f4576001600160a01b0385166000908152600e602052604090205460ff16156111bd576001600160a01b0384166000908152600e602052604090205460ff16156111b2576111ad8585856114d0565b611230565b6111ad858585611558565b6001600160a01b0384166000908152600e602052604090205460ff16156111e9576111ad858585611607565b6111ad858585611777565b836001600160a01b0316856001600160a01b0316600080516020611f808339815191528560405161122791815260200190565b60405180910390a35b5050505050565b604080516080810182526008548152600954602080830191909152600a5482840152600b5460608301526001600160a01b0384166000908152600e9091529182205460ff1615801561128c5750604081015115155b156112d8578060200151600c6000856001600160a01b03166001600160a01b031681526020019081526020016000205482604001516112cb9190611f28565b6112d59190611f5d565b91505b50919050565b60008086838051906020012060405160200161131192919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506113358187878761192d565b979650505050505050565b428681101561136257604051635bc294d160e11b815260040160405180910390fd5b8581111561138357604051630f05f5bf60e01b815260040160405180910390fd5b6001600160a01b038a16600090815260066020908152604080832088845290915290205460ff16156113c857604051630b45e91560e11b815260040160405180910390fd5b60408051602081018d90526001600160a01b03808d1692820192909252908a1660608201526080810189905260a0810188905260c0810187905260e081018690526000906101000160405160208183030381529060405290508a6001600160a01b031661143a600254878787866112de565b6001600160a01b03161461146157604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b038b1660008181526006602090815260408083208a8452909152808220805460ff19166001179055518892917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36114c28b8b8b61110a565b505050505050505050505050565b6001600160a01b0383166000908152600c60205260409020548181101561150a57604051633d57bedb60e01b815260040160405180910390fd5b6001600160a01b038085166000818152600c60205260408082208686039055928616808252908390208054860190559151600080516020611f80833981519152906110fc9086815260200190565b6001600160a01b0383166000908152600c60205260409020548181101561159257604051633d57bedb60e01b815260040160405180910390fd5b6001600160a01b038085166000818152600c602052604080822086860390559286168082529083902080548601905560088054869003905560098054860190559151600080516020611f80833981519152906115f19086815260200190565b60405180910390a3611601611a34565b50505050565b6040805160808101825260085481526009546020820152600a5491810191909152600b5460608201819052600091829161164085611a9c565b9094509250611650818585611aca565b9095509350905060006116638587611ea3565b90508260400151600014611692576020830151604084015181018282028161168d5761168d611f47565b049150505b6001600160a01b0388166000908152600c6020526040902054818110156116cc57604051633d57bedb60e01b815260040160405180910390fd5b6001600160a01b03808a166000818152600c602090815260408083208787039055938c168083529184902080548c019055600b87905587518b016008558701518590036009559151600080516020611f8083398151915290611731908b815260200190565b60405180910390a3841561176f576040518581526000906001600160a01b038b1690600080516020611f808339815191529060200160405180910390a35b610e4a611a34565b6040805160808101825260085481526009546020820152600a5491810191909152600b54606082018190526000918391839182916117b485611a9c565b945092506117c3818486611aca565b9550935090506117d38388611ea3565b95508160400151600014611843576000826040015183602001516117f79190611ea3565b905080836020015188028161180e5761180e611f47565b04965080836020015187028161182657611826611f47565b04955080836020015185028161183e5761183e611f47565b049350505b6001600160a01b0389166000908152600c60205260409020548681101561187d57604051633d57bedb60e01b815260040160405180910390fd5b6001600160a01b03808b166000818152600c602090815260408083208c87039055938d168083529184902080548b019055600b8690558601518790036009559151600080516020611f80833981519152906118db908c815260200190565b60405180910390a38415611919576040518581526000906001600160a01b038c1690600080516020611f808339815191529060200160405180910390a35b611921611a34565b50505050505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611970576040516308183ce960e31b815260040160405180910390fd5b601b8460ff1610806119855750601c8460ff16115b156119a35760405163119bce3960e01b815260040160405180910390fd5b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156119f7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a2b57604051638baa579f60e01b815260040160405180910390fd5b95945050505050565b600954600854600b5460009291611a4a91611ebb565b611a549190611ebb565b600a549091508114611a9957600a8190556040518181527f8629690313970e9e42939fc905246bd1ff3a69dae5efc961f8b40a91a838dffe9060200160405180910390a15b50565b600080611aab83600754611bac565b905080611ab9846005611bac565b611ac39190611ea3565b9150915091565b600080808315611ba0576000611ae08588611ebb565b90507f00000000000000000000000000000000000000000000000000000000000000008110611b1157809650611b9e565b60006007557f0000000000000000000000000000000000000000000000000000000000000000871115611b8d577f000000000000000000000000000000000000000000000000000000000000000096506000611b6d8289611ebb565b9050611b798187611ebb565b9550611b858188611ea3565b965050611b9e565b611b978587611ebb565b9550600094505b505b50939492935090919050565b6000811580611bb9575082155b15611bc3576106c0565b6064611bcf8385611f28565b611bd99190611f5d565b9392505050565b600060208083528351808285015260005b81811015611c0d57858101830151858201604001528201611bf1565b81811115611c1f576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611c4c57600080fd5b919050565b60008060408385031215611c6457600080fd5b611c6d83611c35565b946020939093013593505050565b600080600060608486031215611c9057600080fd5b611c9984611c35565b9250611ca760208501611c35565b9150604084013590509250925092565b600060208284031215611cc957600080fd5b611bd982611c35565b600060208284031215611ce457600080fd5b5035919050565b803560ff81168114611c4c57600080fd5b600080600080600060a08688031215611d1457600080fd5b611d1d86611c35565b945060208601359350611d3260408701611ceb565b94979396509394606081013594506080013592915050565b600080600080600080600060e0888a031215611d6557600080fd5b611d6e88611c35565b9650611d7c60208901611c35565b95506040880135945060608801359350611d9860808901611ceb565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611dc757600080fd5b611dd083611c35565b9150611dde60208401611c35565b90509250929050565b60008060008060008060008060006101208a8c031215611e0657600080fd5b611e0f8a611c35565b9850611e1d60208b01611c35565b975060408a0135965060608a0135955060808a0135945060a08a01359350611e4760c08b01611ceb565b925060e08a013591506101008a013590509295985092959850929598565b6020808252600e908201526d27b7363c903337b91027bbb732b960911b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611eb657611eb6611e8d565b500190565b600082821015611ecd57611ecd611e8d565b500390565b600060208284031215611ee457600080fd5b5051919050565b600060208284031215611efd57600080fd5b81518015158114611bd957600080fd5b6000600019821415611f2157611f21611e8d565b5060010190565b6000816000190483118215151615611f4257611f42611e8d565b500290565b634e487b7160e01b600052601260045260246000fd5b600082611f7a57634e487b7160e01b600052601260045260246000fd5b50049056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f2055fbb0f74d201b89980371315d0ae685ac51285b213ec27d920defa54ca3b64736f6c634300080a0033c43ac1ed89a6611862c89bd827657f1406e2a407bc2be9eaa4844539d0b583ed8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f00000000000000000000000000000000000000000cecb8f27f4200f3a00000000000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000cecb8f27f4200f3a00000000000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _minTotalSupply (uint256): 4000000000000000000000000000
Arg [1] : _supply (uint256): 10000000000000000000000000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000cecb8f27f4200f3a0000000
Arg [1] : 0000000000000000000000000000000000000000204fce5e3e25026110000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
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.