Source Code
Overview
APE Balance
0 APE
More Info
ContractCreator
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10515555 | 32 days ago | Contract Creation | 0 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DividendTracker
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IDividendTracker} from "./IDividendTracker.sol"; import {IterableMapping} from "./IterableMapping.sol"; /** * @title Official gemlabs dividend tracker contract * @author The gemlabs crew | https://www.gemlabs.wtf | X: https://twitter.com/gemlabs_wtf | Telegram: https://t.me/gemlabs_wtf */ contract DividendTracker is Ownable, IDividendTracker { uint256 private constant MAGNITUDE = 2 ** 128; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; uint256 public totalSupply; uint256 public magnifiedDividendPerShare; uint256 public totalDividendsDistributed; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; mapping(address => bool) public excludedFromDividends; mapping(address => uint256) public lastClaimTimes; mapping(address => uint256) public tokenHolderBalances; mapping(address => int256) private magnifiedDividendCorrections; mapping(address => uint256) private withdrawnDividends; constructor(uint256 minimumTokenBalanceForDividends_) Ownable(msg.sender) { claimWait = 3600; minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_; } /** * @notice Excludes an account from receiving dividends. * @param account The address of the account to be excluded. * @dev Only callable by the owner (Dividend Token). */ function excludeFromDividends(address account) external onlyOwner { excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } /** * @notice Updates the waiting time between claims. * @param newClaimWait The new claim wait time in seconds. * @dev Only callable by the owner (Dividend Token). */ function updateClaimWait(uint256 newClaimWait) external onlyOwner { if (newClaimWait < 3600 || newClaimWait > 86400) { revert InvalidClaimWait(newClaimWait, 3600, 86400); } if (newClaimWait == claimWait) { revert ClaimWaitAlreadySet(newClaimWait); } claimWait = newClaimWait; emit ClaimWaitUpdated(newClaimWait, claimWait); } /** * @notice Retrieves the number of token holders. * @return uint256 The number of token holders. */ function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.keys.length; } /** * @notice Retrieves the token balance of a specific account. * @param account The address of the account. * @return uint256 The balance of the account. */ function getTokenHolderBalance(address account) external view returns (uint256) { return tokenHolderBalances[account]; } /** * @notice Retrieves account information for a specific account. * @param _account The address of the account. * @return account The address of the account. * @return index The index of the account in the token holders map. * @return iterationsUntilProcessed The number of iterations until the account is processed. * @return withdrawableDividends The amount of dividends that can be withdrawn by the account. * @return totalDividends The total amount of dividends earned by the account. * @return lastClaimTime The last time the account claimed dividends. * @return nextClaimTime The next time the account can claim dividends. * @return secondsUntilAutoClaimAvailable The number of seconds until the account can automatically claim dividends. */ function getAccount( address _account ) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable ) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index - int256(lastProcessedIndex); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length - lastProcessedIndex : 0; iterationsUntilProcessed = index + int256(processesUntilEndOfArray); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime + claimWait : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime - block.timestamp : 0; } /** * @notice Retrieves account information at a specific index. * @param index The index in the token holders map. * @return (see getAccount) */ function getAccountAtIndex( uint256 index ) external view returns (address, int256, int256, uint256, uint256, uint256, uint256, uint256) { if (index >= tokenHoldersMap.size()) { return (address(0), -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp - lastClaimTime >= claimWait; } /** * @notice Processes dividend claims for token holders within the specified gas limit. * @param gas The maximum amount of gas to be used for processing. * @return (uint256, uint256, uint256) Returns the number of iterations, the number of claims, and the last processed index. */ function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed + gasLeft - newGasLeft; } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } /** * @notice Processes the account for dividend withdrawal. * @param account The address of the account to process. * @param automatic A boolean indicating if the process was triggered automatically. * @return bool Returns true if dividends were withdrawn successfully, otherwise false. * @dev Only callable by the owner (Dividend Token). */ function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } /** * @notice Distributes the specified amount of dividends to token holders. * @param amount The amount of dividends to distribute. * @dev Only callable by the owner (Dividend Token). */ function distributeDividends(uint256 amount) public onlyOwner { if (totalSupply == 0) { revert NoTotalSupply(); } if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare + ((amount * MAGNITUDE) / totalSupply); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed + amount; } } /** * @notice Withdraws the dividend for the caller. * @dev Calls the internal function to handle the dividend withdrawal process. */ function withdrawDividend() external { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user] + _withdrawableDividend; bool success = _safeTransferETH(user, _withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); if (!success) { withdrawnDividends[user] = withdrawnDividends[user] - _withdrawableDividend; return 0; } return _withdrawableDividend; } return 0; } /** * @notice View the amount of dividend in wei that an address can withdraw. * @param _owner The address of a token holder. * @return The amount of dividend in wei that `_owner` can withdraw. */ function withdrawableDividendOf(address _owner) public view returns (uint256) { return accumulativeDividendOf(_owner) - (withdrawnDividends[_owner]); } /** * @notice View the amount of dividend in wei that an address has withdrawn. * @param _owner The address of a token holder. * @return The amount of dividend in wei that `_owner` has withdrawn. */ function withdrawnDividendOf(address _owner) public view returns (uint256) { return withdrawnDividends[_owner]; } /** * @notice View the amount of dividend in wei that an address has earned in total. * @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) * @param _owner The address of a token holder. * @return The amount of dividend in wei that `_owner` has earned in total. */ function accumulativeDividendOf(address _owner) public view returns (uint256) { uint256 balance = tokenHolderBalances[_owner]; int256 correction = magnifiedDividendCorrections[_owner]; int256 accumulatedDividend = int256(magnifiedDividendPerShare) * int256(balance) + correction; if (accumulatedDividend < 0) { return 0; } else { return uint256(accumulatedDividend) / MAGNITUDE; } } /** * @notice Gets the largest holder and their balance. * @return largestHolder The address of the largest holder. * @return largestBalance The balance of the largest holder. */ function getLargestHolder() external view returns (address largestHolder, uint256 largestBalance) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; largestBalance = 0; for (uint256 i = 0; i < numberOfTokenHolders; i++) { address account = tokenHoldersMap.keys[i]; uint256 balance = tokenHolderBalances[account]; if (balance > largestBalance) { largestBalance = balance; largestHolder = account; } } return (largestHolder, largestBalance); } /** * @notice Set the balance of an account and update dividend eligibility. * @param account The address of the account. * @param newBalance The new balance for the account. * @dev Only callable by the owner (Dividend Token). */ function setBalance(address payable account, uint256 newBalance) external onlyOwner { if (excludedFromDividends[account]) { return; } if (newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function _setBalance(address account, uint256 newBalance) private { uint256 currentBalance = tokenHolderBalances[account]; if (newBalance > currentBalance) { uint256 increaseAmount = newBalance - currentBalance; totalSupply += increaseAmount; tokenHolderBalances[account] += increaseAmount; magnifiedDividendCorrections[account] -= int256(increaseAmount * magnifiedDividendPerShare); } else if (newBalance < currentBalance) { uint256 decreaseAmount = currentBalance - newBalance; totalSupply -= decreaseAmount; tokenHolderBalances[account] -= decreaseAmount; magnifiedDividendCorrections[account] += int256(decreaseAmount * magnifiedDividendPerShare); } } function _safeTransferETH(address to, uint256 value) private returns (bool) { (bool success, ) = to.call{value: value, gas: 30_000}(new bytes(0)); return success; } receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // Factory: gemlabs pragma solidity ^0.8.24; interface IDividendTracker { event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); error InvalidClaimWait(uint256 provided, uint256 min, uint256 max); error ClaimWaitAlreadySet(uint256 provided); error NoTotalSupply(); function excludeFromDividends(address account) external; function updateClaimWait(uint256 newClaimWait) external; function getNumberOfTokenHolders() external view returns (uint256); function getTokenHolderBalance(address account) external view returns (uint256); function getAccount( address _account ) external view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable ); function getAccountAtIndex( uint256 index ) external view returns (address, int256, int256, uint256, uint256, uint256, uint256, uint256); function process(uint256 gas) external returns (uint256, uint256, uint256); function processAccount(address payable account, bool automatic) external returns (bool); function distributeDividends(uint256 amount) external; function withdrawDividend() external; function withdrawableDividendOf(address _owner) external view returns (uint256); function withdrawnDividendOf(address _owner) external view returns (uint256); function accumulativeDividendOf(address _owner) external view returns (uint256); function getLargestHolder() external view returns (address largestHolder, uint256 largestBalance); function setBalance(address payable account, uint256 newBalance) external; }
// SPDX-License-Identifier: MIT // Factory: gemlabs pragma solidity ^0.8.24; library IterableMapping { struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) internal view returns (uint) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) internal view returns (int) { if (!map.inserted[key]) { return -1; } return int(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint index) internal view returns (address) { return map.keys[index]; } function size(Map storage map) internal view returns (uint) { return map.keys.length; } function set(Map storage map, address key, uint val) internal { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) internal { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"uint256","name":"minimumTokenBalanceForDividends_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"ClaimWaitAlreadySet","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"InvalidClaimWait","type":"error"},{"inputs":[],"name":"NoTotalSupply","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distributeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLargestHolder","outputs":[{"internalType":"address","name":"largestHolder","type":"address"},{"internalType":"uint256","name":"largestBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTokenHolderBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"magnifiedDividendPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","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":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenHolderBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080346100bc57601f61131938819003918201601f19168301916001600160401b038311848410176100c1578084926020946040528339810103126100bc575133156100a35760008054336001600160a01b0319821681178355604051939290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3610e10600955600a5561124190816100d88239f35b604051631e4fbdf760e01b815260006004820152602490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001f575b505050361561001d57005b005b600090813560e01c90816309bbedde1461084e5750806318160ddd1461082f578063226cfa3d146107f557806327ce0147146107c45780633009a609146107a557806331e79db0146107245780633243c791146106605780633a7960e0146106415780634e7b827f146106025780635183d6fd146105e25780636a474002146105c45780636f2789ec146105a5578063715018a61461054b57806385a6b3ae1461052c5780638da5cb5b14610504578063a2ec70d2146103f4578063a8b9d240146104cc578063aafd847a14610492578063bc4c4b371461044d578063be10b6141461042e578063d3573e42146103f4578063e30443bc146103c0578063e98030c714610314578063f223273a14610296578063f2fde38b14610207578063fbcbc0f1146101845763ffb2c479036100125734610181576020366003190112610181575061016f60609235610e01565b91929081519384526020840152820152f35b80fd5b5091346102035760203660031901126102035735916001600160a01b038316830361018157506101b66101ff92610d30565b97516001600160a01b039097168752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e0810191909152908190610100820190565b0390f35b8280fd5b50919034610203576020366003190112610203576001600160a01b038235818116939192908490036102925761023b610f1b565b831561027c57505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b8480fd5b5034610181578060031936011261018157806001805482805b8281106102d057505084516001600160a01b03909416845250506020820152f35b6102d981610cca565b905460039190911b1c6001600160a01b0316808352600d60205287832054868111610308575b505083016102af565b909650945083886102ff565b50913461020357602036600319011261020357803591610332610f1b565b610e1080841080156103b4575b6103905750600954831461037b57505080600955807f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f8380a380f35b916024925191632c42b16760e01b8352820152fd5b90926064935192630100828360e11b84528301526024820152620151806044820152fd5b5062015180841161033f565b5090346103f057366003190112610181576103ed6103dc61086a565b6103e4610f1b565b60243590610ab6565b80f35b5080fd5b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600d845220549051908152f35b5090346103f057816003193601126103f057602090600a549051908152f35b5090346103f057806003193601126103f05761046761086a565b602435928315158403610181575060209261048991610484610f1b565b6109f5565b90519015158152f35b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600f845220549051908152f35b5091346102035760203660031901126102035735916001600160a01b038316830361018157506104fd6020926109c5565b9051908152f35b5090346103f057816003193601126103f057905490516001600160a01b039091168152602090f35b5090346103f057816003193601126103f0576020906008549051908152f35b5034610181578060031936011261018157610564610f1b565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5090346103f057816003193601126103f0576020906009549051908152f35b50346101815780600319360112610181576105de3361108c565b5080f35b503461018157602036600319011261018157506101b66101ff9235610965565b50913461020357602036600319011261020357356001600160a01b0381169081900361020357818360ff9260209552600b855220541690519015158152f35b5090346103f057816003193601126103f0576020906007549051908152f35b5090346103f05760203660031901126103f05782359061067e610f1b565b6006548015610714578215908115610694578480f35b60075491608085901b90600160801b868304141715610701576106f5959650906106c092910490610958565b600755518181527fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651160203392a2600854610958565b60085580388080808480f35b634e487b7160e01b865260118752602486fd5b8151636328a90f60e11b81528590fd5b50913461020357602036600319011261020357356001600160a01b03811691908281036107a15761077a91610757610f1b565b838552600b6020528420805460ff1916600117905561077581610f47565b610fad565b7fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b258280a280f35b8380fd5b5090346103f057816003193601126103f0576020906005549051908152f35b5091346102035760203660031901126102035735916001600160a01b038316830361018157506104fd6020926108b7565b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600c845220549051908152f35b5090346103f057816003193601126103f0576020906006549051908152f35b9050346103f057816003193601126103f0576020906001548152f35b600435906001600160a01b038216820361088057565b600080fd5b919091600083820193841291129080158216911516176108a157565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03166000908152600d6020908152604080832054600e90925282205460075490918181029190848212600160ff1b82141661093157818305149015171561091d579061090991610885565b81811215610915575090565b905060801c90565b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b85526011600452602485fd5b818102929181159184041417156108a157565b919082018092116108a157565b6001548110156109a25761097b61099291610cca565b905460039190911b1c6001600160a01b0316610d30565b9697959694959394929391929091565b5060009060001990819083908190819081908190565b919082039182116108a157565b6109f2906109d2816108b7565b6001600160a01b039091166000908152600f6020526040902054906109b8565b90565b906109ff8261108c565b9182610a0d57505050600090565b60207fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929160018060a01b03169283600052600c825242604060002055604051948552151593a3600190565b610a618161108c565b80610a6d575050600090565b7fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0926020600193848060a01b03169283600052600c825242604060002055604051908152a3600190565b6001600160a01b0381166000818152600b602090815260408083205494959460ff16610cc257600a548510610cac57838352600d8252808320548581811115610c4d57610b3591610b06916109b8565b610b1281600654610958565b600655858552600d8452828520610b2a828254610958565b905560075490610945565b848452600e8352610b4a828520918254610d17565b90555b6001600160a01b03841660009081526004602052604090205460ff1615610b9e575050506001600160a01b0316600090815260026020526040902055610b9b905b610b96610f1b565b610a58565b50565b6001600160a01b03841660009081526004602052604090209394600394805460ff191660011790556001600160a01b0386166000908152600260205260409020556001549384928685525282205568010000000000000000821015610c395750610b9b9291610c16826001610c349401600155610cca565b90919060018060a01b038084549260031b9316831b921b1916179055565b610b8e565b634e487b7160e01b81526041600452602490fd5b90808210610c5d575b5050610b4d565b610c8e91610c6a916109b8565b610c76816006546109b8565b600655858552600d8452828520610b2a8282546109b8565b848452600e8352610ca3828520918254610885565b90558438610c56565b505050610b9b92915080610775610c3492610f47565b505050505050565b600154811015610d015760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b818103929160001380158285131691841216176108a157565b9081610d3b816111b8565b916000199160009182851215610daa575b610d55826109c5565b92610d5f836108b7565b6001600160a01b039093168152600c6020526040812054918215610da457610d8960095484610958565b915b8242811115610da0576109f2915042906109b8565b5090565b81610d8b565b9250600554808511600014610dc957610dc39085610d17565b92610d4c565b60015481811115610de757610dc391610de1916109b8565b85610885565b5050610dc382610de1565b60001981146108a15760010190565b600191600154918215610f0d57916005549260005a90866000946000985b610e32575b505050505082600555929190565b90919293949685841080610f04575b15610efd57610e4f90610df2565b968254881015610ef4575b610e6388610cca565b60018060a01b0391549060031b1c1680600052600c602052610e896040600020546111ec565b610ec8575b50610e9890610df2565b945a94858111610eae575b509392919081610e1f565b85610ebd610ec2928697610958565b6109b8565b93610ea3565b610ed490610b96610f1b565b610edf575b38610e8e565b97610eec610e9891610df2565b989050610ed9565b60009750610e5a565b9694610e24565b50818810610e41565b506005546000935083925090565b6000546001600160a01b03163303610f2f57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b03166000818152600d602052604081205480610f6957505050565b610fa991610f9882610f7f6040946006546109b8565b600655858352600d602052838320610b2a8282546109b8565b938152600e60205220918254610885565b9055565b6001600160a01b039081166000818152600460205260408120805460ff8116156110855760ff1916905560026020528060408120556003602052604081205491600154926000199384810190811161107157611035929186611011610c1693610cca565b90549060031b1c169283865260036020528160408720558552846040812055610cca565b60015490811561105d5750019061104b82610cca565b909182549160031b1b19169055600155565b634e487b7160e01b81526031600452602490fd5b634e487b7160e01b84526011600452602484fd5b5050505050565b6001600160a01b031661109e816109c5565b90816110ab575050600090565b6000908082526020600f81526040906110c78583862054610958565b838552600f825282852055815167ffffffffffffffff908083018281118282101761119e578452859052848080808988617530f1903d156111b2573d81811161119e57845191601f8201601f19908116603f011683019081118382101761118a578552815285833d92013e5b837fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d838551898152a215611168575050505090565b611180849584600f94959652838352848720546109b8565b9385525282205590565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b87526041600452602487fd5b50611133565b6001600160a01b031660009081526004602052604090205460ff16156111e657600360205260406000205490565b60001990565b428111611205576111fd90426109b8565b600954111590565b5060009056fea2646970667358221220793a0e8d3b5d6f63c59be1e24000ae2abef254699377f165bc11e5b9777e253764736f6c634300081800330000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060408181526004918236101561001f575b505050361561001d57005b005b600090813560e01c90816309bbedde1461084e5750806318160ddd1461082f578063226cfa3d146107f557806327ce0147146107c45780633009a609146107a557806331e79db0146107245780633243c791146106605780633a7960e0146106415780634e7b827f146106025780635183d6fd146105e25780636a474002146105c45780636f2789ec146105a5578063715018a61461054b57806385a6b3ae1461052c5780638da5cb5b14610504578063a2ec70d2146103f4578063a8b9d240146104cc578063aafd847a14610492578063bc4c4b371461044d578063be10b6141461042e578063d3573e42146103f4578063e30443bc146103c0578063e98030c714610314578063f223273a14610296578063f2fde38b14610207578063fbcbc0f1146101845763ffb2c479036100125734610181576020366003190112610181575061016f60609235610e01565b91929081519384526020840152820152f35b80fd5b5091346102035760203660031901126102035735916001600160a01b038316830361018157506101b66101ff92610d30565b97516001600160a01b039097168752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e0810191909152908190610100820190565b0390f35b8280fd5b50919034610203576020366003190112610203576001600160a01b038235818116939192908490036102925761023b610f1b565b831561027c57505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b8480fd5b5034610181578060031936011261018157806001805482805b8281106102d057505084516001600160a01b03909416845250506020820152f35b6102d981610cca565b905460039190911b1c6001600160a01b0316808352600d60205287832054868111610308575b505083016102af565b909650945083886102ff565b50913461020357602036600319011261020357803591610332610f1b565b610e1080841080156103b4575b6103905750600954831461037b57505080600955807f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f8380a380f35b916024925191632c42b16760e01b8352820152fd5b90926064935192630100828360e11b84528301526024820152620151806044820152fd5b5062015180841161033f565b5090346103f057366003190112610181576103ed6103dc61086a565b6103e4610f1b565b60243590610ab6565b80f35b5080fd5b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600d845220549051908152f35b5090346103f057816003193601126103f057602090600a549051908152f35b5090346103f057806003193601126103f05761046761086a565b602435928315158403610181575060209261048991610484610f1b565b6109f5565b90519015158152f35b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600f845220549051908152f35b5091346102035760203660031901126102035735916001600160a01b038316830361018157506104fd6020926109c5565b9051908152f35b5090346103f057816003193601126103f057905490516001600160a01b039091168152602090f35b5090346103f057816003193601126103f0576020906008549051908152f35b5034610181578060031936011261018157610564610f1b565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5090346103f057816003193601126103f0576020906009549051908152f35b50346101815780600319360112610181576105de3361108c565b5080f35b503461018157602036600319011261018157506101b66101ff9235610965565b50913461020357602036600319011261020357356001600160a01b0381169081900361020357818360ff9260209552600b855220541690519015158152f35b5090346103f057816003193601126103f0576020906007549051908152f35b5090346103f05760203660031901126103f05782359061067e610f1b565b6006548015610714578215908115610694578480f35b60075491608085901b90600160801b868304141715610701576106f5959650906106c092910490610958565b600755518181527fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651160203392a2600854610958565b60085580388080808480f35b634e487b7160e01b865260118752602486fd5b8151636328a90f60e11b81528590fd5b50913461020357602036600319011261020357356001600160a01b03811691908281036107a15761077a91610757610f1b565b838552600b6020528420805460ff1916600117905561077581610f47565b610fad565b7fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b258280a280f35b8380fd5b5090346103f057816003193601126103f0576020906005549051908152f35b5091346102035760203660031901126102035735916001600160a01b038316830361018157506104fd6020926108b7565b50913461020357602036600319011261020357356001600160a01b038116908190036102035782829160209452600c845220549051908152f35b5090346103f057816003193601126103f0576020906006549051908152f35b9050346103f057816003193601126103f0576020906001548152f35b600435906001600160a01b038216820361088057565b600080fd5b919091600083820193841291129080158216911516176108a157565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03166000908152600d6020908152604080832054600e90925282205460075490918181029190848212600160ff1b82141661093157818305149015171561091d579061090991610885565b81811215610915575090565b905060801c90565b634e487b7160e01b83526011600452602483fd5b634e487b7160e01b85526011600452602485fd5b818102929181159184041417156108a157565b919082018092116108a157565b6001548110156109a25761097b61099291610cca565b905460039190911b1c6001600160a01b0316610d30565b9697959694959394929391929091565b5060009060001990819083908190819081908190565b919082039182116108a157565b6109f2906109d2816108b7565b6001600160a01b039091166000908152600f6020526040902054906109b8565b90565b906109ff8261108c565b9182610a0d57505050600090565b60207fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929160018060a01b03169283600052600c825242604060002055604051948552151593a3600190565b610a618161108c565b80610a6d575050600090565b7fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0926020600193848060a01b03169283600052600c825242604060002055604051908152a3600190565b6001600160a01b0381166000818152600b602090815260408083205494959460ff16610cc257600a548510610cac57838352600d8252808320548581811115610c4d57610b3591610b06916109b8565b610b1281600654610958565b600655858552600d8452828520610b2a828254610958565b905560075490610945565b848452600e8352610b4a828520918254610d17565b90555b6001600160a01b03841660009081526004602052604090205460ff1615610b9e575050506001600160a01b0316600090815260026020526040902055610b9b905b610b96610f1b565b610a58565b50565b6001600160a01b03841660009081526004602052604090209394600394805460ff191660011790556001600160a01b0386166000908152600260205260409020556001549384928685525282205568010000000000000000821015610c395750610b9b9291610c16826001610c349401600155610cca565b90919060018060a01b038084549260031b9316831b921b1916179055565b610b8e565b634e487b7160e01b81526041600452602490fd5b90808210610c5d575b5050610b4d565b610c8e91610c6a916109b8565b610c76816006546109b8565b600655858552600d8452828520610b2a8282546109b8565b848452600e8352610ca3828520918254610885565b90558438610c56565b505050610b9b92915080610775610c3492610f47565b505050505050565b600154811015610d015760016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b818103929160001380158285131691841216176108a157565b9081610d3b816111b8565b916000199160009182851215610daa575b610d55826109c5565b92610d5f836108b7565b6001600160a01b039093168152600c6020526040812054918215610da457610d8960095484610958565b915b8242811115610da0576109f2915042906109b8565b5090565b81610d8b565b9250600554808511600014610dc957610dc39085610d17565b92610d4c565b60015481811115610de757610dc391610de1916109b8565b85610885565b5050610dc382610de1565b60001981146108a15760010190565b600191600154918215610f0d57916005549260005a90866000946000985b610e32575b505050505082600555929190565b90919293949685841080610f04575b15610efd57610e4f90610df2565b968254881015610ef4575b610e6388610cca565b60018060a01b0391549060031b1c1680600052600c602052610e896040600020546111ec565b610ec8575b50610e9890610df2565b945a94858111610eae575b509392919081610e1f565b85610ebd610ec2928697610958565b6109b8565b93610ea3565b610ed490610b96610f1b565b610edf575b38610e8e565b97610eec610e9891610df2565b989050610ed9565b60009750610e5a565b9694610e24565b50818810610e41565b506005546000935083925090565b6000546001600160a01b03163303610f2f57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b03166000818152600d602052604081205480610f6957505050565b610fa991610f9882610f7f6040946006546109b8565b600655858352600d602052838320610b2a8282546109b8565b938152600e60205220918254610885565b9055565b6001600160a01b039081166000818152600460205260408120805460ff8116156110855760ff1916905560026020528060408120556003602052604081205491600154926000199384810190811161107157611035929186611011610c1693610cca565b90549060031b1c169283865260036020528160408720558552846040812055610cca565b60015490811561105d5750019061104b82610cca565b909182549160031b1b19169055600155565b634e487b7160e01b81526031600452602490fd5b634e487b7160e01b84526011600452602484fd5b5050505050565b6001600160a01b031661109e816109c5565b90816110ab575050600090565b6000908082526020600f81526040906110c78583862054610958565b838552600f825282852055815167ffffffffffffffff908083018281118282101761119e578452859052848080808988617530f1903d156111b2573d81811161119e57845191601f8201601f19908116603f011683019081118382101761118a578552815285833d92013e5b837fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d838551898152a215611168575050505090565b611180849584600f94959652838352848720546109b8565b9385525282205590565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b87526041600452602487fd5b50611133565b6001600160a01b031660009081526004602052604090205460ff16156111e657600360205260406000205490565b60001990565b428111611205576111fd90426109b8565b600954111590565b5060009056fea2646970667358221220793a0e8d3b5d6f63c59be1e24000ae2abef254699377f165bc11e5b9777e253764736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : minimumTokenBalanceForDividends_ (uint256): 0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.