Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18491979 | 302 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
RewardPoolTokens
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-03 */ pragma solidity 0.8.20; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 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); } interface IERC20Metadata is IERC20{ /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } } interface ILpPair { function sync() external; } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IDexFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } contract RewardPoolETH is Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; event Claim(address indexed account, uint256 amount, bool indexed automatic); event DividendsDistributed( address indexed from, uint256 weiAmount ); event DividendWithdrawn( address indexed to, uint256 weiAmount ); mapping (address => bool) public authorized; uint256 public fee; address public feeReceiver; PoolInfo public poolInfo; string public poolName; struct PoolInfo { uint64 poolStartTime; uint48 poolDuration; uint64 payoutFrequency; uint64 lastPayout; uint8 totalPayouts; } uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping (address => uint256) public holderPoints; uint256 public totalPoints; uint256 public totalDividendsDistributed; uint256 public totalForDistribution; constructor(address _feeReceiver, uint256 _fee, string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _pointSetter){ PoolInfo memory poolInfoMem; fee = _fee; feeReceiver = _feeReceiver; require(_poolDuration % _payoutFrequency == 0, "Duration must be evenly divisible by payout frequency"); poolName = _poolName; poolInfoMem.poolDuration = _poolDuration; poolInfoMem.poolStartTime = _poolStartTime; poolInfoMem.payoutFrequency = _payoutFrequency; poolInfoMem.lastPayout = _poolStartTime; poolInfoMem.totalPayouts = uint8(_poolDuration / _payoutFrequency); poolInfo = poolInfoMem; authorized[_pointSetter] = true; } modifier onlyAuthorized(){ require(authorized[msg.sender] || msg.sender == owner(), "Not Authorized"); _; } function setAuthorized(address _wallet, bool _authorized) external onlyOwner { authorized[_wallet] = _authorized; } receive() external payable { uint256 amountForFee; if(fee > 0){ amountForFee = msg.value * fee / 100; (bool success,) = feeReceiver.call{value: amountForFee}(""); require(success, "Distribution failed"); } totalForDistribution += msg.value - amountForFee; } function distributeDividends() external onlyAuthorized { PoolInfo memory poolInfoMem = poolInfo; require(totalPoints > 0, "No shares to distribute to"); require(block.timestamp >= poolInfoMem.payoutFrequency + poolInfoMem.lastPayout, "Too early for distribution"); uint256 payouts = (block.timestamp - poolInfoMem.lastPayout) / poolInfoMem.payoutFrequency; uint256 amountToAdd = totalForDistribution * payouts / poolInfoMem.totalPayouts; poolInfoMem.lastPayout += uint64(payouts * poolInfoMem.payoutFrequency); poolInfo = poolInfoMem; if(amountToAdd + totalDividendsDistributed > totalForDistribution){ amountToAdd = totalForDistribution - totalDividendsDistributed; } if(amountToAdd > 0){ magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amountToAdd).mul(magnitude) / totalPoints ); emit DividendsDistributed(msg.sender, amountToAdd); totalDividendsDistributed = totalDividendsDistributed.add(amountToAdd); } } 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].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value: _withdrawableDividend}(""); if(!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } function dividendOf(address _owner) external view returns(uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) external view returns(uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns(uint256) { return magnifiedDividendPerShare.mul(holderPoints[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderPoints[account]; holderPoints[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalPoints += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalPoints -= reduceAmount; } } function getAccount(address _account) public view returns ( address account, uint256 withdrawableDividends, uint256 totalDividends, uint256 balance) { account = _account; withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); balance = holderPoints[account]; } function setBalance(address payable account, uint256 newBalance) external onlyAuthorized { _setBalance(account, newBalance); processAccount(account, true); } function setBalances(address payable[] memory accounts, uint256[] memory newBalances) external onlyAuthorized { address payable account; uint256 newBalance; for(uint8 i = 0; i < accounts.length; i++){ account = accounts[i]; newBalance = newBalances[i]; _setBalance(account, newBalance); processAccount(account, true); } } function processAccount(address payable account, bool automatic) internal returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { emit Claim(account, amount, automatic); return true; } return false; } function getTotalDividendsDistributed() external view returns (uint256) { return totalDividendsDistributed; } function dividendTokenBalanceOf(address account) public view returns (uint256) { return holderPoints[account]; } function getNumberOfDividends() external view returns(uint256) { return totalPoints; } function claim() external { processAccount(payable(msg.sender), false); } } contract RewardPoolTokens is Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; event Claim(address indexed account, uint256 amount, bool indexed automatic); event DividendsDistributed( address indexed from, uint256 weiAmount ); event DividendWithdrawn( address indexed to, uint256 weiAmount ); mapping (address => bool) public authorized; uint256 public fee; address public feeReceiver; PoolInfo public poolInfo; string public poolName; address public rewardToken; struct PoolInfo { uint64 poolStartTime; uint48 poolDuration; uint64 payoutFrequency; uint64 lastPayout; uint8 totalPayouts; } uint256 constant internal magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping (address => uint256) public holderPoints; uint256 public totalPoints; uint256 public totalDividendsDistributed; uint256 public totalForDistribution; constructor(address _feeReceiver, uint256 _fee, string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _pointSetter, address _rewardToken){ PoolInfo memory poolInfoMem; fee = _fee; feeReceiver = _feeReceiver; require(_poolDuration % _payoutFrequency == 0, "Duration must be evenly divisible by payout frequency"); poolName = _poolName; poolInfoMem.poolDuration = _poolDuration; poolInfoMem.poolStartTime = _poolStartTime; poolInfoMem.payoutFrequency = _payoutFrequency; poolInfoMem.lastPayout = _poolStartTime; poolInfoMem.totalPayouts = uint8(_poolDuration / _payoutFrequency); poolInfo = poolInfoMem; authorized[_pointSetter] = true; require(_rewardToken != address(0), "Reward Token Address not Set"); rewardToken = _rewardToken; } modifier onlyAuthorized(){ require(authorized[msg.sender] || msg.sender == owner(), "Not Authorized"); _; } function setAuthorized(address _wallet, bool _authorized) external onlyOwner { authorized[_wallet] = _authorized; } function addTokensForDistribution() public onlyAuthorized { uint256 amountForFee; uint256 tokenBalance = IERC20(rewardToken).balanceOf(address(this)); require(tokenBalance > 0, "No tokens to distribute"); if(fee > 0 && tokenBalance > totalForDistribution){ amountForFee = (tokenBalance - totalForDistribution) * fee / 100; if(tokenBalance - amountForFee > totalForDistribution){ totalForDistribution += tokenBalance - amountForFee - totalForDistribution; SafeERC20.safeTransfer(IERC20(rewardToken), feeReceiver, amountForFee); } } } function distributeDividends() external onlyAuthorized { PoolInfo memory poolInfoMem = poolInfo; require(totalPoints > 0, "No shares to distribute to"); require(block.timestamp >= poolInfoMem.payoutFrequency + poolInfoMem.lastPayout, "Too early for distribution"); uint256 payouts = (block.timestamp - poolInfoMem.lastPayout) / poolInfoMem.payoutFrequency; uint256 amountToAdd = totalForDistribution * payouts / poolInfoMem.totalPayouts; poolInfoMem.lastPayout += uint64(payouts * poolInfoMem.payoutFrequency); poolInfo = poolInfoMem; if(amountToAdd + totalDividendsDistributed > totalForDistribution){ amountToAdd = totalForDistribution - totalDividendsDistributed; } if(amountToAdd > 0){ magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amountToAdd).mul(magnitude) / totalPoints ); emit DividendsDistributed(msg.sender, amountToAdd); totalDividendsDistributed = totalDividendsDistributed.add(amountToAdd); } } 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].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); SafeERC20.safeTransfer(IERC20(rewardToken), user, _withdrawableDividend); } return 0; } function dividendOf(address _owner) external view returns(uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns(uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) external view returns(uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns(uint256) { return magnifiedDividendPerShare.mul(holderPoints[_owner]).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function _increase(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _reduce(address account, uint256 value) internal { magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() ); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = holderPoints[account]; holderPoints[account] = newBalance; if(newBalance > currentBalance) { uint256 increaseAmount = newBalance.sub(currentBalance); _increase(account, increaseAmount); totalPoints += increaseAmount; } else if(newBalance < currentBalance) { uint256 reduceAmount = currentBalance.sub(newBalance); _reduce(account, reduceAmount); totalPoints -= reduceAmount; } } function getAccount(address _account) public view returns ( address account, uint256 withdrawableDividends, uint256 totalDividends, uint256 balance) { account = _account; withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); balance = holderPoints[account]; } function setBalance(address payable account, uint256 newBalance) external onlyAuthorized { if(totalForDistribution == 0){ addTokensForDistribution(); } _setBalance(account, newBalance); processAccount(account, true); } function setBalances(address payable[] memory accounts, uint256[] memory newBalances) external onlyAuthorized { if(totalForDistribution == 0){ addTokensForDistribution(); } address payable account; uint256 newBalance; for(uint8 i = 0; i < accounts.length; i++){ account = accounts[i]; newBalance = newBalances[i]; _setBalance(account, newBalance); processAccount(account, true); } } function processAccount(address payable account, bool automatic) internal returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if(amount > 0) { emit Claim(account, amount, automatic); return true; } return false; } function getTotalDividendsDistributed() external view returns (uint256) { return totalDividendsDistributed; } function dividendTokenBalanceOf(address account) public view returns (uint256) { return holderPoints[account]; } function getNumberOfDividends() external view returns(uint256) { return totalPoints; } function claim() external { processAccount(payable(msg.sender), false); } } contract ViralXRewardPoolFactory is Ownable { address public feeReceiverETH; address public feeReceiverTokens; uint256 public fee; address public pointSetter; address[] public rewardPools; event ETHRewardPoolCreated(address rewardPool); event TokensRewardPoolCreated(address rewardPool); constructor(address _feeReceiverETH, address _feeReceiverTokens, uint256 _fee, address _pointSetter){ feeReceiverETH = _feeReceiverETH; feeReceiverTokens = _feeReceiverTokens; fee = _fee; pointSetter = _pointSetter; } function createETHRewardPool(string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency) external onlyOwner { RewardPoolETH newPool = new RewardPoolETH(feeReceiverETH, fee, _poolName, _poolStartTime, _poolDuration, _payoutFrequency, pointSetter); rewardPools.push(address(newPool)); newPool.transferOwnership(msg.sender); emit ETHRewardPoolCreated(address(newPool)); } function createTokenRewardPool(string memory _poolName, uint64 _poolStartTime, uint48 _poolDuration, uint64 _payoutFrequency, address _rewardToken) external onlyOwner { RewardPoolTokens newPool = new RewardPoolTokens(feeReceiverTokens, fee, _poolName, _poolStartTime, _poolDuration, _payoutFrequency, pointSetter, _rewardToken); rewardPools.push(address(newPool)); newPool.transferOwnership(msg.sender); emit TokensRewardPoolCreated(address(newPool)); } function updateFeeReceiverETH(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); feeReceiverETH = _newAddress; } function updateFeeReceiverTokens(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); feeReceiverTokens = _newAddress; } function updatePointSetter(address _newAddress) external onlyOwner { require(_newAddress != address(0), "Zero Address"); pointSetter = _newAddress; } function updateFee(uint256 _newFee) external onlyOwner { require(_newFee <= 20, "Fee must be 0-20%"); fee = _newFee; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_feeReceiver","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"string","name":"_poolName","type":"string"},{"internalType":"uint64","name":"_poolStartTime","type":"uint64"},{"internalType":"uint48","name":"_poolDuration","type":"uint48"},{"internalType":"uint64","name":"_payoutFrequency","type":"uint64"},{"internalType":"address","name":"_pointSetter","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addTokensForDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolInfo","outputs":[{"internalType":"uint64","name":"poolStartTime","type":"uint64"},{"internalType":"uint48","name":"poolDuration","type":"uint48"},{"internalType":"uint64","name":"payoutFrequency","type":"uint64"},{"internalType":"uint64","name":"lastPayout","type":"uint64"},{"internalType":"uint8","name":"totalPayouts","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"}],"name":"setAuthorized","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 payable[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"newBalances","type":"uint256[]"}],"name":"setBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalForDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPoints","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":[],"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"}]
Contract Creation Code
608060405234801562000010575f80fd5b5060405162001f7838038062001f7883398101604081905262000033916200033d565b5f80546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526002889055600380546001600160a01b0319166001600160a01b038b16179055620000d18465ffffffffffff871662000497565b6001600160401b031615620001535760405162461bcd60e51b815260206004820152603560248201527f4475726174696f6e206d757374206265206576656e6c7920646976697369626c60448201527f65206279207061796f7574206672657175656e6379000000000000000000000060648201526084015b60405180910390fd5b60056200016188826200054b565b5065ffffffffffff8516602082018190526001600160401b03808816808452908616604084015260608301526200019a90859062000613565b60ff16608082018190528151600480546020808601516040808801516060890151600160f01b90980260ff60f01b196001600160401b03998a16600160b01b02600160b01b600160f01b0319938b16600160701b0293909316600160701b600160f01b031965ffffffffffff90961668010000000000000000026001600160701b03199098169a9099169990991795909517929092169590951717949094161790556001600160a01b038086165f90815260019384905291909120805460ff19169092179091558216620002b15760405162461bcd60e51b815260206004820152601c60248201527f52657761726420546f6b656e2041646472657373206e6f74205365740000000060448201526064016200014a565b50600680546001600160a01b0319166001600160a01b0392909216919091179055506200063b95505050505050565b80516001600160a01b0381168114620002f7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b80516001600160401b0381168114620002f7575f80fd5b805165ffffffffffff81168114620002f7575f80fd5b5f805f805f805f80610100898b03121562000356575f80fd5b6200036189620002e0565b60208a81015160408c0151929a509850906001600160401b038082111562000387575f80fd5b818c0191508c601f8301126200039b575f80fd5b815181811115620003b057620003b0620002fc565b604051601f8201601f19908116603f01168101908382118183101715620003db57620003db620002fc565b816040528281528f86848701011115620003f3575f80fd5b5f93505b82841015620004165784840186015181850187015292850192620003f7565b5f868483010152809b505050505050506200043460608a0162000310565b94506200044460808a0162000327565b93506200045460a08a0162000310565b92506200046460c08a01620002e0565b91506200047460e08a01620002e0565b90509295985092959890939650565b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0383811680620004b357620004b362000483565b92169190910692915050565b600181811c90821680620004d457607f821691505b602082108103620004f357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000546575f81815260208120601f850160051c81016020861015620005215750805b601f850160051c820191505b8181101562000542578281556001016200052d565b5050505b505050565b81516001600160401b03811115620005675762000567620002fc565b6200057f81620005788454620004bf565b84620004f9565b602080601f831160018114620005b5575f84156200059d5750858301515b5f19600386901b1c1916600185901b17855562000542565b5f85815260208120601f198616915b82811015620005e557888601518255948401946001909101908401620005c4565b50858210156200060357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03838116806200062f576200062f62000483565b92169190910492915050565b61192f80620006495f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806391b89fba116100f3578063dd85d22911610093578063f2fde38b1161006e578063f2fde38b14610406578063f3466dfa14610419578063f7c618c11461042e578063fbcbc0f114610441575f80fd5b8063dd85d229146103e2578063ddca3f43146103ea578063e30443bc146103f3575f80fd5b8063b3f00674116100ce578063b3f0067414610381578063b7e39b4f14610394578063b9181611146103a7578063dd6dd852146103d9575f80fd5b806391b89fba14610333578063a8b9d24014610346578063aafd847a14610359575f80fd5b80636843cd841161015e578063715018a611610139578063715018a6146102f657806371778e7d146102fe57806385a6b3ae146103065780638da5cb5b1461030f575f80fd5b80636843cd84146102b35780636a474002146102db578063711bf9b2146102e3575f80fd5b80634e71d92d116101995780634e71d92d146101f7578063567142be146101ff5780635a2f3d091461020857806365d14c4714610294575f80fd5b806303c83302146101bf57806327ce0147146101c957806330bb4cff146101ef575b5f80fd5b6101c761047e565b005b6101dc6101d736600461149e565b6107be565b6040519081526020015b60405180910390f35b600c546101dc565b6101c7610820565b6101dc600b5481565b60045461024e9067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016101e6565b6101dc6102a236600461149e565b600a6020525f908152604090205481565b6101dc6102c136600461149e565b6001600160a01b03165f908152600a602052604090205490565b6101c761082d565b6101c76102f13660046114c6565b610836565b6101c7610889565b600b546101dc565b6101dc600c5481565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b6101dc61034136600461149e565b6108fa565b6101dc61035436600461149e565b610900565b6101dc61036736600461149e565b6001600160a01b03165f9081526009602052604090205490565b60035461031b906001600160a01b031681565b6101c76103a23660046115cd565b61092b565b6103c96103b536600461149e565b60016020525f908152604090205460ff1681565b60405190151581526020016101e6565b6101dc600d5481565b6101c76109fb565b6101dc60025481565b6101c7610401366004611689565b610b9d565b6101c761041436600461149e565b610c05565b610421610cec565b6040516101e691906116d5565b60065461031b906001600160a01b031681565b61045461044f36600461149e565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101e6565b335f9081526001602052604090205460ff16806104a457505f546001600160a01b031633145b6104c95760405162461bcd60e51b81526004016104c090611707565b60405180910390fd5b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600b546105765760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f00000000000060448201526064016104c0565b8060600151816040015161058a9190611743565b67ffffffffffffffff164210156105e35760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e00000000000060448201526064016104c0565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff164261060d919061176b565b610617919061177e565b90505f826080015160ff1682600d54610630919061179d565b61063a919061177e565b9050826040015167ffffffffffffffff1682610656919061179d565b836060018181516106679190611743565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600d54600c5461072990836117b4565b111561074257600c54600d5461073f919061176b565b90505b80156107b957600b546107709061075d83600160801b610db4565b610767919061177e565b60075490610e39565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c546107b59082610e39565b600c555b505050565b6001600160a01b0381165f90815260086020908152604080832054600a909252822054600754600160801b926108109261080b92610805916108009190610db4565b610e97565b90610ea5565b610edf565b61081a919061177e565b92915050565b61082a335f610ef0565b50565b61082a33610f5c565b5f546001600160a01b0316331461085f5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016104c0906117c7565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f61081a825b6001600160a01b0381165f9081526009602052604081205461081a90610925846107be565b90611006565b335f9081526001602052604090205460ff168061095157505f546001600160a01b031633145b61096d5760405162461bcd60e51b81526004016104c090611707565b600d545f0361097e5761097e6109fb565b5f805f5b84518160ff1610156109f457848160ff16815181106109a3576109a36117fc565b60200260200101519250838160ff16815181106109c2576109c26117fc565b602002602001015191506109d68383611047565b6109e1836001610ef0565b50806109ec81611810565b915050610982565b5050505050565b335f9081526001602052604090205460ff1680610a2157505f546001600160a01b031633145b610a3d5760405162461bcd60e51b81526004016104c090611707565b6006546040516370a0823160e01b81523060048201525f9182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab919061182e565b90505f8111610afc5760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f206469737472696275746500000000000000000060448201526064016104c0565b5f600254118015610b0e5750600d5481115b15610b99576064600254600d5483610b26919061176b565b610b30919061179d565b610b3a919061177e565b600d54909250610b4a838361176b565b1115610b9957600d54610b5d838361176b565b610b67919061176b565b600d5f828254610b7791906117b4565b9091555050600654600354610b99916001600160a01b039081169116846110db565b5050565b335f9081526001602052604090205460ff1680610bc357505f546001600160a01b031633145b610bdf5760405162461bcd60e51b81526004016104c090611707565b600d545f03610bf057610bf06109fb565b610bfa8282611047565b6107b9826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c0565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf990611845565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590611845565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610900565b9250610d90846107be565b6001600160a01b0385165f908152600a602052604090205494969395509392915050565b5f825f03610dc357505f61081a565b5f610dce838561179d565b905082610ddb858361177e565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104c0565b9392505050565b5f80610e4583856117b4565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104c0565b5f818181121561081a575f80fd5b5f80610eb1838561187d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a3600191505061081a565b505f9392505050565b5f80610f6783610900565b90508015610ffe576001600160a01b0383165f90815260096020526040902054610f919082610e39565b6001600160a01b0384165f81815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a2600654610ffe906001600160a01b031684836110db565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061112d565b6001600160a01b0382165f908152600a60205260409020805490829055808211156110a0575f6110778383611006565b90506110838482611165565b80600b5f82825461109491906117b4565b909155506107b9915050565b808210156107b9575f6110b38284611006565b90506110bf84826111bd565b80600b5f8282546110d0919061176b565b909155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107b99084906111f6565b5f81848411156111505760405162461bcd60e51b81526004016104c091906116d5565b505f61115c848661176b565b95945050505050565b61119e61118061080083600754610db490919063ffffffff16565b6001600160a01b0384165f90815260086020526040902054906112c7565b6001600160a01b039092165f9081526008602052604090209190915550565b61119e6111d861080083600754610db490919063ffffffff16565b6001600160a01b0384165f9081526008602052604090205490610ea5565b5f61124a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113009092919063ffffffff16565b8051909150156107b9578080602001905181019061126891906118a4565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c0565b5f806112d383856118bf565b90505f83121580156112e55750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b606061130e84845f85611316565b949350505050565b6060824710156113775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c0565b5f80866001600160a01b0316858760405161139291906118de565b5f6040518083038185875af1925050503d805f81146113cc576040519150601f19603f3d011682016040523d82523d5f602084013e6113d1565b606091505b50915091506113e2878383876113ed565b979650505050505050565b6060831561145b5782515f03611454576001600160a01b0385163b6114545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c0565b508161130e565b61130e83838151156114705781518083602001fd5b8060405162461bcd60e51b81526004016104c091906116d5565b6001600160a01b038116811461082a575f80fd5b5f602082840312156114ae575f80fd5b8135610e328161148a565b801515811461082a575f80fd5b5f80604083850312156114d7575f80fd5b82356114e28161148a565b915060208301356114f2816114b9565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561153a5761153a6114fd565b604052919050565b5f67ffffffffffffffff82111561155b5761155b6114fd565b5060051b60200190565b5f82601f830112611574575f80fd5b8135602061158961158483611542565b611511565b82815260059290921b840181019181810190868411156115a7575f80fd5b8286015b848110156115c257803583529183019183016115ab565b509695505050505050565b5f80604083850312156115de575f80fd5b823567ffffffffffffffff808211156115f5575f80fd5b818501915085601f830112611608575f80fd5b8135602061161861158483611542565b82815260059290921b84018101918181019089841115611636575f80fd5b948201945b8386101561165d57853561164e8161148a565b8252948201949082019061163b565b96505086013592505080821115611672575f80fd5b5061167f85828601611565565b9150509250929050565b5f806040838503121561169a575f80fd5b82356116a58161148a565b946020939093013593505050565b5f5b838110156116cd5781810151838201526020016116b5565b50505f910152565b602081525f82518060208401526116f38160408501602087016116b3565b601f01601f19169190910160400192915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156117645761176461172f565b5092915050565b8181038181111561081a5761081a61172f565b5f8261179857634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761081a5761081a61172f565b8082018082111561081a5761081a61172f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036118255761182561172f565b60010192915050565b5f6020828403121561183e575f80fd5b5051919050565b600181811c9082168061185957607f821691505b60208210810361187757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561189c5761189c61172f565b505092915050565b5f602082840312156118b4575f80fd5b8151610e32816114b9565b8181035f8312801583831316838312821617156117645761176461172f565b5f82516118ef8184602087016116b3565b919091019291505056fea264697066735822122090a06f517c358598a95393848a4c786b53bdec0bae78f3e46e06a36c669f5a0a64736f6c634300081400330000000000000000000000008c5a955fd0d96d9ddc8c4f9581745c5cf31d6374000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000006544eda400000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000878611eef70c3fd959aa1dcc550df3407061fb43000000000000000000000000b533687ef77459093368c43e95f8df1c2b5a1f7a000000000000000000000000000000000000000000000000000000000000000b44756d6d79546f6b656e73000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806391b89fba116100f3578063dd85d22911610093578063f2fde38b1161006e578063f2fde38b14610406578063f3466dfa14610419578063f7c618c11461042e578063fbcbc0f114610441575f80fd5b8063dd85d229146103e2578063ddca3f43146103ea578063e30443bc146103f3575f80fd5b8063b3f00674116100ce578063b3f0067414610381578063b7e39b4f14610394578063b9181611146103a7578063dd6dd852146103d9575f80fd5b806391b89fba14610333578063a8b9d24014610346578063aafd847a14610359575f80fd5b80636843cd841161015e578063715018a611610139578063715018a6146102f657806371778e7d146102fe57806385a6b3ae146103065780638da5cb5b1461030f575f80fd5b80636843cd84146102b35780636a474002146102db578063711bf9b2146102e3575f80fd5b80634e71d92d116101995780634e71d92d146101f7578063567142be146101ff5780635a2f3d091461020857806365d14c4714610294575f80fd5b806303c83302146101bf57806327ce0147146101c957806330bb4cff146101ef575b5f80fd5b6101c761047e565b005b6101dc6101d736600461149e565b6107be565b6040519081526020015b60405180910390f35b600c546101dc565b6101c7610820565b6101dc600b5481565b60045461024e9067ffffffffffffffff80821691600160401b810465ffffffffffff1691600160701b8204811691600160b01b810490911690600160f01b900460ff1685565b6040805167ffffffffffffffff968716815265ffffffffffff90951660208601529285169284019290925292909216606082015260ff909116608082015260a0016101e6565b6101dc6102a236600461149e565b600a6020525f908152604090205481565b6101dc6102c136600461149e565b6001600160a01b03165f908152600a602052604090205490565b6101c761082d565b6101c76102f13660046114c6565b610836565b6101c7610889565b600b546101dc565b6101dc600c5481565b5f546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b6101dc61034136600461149e565b6108fa565b6101dc61035436600461149e565b610900565b6101dc61036736600461149e565b6001600160a01b03165f9081526009602052604090205490565b60035461031b906001600160a01b031681565b6101c76103a23660046115cd565b61092b565b6103c96103b536600461149e565b60016020525f908152604090205460ff1681565b60405190151581526020016101e6565b6101dc600d5481565b6101c76109fb565b6101dc60025481565b6101c7610401366004611689565b610b9d565b6101c761041436600461149e565b610c05565b610421610cec565b6040516101e691906116d5565b60065461031b906001600160a01b031681565b61045461044f36600461149e565b610d78565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101e6565b335f9081526001602052604090205460ff16806104a457505f546001600160a01b031633145b6104c95760405162461bcd60e51b81526004016104c090611707565b60405180910390fd5b6040805160a08101825260045467ffffffffffffffff8082168352600160401b820465ffffffffffff166020840152600160701b8204811693830193909352600160b01b81049092166060820152600160f01b90910460ff166080820152600b546105765760405162461bcd60e51b815260206004820152601a60248201527f4e6f2073686172657320746f206469737472696275746520746f00000000000060448201526064016104c0565b8060600151816040015161058a9190611743565b67ffffffffffffffff164210156105e35760405162461bcd60e51b815260206004820152601a60248201527f546f6f206561726c7920666f7220646973747269627574696f6e00000000000060448201526064016104c0565b5f816040015167ffffffffffffffff16826060015167ffffffffffffffff164261060d919061176b565b610617919061177e565b90505f826080015160ff1682600d54610630919061179d565b61063a919061177e565b9050826040015167ffffffffffffffff1682610656919061179d565b836060018181516106679190611743565b67ffffffffffffffff9081169091528451600480546020880151604089015160608a015160808b01519587166dffffffffffffffffffffffffffff1990941693909317600160401b65ffffffffffff90931692909202919091176fffffffffffffffffffffffffffffffff60701b1916600160701b9186169190910267ffffffffffffffff60b01b191617600160b01b91909416029290921760ff60f01b1916600160f01b60ff9092169190910217905550600d54600c5461072990836117b4565b111561074257600c54600d5461073f919061176b565b90505b80156107b957600b546107709061075d83600160801b610db4565b610767919061177e565b60075490610e39565b60075560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c546107b59082610e39565b600c555b505050565b6001600160a01b0381165f90815260086020908152604080832054600a909252822054600754600160801b926108109261080b92610805916108009190610db4565b610e97565b90610ea5565b610edf565b61081a919061177e565b92915050565b61082a335f610ef0565b50565b61082a33610f5c565b5f546001600160a01b0316331461085f5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146108b25760405162461bcd60e51b81526004016104c0906117c7565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f61081a825b6001600160a01b0381165f9081526009602052604081205461081a90610925846107be565b90611006565b335f9081526001602052604090205460ff168061095157505f546001600160a01b031633145b61096d5760405162461bcd60e51b81526004016104c090611707565b600d545f0361097e5761097e6109fb565b5f805f5b84518160ff1610156109f457848160ff16815181106109a3576109a36117fc565b60200260200101519250838160ff16815181106109c2576109c26117fc565b602002602001015191506109d68383611047565b6109e1836001610ef0565b50806109ec81611810565b915050610982565b5050505050565b335f9081526001602052604090205460ff1680610a2157505f546001600160a01b031633145b610a3d5760405162461bcd60e51b81526004016104c090611707565b6006546040516370a0823160e01b81523060048201525f9182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aab919061182e565b90505f8111610afc5760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f206469737472696275746500000000000000000060448201526064016104c0565b5f600254118015610b0e5750600d5481115b15610b99576064600254600d5483610b26919061176b565b610b30919061179d565b610b3a919061177e565b600d54909250610b4a838361176b565b1115610b9957600d54610b5d838361176b565b610b67919061176b565b600d5f828254610b7791906117b4565b9091555050600654600354610b99916001600160a01b039081169116846110db565b5050565b335f9081526001602052604090205460ff1680610bc357505f546001600160a01b031633145b610bdf5760405162461bcd60e51b81526004016104c090611707565b600d545f03610bf057610bf06109fb565b610bfa8282611047565b6107b9826001610ef0565b5f546001600160a01b03163314610c2e5760405162461bcd60e51b81526004016104c0906117c7565b6001600160a01b038116610c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c0565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b60058054610cf990611845565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590611845565b8015610d705780601f10610d4757610100808354040283529160200191610d70565b820191905f5260205f20905b815481529060010190602001808311610d5357829003601f168201915b505050505081565b805f8080610d8584610900565b9250610d90846107be565b6001600160a01b0385165f908152600a602052604090205494969395509392915050565b5f825f03610dc357505f61081a565b5f610dce838561179d565b905082610ddb858361177e565b14610e325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016104c0565b9392505050565b5f80610e4583856117b4565b905083811015610e325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016104c0565b5f818181121561081a575f80fd5b5f80610eb1838561187d565b90505f8312158015610ec35750838112155b80610ed757505f83128015610ed757508381125b610e32575f80fd5b5f80821215610eec575f80fd5b5090565b5f80610efb84610f5c565b90508015610f5357821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09283604051610f4191815260200190565b60405180910390a3600191505061081a565b505f9392505050565b5f80610f6783610900565b90508015610ffe576001600160a01b0383165f90815260096020526040902054610f919082610e39565b6001600160a01b0384165f81815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90610fdf9084815260200190565b60405180910390a2600654610ffe906001600160a01b031684836110db565b505f92915050565b5f610e3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061112d565b6001600160a01b0382165f908152600a60205260409020805490829055808211156110a0575f6110778383611006565b90506110838482611165565b80600b5f82825461109491906117b4565b909155506107b9915050565b808210156107b9575f6110b38284611006565b90506110bf84826111bd565b80600b5f8282546110d0919061176b565b909155505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107b99084906111f6565b5f81848411156111505760405162461bcd60e51b81526004016104c091906116d5565b505f61115c848661176b565b95945050505050565b61119e61118061080083600754610db490919063ffffffff16565b6001600160a01b0384165f90815260086020526040902054906112c7565b6001600160a01b039092165f9081526008602052604090209190915550565b61119e6111d861080083600754610db490919063ffffffff16565b6001600160a01b0384165f9081526008602052604090205490610ea5565b5f61124a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113009092919063ffffffff16565b8051909150156107b9578080602001905181019061126891906118a4565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104c0565b5f806112d383856118bf565b90505f83121580156112e55750838113155b80610ed757505f83128015610ed75750838113610e32575f80fd5b606061130e84845f85611316565b949350505050565b6060824710156113775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c0565b5f80866001600160a01b0316858760405161139291906118de565b5f6040518083038185875af1925050503d805f81146113cc576040519150601f19603f3d011682016040523d82523d5f602084013e6113d1565b606091505b50915091506113e2878383876113ed565b979650505050505050565b6060831561145b5782515f03611454576001600160a01b0385163b6114545760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c0565b508161130e565b61130e83838151156114705781518083602001fd5b8060405162461bcd60e51b81526004016104c091906116d5565b6001600160a01b038116811461082a575f80fd5b5f602082840312156114ae575f80fd5b8135610e328161148a565b801515811461082a575f80fd5b5f80604083850312156114d7575f80fd5b82356114e28161148a565b915060208301356114f2816114b9565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561153a5761153a6114fd565b604052919050565b5f67ffffffffffffffff82111561155b5761155b6114fd565b5060051b60200190565b5f82601f830112611574575f80fd5b8135602061158961158483611542565b611511565b82815260059290921b840181019181810190868411156115a7575f80fd5b8286015b848110156115c257803583529183019183016115ab565b509695505050505050565b5f80604083850312156115de575f80fd5b823567ffffffffffffffff808211156115f5575f80fd5b818501915085601f830112611608575f80fd5b8135602061161861158483611542565b82815260059290921b84018101918181019089841115611636575f80fd5b948201945b8386101561165d57853561164e8161148a565b8252948201949082019061163b565b96505086013592505080821115611672575f80fd5b5061167f85828601611565565b9150509250929050565b5f806040838503121561169a575f80fd5b82356116a58161148a565b946020939093013593505050565b5f5b838110156116cd5781810151838201526020016116b5565b50505f910152565b602081525f82518060208401526116f38160408501602087016116b3565b601f01601f19169190910160400192915050565b6020808252600e908201526d139bdd08105d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156117645761176461172f565b5092915050565b8181038181111561081a5761081a61172f565b5f8261179857634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761081a5761081a61172f565b8082018082111561081a5761081a61172f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60ff821660ff81036118255761182561172f565b60010192915050565b5f6020828403121561183e575f80fd5b5051919050565b600181811c9082168061185957607f821691505b60208210810361187757634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018281125f83128015821682158216171561189c5761189c61172f565b505092915050565b5f602082840312156118b4575f80fd5b8151610e32816114b9565b8181035f8312801583831316838312821617156117645761176461172f565b5f82516118ef8184602087016116b3565b919091019291505056fea264697066735822122090a06f517c358598a95393848a4c786b53bdec0bae78f3e46e06a36c669f5a0a64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008c5a955fd0d96d9ddc8c4f9581745c5cf31d6374000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000006544eda400000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000878611eef70c3fd959aa1dcc550df3407061fb43000000000000000000000000b533687ef77459093368c43e95f8df1c2b5a1f7a000000000000000000000000000000000000000000000000000000000000000b44756d6d79546f6b656e73000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _feeReceiver (address): 0x8c5A955fD0d96d9ddC8c4f9581745C5cF31D6374
Arg [1] : _fee (uint256): 10
Arg [2] : _poolName (string): DummyTokens
Arg [3] : _poolStartTime (uint64): 1699016100
Arg [4] : _poolDuration (uint48): 86400
Arg [5] : _payoutFrequency (uint64): 3600
Arg [6] : _pointSetter (address): 0x878611eEF70c3FD959aa1Dcc550Df3407061Fb43
Arg [7] : _rewardToken (address): 0xb533687Ef77459093368c43E95f8Df1C2B5a1F7a
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000008c5a955fd0d96d9ddc8c4f9581745c5cf31d6374
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000000000000000000000000000000000006544eda4
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [6] : 000000000000000000000000878611eef70c3fd959aa1dcc550df3407061fb43
Arg [7] : 000000000000000000000000b533687ef77459093368c43e95f8df1c2b5a1f7a
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 44756d6d79546f6b656e73000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
34334:8652:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37522:1114;;;:::i;:::-;;39683:249;;;;;;:::i;:::-;;:::i;:::-;;;548:25:1;;;536:2;521:18;39683:249:0;;;;;;;;42535:123;42625:25;;42535:123;;42896:87;;;:::i;35537:26::-;;;;;;34883:24;;;;;;;;;;-1:-1:-1;;;34883:24:0;;;;;-1:-1:-1;;;34883:24:0;;;;;-1:-1:-1;;;34883:24:0;;;;;;-1:-1:-1;;;34883:24:0;;;;;;;;;;841:18:1;886:15;;;868:34;;950:14;938:27;;;933:2;918:18;;911:55;1002:15;;;982:18;;;975:43;;;;1054:15;;;;1049:2;1034:18;;1027:43;1119:4;1107:17;;;1101:3;1086:19;;1079:46;818:3;803:19;34883:24:0;584:547:1;35480:48:0;;;;;;:::i;:::-;;;;;;;;;;;;;;42663:117;;;;;;:::i;:::-;-1:-1:-1;;;;;42754:21:0;42733:7;42754:21;;;:12;:21;;;;;;;42663:117;38644:100;;;:::i;36722:129::-;;;;;;:::i;:::-;;:::i;13103:150::-;;;:::i;42788:100::-;42869:11;;42788:100;;35570:40;;;;;;12889:79;12927:7;12954:6;-1:-1:-1;;;;;12954:6:0;12889:79;;;-1:-1:-1;;;;;1810:32:1;;;1792:51;;1780:2;1765:18;12889:79:0;1646:203:1;39243:123:0;;;;;;:::i;:::-;;:::i;39374:165::-;;;;;;:::i;:::-;;:::i;39547:128::-;;;;;;:::i;:::-;-1:-1:-1;;;;;39641:26:0;39614:7;39641:26;;;:18;:26;;;;;;;39547:128;34844:26;;;;;-1:-1:-1;;;;;34844:26:0;;;41724:506;;;;;;:::i;:::-;;:::i;34763:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4538:14:1;;4531:22;4513:41;;4501:2;4486:18;34763:43:0;4373:187:1;35619:35:0;;;;;;36859:655;;;:::i;34819:18::-;;;;;;41445:271;;;;;;:::i;:::-;;:::i;13261:244::-;;;;;;:::i;:::-;;:::i;34914:22::-;;;:::i;:::-;;;;;;;:::i;34943:26::-;;;;;-1:-1:-1;;;;;34943:26:0;;;41015:418;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5798:32:1;;;5780:51;;5862:2;5847:18;;5840:34;;;;5890:18;;;5883:34;5948:2;5933:18;;5926:34;5767:3;5752:19;41015:418:0;5549:417:1;37522:1114:0;36639:10;36628:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;12927:7:0;12954:6;-1:-1:-1;;;;;12954:6:0;36654:10;:21;36628:47;36620:74;;;;-1:-1:-1;;;36620:74:0;;;;;;;:::i;:::-;;;;;;;;;37588:38:::1;::::0;;::::1;::::0;::::1;::::0;;37618:8:::1;37588:38:::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;37588:38:0;::::1;;;;::::0;::::1;::::0;-1:-1:-1;;;37588:38:0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;37588:38:0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;37588:38:0;;::::1;;;::::0;;;;37645:11:::1;::::0;37637:54:::1;;;::::0;-1:-1:-1;;;37637:54:0;;6516:2:1;37637:54:0::1;::::0;::::1;6498:21:1::0;6555:2;6535:18;;;6528:30;6594:28;6574:18;;;6567:56;6640:18;;37637:54:0::1;6314:350:1::0;37637:54:0::1;37759:11;:22;;;37729:11;:27;;;:52;;;;:::i;:::-;37710:71;;:15;:71;;37702:110;;;::::0;-1:-1:-1;;;37702:110:0;;7188:2:1;37702:110:0::1;::::0;::::1;7170:21:1::0;7227:2;7207:18;;;7200:30;7266:28;7246:18;;;7239:56;7312:18;;37702:110:0::1;6986:350:1::0;37702:110:0::1;37823:15;37886:11;:27;;;37841:72;;37860:11;:22;;;37842:40;;:15;:40;;;;:::i;:::-;37841:72;;;;:::i;:::-;37823:90;;37924:19;37979:11;:24;;;37946:57;;37969:7;37946:20;;:30;;;;:::i;:::-;:57;;;;:::i;:::-;37924:79;;38057:11;:27;;;38047:37;;:7;:37;;;;:::i;:::-;38014:11;:22;;:71;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;38096:22;;:8:::1;:22:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;38096:22:0;;;;;;;-1:-1:-1;;;38096:22:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;38096:22:0;-1:-1:-1;;;38096:22:0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;38096:22:0;;-1:-1:-1;;;38096:22:0;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;;;38096:22:0::1;-1:-1:-1::0;;;38096:22:0::1;::::0;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;38176:20:0::1;::::0;38148:25:::1;::::0;38134:39:::1;::::0;:11;:39:::1;:::i;:::-;:62;38131:155;;;38249:25;;38226:20;;:48;;;;:::i;:::-;38212:62;;38131:155;38301:15:::0;;38298:331:::1;;38439:11;::::0;38360:105:::1;::::0;38408:28:::1;38409:11:::0;-1:-1:-1;;;38408:17:0::1;:28::i;:::-;:42;;;;:::i;:::-;38360:25;::::0;;:29:::1;:105::i;:::-;38332:25;:133:::0;38485:45:::1;::::0;548:25:1;;;38506:10:0::1;::::0;38485:45:::1;::::0;536:2:1;521:18;38485:45:0::1;;;;;;;38575:25;::::0;:42:::1;::::0;38605:11;38575:29:::1;:42::i;:::-;38547:25;:70:::0;38298:331:::1;37577:1059;;;37522:1114::o:0;39683:249::-;-1:-1:-1;;;;;39859:36:0;;39751:7;39859:36;;;:28;:36;;;;;;;;;39808:12;:20;;;;;;39778:25;;-1:-1:-1;;;35199:6:0;39778:134;;:118;;:66;;:51;;:25;:29;:51::i;:::-;:64;:66::i;:::-;:80;;:118::i;:::-;:132;:134::i;:::-;:146;;;;:::i;:::-;39771:153;39683:249;-1:-1:-1;;39683:249:0:o;42896:87::-;42933:42;42956:10;42969:5;42933:14;:42::i;:::-;;42896:87::o;38644:100::-;38692:44;38724:10;38692:23;:44::i;36722:129::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36810:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:33;;-1:-1:-1;;36810:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36722:129::o;13103:150::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;13212:1:::1;13196:6:::0;;13175:40:::1;::::0;-1:-1:-1;;;;;13196:6:0;;::::1;::::0;13175:40:::1;::::0;13212:1;;13175:40:::1;13243:1;13226:19:::0;;-1:-1:-1;;;;;;13226:19:0::1;::::0;;13103:150::o;39243:123::-;39301:7;39328:30;39351:6;39374:165;-1:-1:-1;;;;;39504:26:0;;39442:7;39504:26;;;:18;:26;;;;;;39469:62;;:30;39523:6;39469:22;:30::i;:::-;:34;;:62::i;41724:506::-;36639:10;36628:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;12927:7:0;12954:6;-1:-1:-1;;;;;12954:6:0;36654:10;:21;36628:47;36620:74;;;;-1:-1:-1;;;36620:74:0;;;;;;;:::i;:::-;41848:20:::1;;41872:1;41848:25:::0;41845:82:::1;;41889:26;:24;:26::i;:::-;41937:23;41971:18:::0;42004:7:::1;42000:223;42021:8;:15;42017:1;:19;;;42000:223;;;42067:8;42076:1;42067:11;;;;;;;;;;:::i;:::-;;;;;;;42057:21;;42106:11;42118:1;42106:14;;;;;;;;;;:::i;:::-;;;;;;;42093:27;;42135:32;42147:7;42156:10;42135:11;:32::i;:::-;42182:29;42197:7;42206:4;42182:14;:29::i;:::-;-1:-1:-1::0;42038:3:0;::::1;::::0;::::1;:::i;:::-;;;;42000:223;;;;41834:396;;41724:506:::0;;:::o;36859:655::-;36639:10;36628:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;12927:7:0;12954:6;-1:-1:-1;;;;;12954:6:0;36654:10;:21;36628:47;36620:74;;;;-1:-1:-1;;;36620:74:0;;;;;;;:::i;:::-;36989:11:::1;::::0;36982:44:::1;::::0;-1:-1:-1;;;36982:44:0;;37020:4:::1;36982:44;::::0;::::1;1792:51:1::0;36928:20:0::1;::::0;;;-1:-1:-1;;;;;36989:11:0;;::::1;::::0;36982:29:::1;::::0;1765:18:1;;36982:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36959:67;;37060:1;37045:12;:16;37037:52;;;::::0;-1:-1:-1;;;37037:52:0;;9063:2:1;37037:52:0::1;::::0;::::1;9045:21:1::0;9102:2;9082:18;;;9075:30;9141:25;9121:18;;;9114:53;9184:18;;37037:52:0::1;8861:347:1::0;37037:52:0::1;37109:1;37103:3;;:7;:46;;;;;37129:20;;37114:12;:35;37103:46;37100:407;;;37226:3;37220;;37196:20;;37181:12;:35;;;;:::i;:::-;37180:43;;;;:::i;:::-;:49;;;;:::i;:::-;37277:20;::::0;37165:64;;-1:-1:-1;37247:27:0::1;37165:64:::0;37247:12;:27:::1;:::i;:::-;:50;37244:252;;;37371:20;::::0;37341:27:::1;37356:12:::0;37341;:27:::1;:::i;:::-;:50;;;;:::i;:::-;37317:20;;:74;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37440:11:0::1;::::0;37454::::1;::::0;37410:70:::1;::::0;-1:-1:-1;;;;;37440:11:0;;::::1;::::0;37454::::1;37467:12:::0;37410:22:::1;:70::i;:::-;36917:597;;36859:655::o:0;41445:271::-;36639:10;36628:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;12927:7:0;12954:6;-1:-1:-1;;;;;12954:6:0;36654:10;:21;36628:47;36620:74;;;;-1:-1:-1;;;36620:74:0;;;;;;;:::i;:::-;41548:20:::1;;41572:1;41548:25:::0;41545:82:::1;;41589:26;:24;:26::i;:::-;41637:32;41649:7;41658:10;41637:11;:32::i;:::-;41679:29;41694:7;41703:4;41679:14;:29::i;13261:244::-:0;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13350:22:0;::::1;13342:73;;;::::0;-1:-1:-1;;;13342:73:0;;9415:2:1;13342:73:0::1;::::0;::::1;9397:21:1::0;9454:2;9434:18;;;9427:30;9493:34;9473:18;;;9466:62;-1:-1:-1;;;9544:18:1;;;9537:36;9590:19;;13342:73:0::1;9213:402:1::0;13342:73:0::1;13452:6;::::0;;13431:38:::1;::::0;-1:-1:-1;;;;;13431:38:0;;::::1;::::0;13452:6;::::1;::::0;13431:38:::1;::::0;::::1;13480:6;:17:::0;;-1:-1:-1;;;;;;13480:17:0::1;-1:-1:-1::0;;;;;13480:17:0;;;::::1;::::0;;;::::1;::::0;;13261:244::o;34914:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41015:418::-;41246:8;41097:15;;;41291:31;41246:8;41291:22;:31::i;:::-;41267:55;;41350:31;41373:7;41350:22;:31::i;:::-;-1:-1:-1;;;;;41404:21:0;;;;;;:12;:21;;;;;;41417:7;;41015:418;;-1:-1:-1;41333:48:0;41404:21;41015:418;-1:-1:-1;;41015:418:0:o;22499:471::-;22557:7;22802:1;22807;22802:6;22798:47;;-1:-1:-1;22832:1:0;22825:8;;22798:47;22857:9;22869:5;22873:1;22869;:5;:::i;:::-;22857:17;-1:-1:-1;22902:1:0;22893:5;22897:1;22857:17;22893:5;:::i;:::-;:10;22885:56;;;;-1:-1:-1;;;22885:56:0;;10207:2:1;22885:56:0;;;10189:21:1;10246:2;10226:18;;;10219:30;10285:34;10265:18;;;10258:62;-1:-1:-1;;;10336:18:1;;;10329:31;10377:19;;22885:56:0;10005:397:1;22885:56:0;22961:1;22499:471;-1:-1:-1;;;22499:471:0:o;21932:181::-;21990:7;;22022:5;22026:1;22022;:5;:::i;:::-;22010:17;;22051:1;22046;:6;;22038:46;;;;-1:-1:-1;;;22038:46:0;;10609:2:1;22038:46:0;;;10591:21:1;10648:2;10628:18;;;10621:30;10687:29;10667:18;;;10660:57;10734:18;;22038:46:0;10407:351:1;26033:134:0;26089:6;26122:1;26139:6;;;;26131:15;;;;;25468:176;25524:6;;25554:5;25558:1;25554;:5;:::i;:::-;25543:16;;25584:1;25579;:6;;:16;;;;;25594:1;25589;:6;;25579:16;25578:38;;;;25605:1;25601;:5;:14;;;;;25614:1;25610;:5;25601:14;25570:47;;;;;25873:127;25929:7;25962:1;25957;:6;;25949:15;;;;;;-1:-1:-1;25990:1:0;25873:127::o;42242:285::-;42325:4;42342:14;42359:32;42383:7;42359:23;:32::i;:::-;42342:49;-1:-1:-1;42404:10:0;;42401:97;;42459:9;42436:33;;42442:7;-1:-1:-1;;;;;42436:33:0;;42451:6;42436:33;;;;548:25:1;;536:2;521:18;;402:177;42436:33:0;;;;;;;;42485:4;42478:11;;;;;42401:97;-1:-1:-1;42514:5:0;;42242:285;-1:-1:-1;;;42242:285:0:o;38752:483::-;38825:7;38845:29;38877:28;38900:4;38877:22;:28::i;:::-;38845:60;-1:-1:-1;38920:25:0;;38916:291;;-1:-1:-1;;;;;38989:24:0;;;;;;:18;:24;;;;;;:51;;39018:21;38989:28;:51::i;:::-;-1:-1:-1;;;;;38962:24:0;;;;;;:18;:24;;;;;;;:78;;;;39062:46;;;;;;39086:21;548:25:1;;536:2;521:18;;402:177;39062:46:0;;;;;;;;39153:11;;39123:72;;-1:-1:-1;;;;;39153:11:0;39167:4;39173:21;39123:22;:72::i;:::-;-1:-1:-1;39226:1:0;;38752:483;-1:-1:-1;;38752:483:0:o;22121:136::-;22179:7;22206:43;22210:1;22213;22206:43;;;;;;;;;;;;;;;;;:3;:43::i;40408:599::-;-1:-1:-1;;;;;40511:21:0;;40486:22;40511:21;;;:12;:21;;;;;;;40543:34;;;;40591:27;;;40588:412;;;40635:22;40660:30;:10;40675:14;40660;:30::i;:::-;40635:55;;40705:34;40715:7;40724:14;40705:9;:34::i;:::-;40769:14;40754:11;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;40588:412:0;;-1:-1:-1;;40588:412:0;;40817:14;40804:10;:27;40801:199;;;40848:20;40871:30;:14;40890:10;40871:18;:30::i;:::-;40848:53;;40916:30;40924:7;40933:12;40916:7;:30::i;:::-;40976:12;40961:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;40475:532:0;40408:599;;:::o;19675:177::-;19785:58;;;-1:-1:-1;;;;;11176:32:1;;19785:58:0;;;11158:51:1;11225:18;;;;11218:34;;;19785:58:0;;;;;;;;;;11131:18:1;;;;19785:58:0;;;;;;;;-1:-1:-1;;;;;19785:58:0;-1:-1:-1;;;19785:58:0;;;19758:86;;19778:5;;19758:19;:86::i;22265:226::-;22385:7;22421:12;22413:6;;;;22405:29;;;;-1:-1:-1;;;22405:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22445:9:0;22457:5;22461:1;22457;:5;:::i;:::-;22445:17;22265:226;-1:-1:-1;;;;;22265:226:0:o;39940:227::-;40051:108;40104:53;40105:36;40135:5;40105:25;;:29;;:36;;;;:::i;40104:53::-;-1:-1:-1;;;;;40051:37:0;;;;;;:28;:37;;;;;;;:51;:108::i;:::-;-1:-1:-1;;;;;40011:37:0;;;;;;;:28;:37;;;;;:148;;;;-1:-1:-1;39940:227:0:o;40175:225::-;40284:108;40337:53;40338:36;40368:5;40338:25;;:29;;:36;;;;:::i;40337:53::-;-1:-1:-1;;;;;40284:37:0;;;;;;:28;:37;;;;;;;:51;:108::i;20073:333::-;20154:23;20180:69;20208:4;20180:69;;;;;;;;;;;;;;;;;20188:5;-1:-1:-1;;;;;20180:27:0;;;:69;;;;;:::i;:::-;20264:17;;20154:95;;-1:-1:-1;20264:21:0;20260:139;;20321:10;20310:30;;;;;;;;;;;;:::i;:::-;20302:85;;;;-1:-1:-1;;;20302:85:0;;11715:2:1;20302:85:0;;;11697:21:1;11754:2;11734:18;;;11727:30;11793:34;11773:18;;;11766:62;-1:-1:-1;;;11844:18:1;;;11837:40;11894:19;;20302:85:0;11513:406:1;25204:176:0;25260:6;;25290:5;25294:1;25290;:5;:::i;:::-;25279:16;;25320:1;25315;:6;;:16;;;;;25330:1;25325;:6;;25315:16;25314:38;;;;25341:1;25337;:5;:14;;;;;25350:1;25346;:5;25306:47;;;;;14178:229;14315:12;14347:52;14369:6;14377:4;14383:1;14386:12;14347:21;:52::i;:::-;14340:59;14178:229;-1:-1:-1;;;;14178:229:0:o;15298:455::-;15468:12;15526:5;15501:21;:30;;15493:81;;;;-1:-1:-1;;;15493:81:0;;12331:2:1;15493:81:0;;;12313:21:1;12370:2;12350:18;;;12343:30;12409:34;12389:18;;;12382:62;-1:-1:-1;;;12460:18:1;;;12453:36;12506:19;;15493:81:0;12129:402:1;15493:81:0;15586:12;15600:23;15627:6;-1:-1:-1;;;;;15627:11:0;15646:5;15653:4;15627:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15585:73;;;;15676:69;15703:6;15711:7;15720:10;15732:12;15676:26;:69::i;:::-;15669:76;15298:455;-1:-1:-1;;;;;;;15298:455:0:o;17871:644::-;18056:12;18085:7;18081:427;;;18113:10;:17;18134:1;18113:22;18109:290;;-1:-1:-1;;;;;13619:19:0;;;18323:60;;;;-1:-1:-1;;;18323:60:0;;13030:2:1;18323:60:0;;;13012:21:1;13069:2;13049:18;;;13042:30;13108:31;13088:18;;;13081:59;13157:18;;18323:60:0;12828:353:1;18323:60:0;-1:-1:-1;18420:10:0;18413:17;;18081:427;18463:33;18471:10;18483:12;19218:17;;:21;19214:388;;19450:10;19444:17;19507:15;19494:10;19490:2;19486:19;19479:44;19214:388;19577:12;19570:20;;-1:-1:-1;;;19570:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;1136:118::-;1222:5;1215:13;1208:21;1201:5;1198:32;1188:60;;1244:1;1241;1234:12;1259:382;1324:6;1332;1385:2;1373:9;1364:7;1360:23;1356:32;1353:52;;;1401:1;1398;1391:12;1353:52;1440:9;1427:23;1459:31;1484:5;1459:31;:::i;:::-;1509:5;-1:-1:-1;1566:2:1;1551:18;;1538:32;1579:30;1538:32;1579:30;:::i;:::-;1628:7;1618:17;;;1259:382;;;;;:::o;1854:127::-;1915:10;1910:3;1906:20;1903:1;1896:31;1946:4;1943:1;1936:15;1970:4;1967:1;1960:15;1986:275;2057:2;2051:9;2122:2;2103:13;;-1:-1:-1;;2099:27:1;2087:40;;2157:18;2142:34;;2178:22;;;2139:62;2136:88;;;2204:18;;:::i;:::-;2240:2;2233:22;1986:275;;-1:-1:-1;1986:275:1:o;2266:191::-;2334:4;2367:18;2359:6;2356:30;2353:56;;;2389:18;;:::i;:::-;-1:-1:-1;2434:1:1;2430:14;2446:4;2426:25;;2266:191::o;2462:670::-;2516:5;2569:3;2562:4;2554:6;2550:17;2546:27;2536:55;;2587:1;2584;2577:12;2536:55;2623:6;2610:20;2649:4;2673:68;2689:51;2737:2;2689:51;:::i;:::-;2673:68;:::i;:::-;2775:15;;;2861:1;2857:10;;;;2845:23;;2841:32;;;2806:12;;;;2885:15;;;2882:35;;;2913:1;2910;2903:12;2882:35;2949:2;2941:6;2937:15;2961:142;2977:6;2972:3;2969:15;2961:142;;;3043:17;;3031:30;;3081:12;;;;2994;;2961:142;;;-1:-1:-1;3121:5:1;2462:670;-1:-1:-1;;;;;;2462:670:1:o;3137:1231::-;3263:6;3271;3324:2;3312:9;3303:7;3299:23;3295:32;3292:52;;;3340:1;3337;3330:12;3292:52;3380:9;3367:23;3409:18;3450:2;3442:6;3439:14;3436:34;;;3466:1;3463;3456:12;3436:34;3504:6;3493:9;3489:22;3479:32;;3549:7;3542:4;3538:2;3534:13;3530:27;3520:55;;3571:1;3568;3561:12;3520:55;3607:2;3594:16;3629:4;3653:68;3669:51;3717:2;3669:51;:::i;3653:68::-;3755:15;;;3837:1;3833:10;;;;3825:19;;3821:28;;;3786:12;;;;3861:19;;;3858:39;;;3893:1;3890;3883:12;3858:39;3917:11;;;;3937:217;3953:6;3948:3;3945:15;3937:217;;;4033:3;4020:17;4050:31;4075:5;4050:31;:::i;:::-;4094:18;;3970:12;;;;4132;;;;3937:217;;;4173:5;-1:-1:-1;;4216:18:1;;4203:32;;-1:-1:-1;;4247:16:1;;;4244:36;;;4276:1;4273;4266:12;4244:36;;4299:63;4354:7;4343:8;4332:9;4328:24;4299:63;:::i;:::-;4289:73;;;3137:1231;;;;;:::o;4565:323::-;4641:6;4649;4702:2;4690:9;4681:7;4677:23;4673:32;4670:52;;;4718:1;4715;4708:12;4670:52;4757:9;4744:23;4776:31;4801:5;4776:31;:::i;:::-;4826:5;4878:2;4863:18;;;;4850:32;;-1:-1:-1;;;4565:323:1:o;4893:250::-;4978:1;4988:113;5002:6;4999:1;4996:13;4988:113;;;5078:11;;;5072:18;5059:11;;;5052:39;5024:2;5017:10;4988:113;;;-1:-1:-1;;5135:1:1;5117:16;;5110:27;4893:250::o;5148:396::-;5297:2;5286:9;5279:21;5260:4;5329:6;5323:13;5372:6;5367:2;5356:9;5352:18;5345:34;5388:79;5460:6;5455:2;5444:9;5440:18;5435:2;5427:6;5423:15;5388:79;:::i;:::-;5528:2;5507:15;-1:-1:-1;;5503:29:1;5488:45;;;;5535:2;5484:54;;5148:396;-1:-1:-1;;5148:396:1:o;5971:338::-;6173:2;6155:21;;;6212:2;6192:18;;;6185:30;-1:-1:-1;;;6246:2:1;6231:18;;6224:44;6300:2;6285:18;;5971:338::o;6669:127::-;6730:10;6725:3;6721:20;6718:1;6711:31;6761:4;6758:1;6751:15;6785:4;6782:1;6775:15;6801:180;6868:18;6906:10;;;6918;;;6902:27;;6941:11;;;6938:37;;;6955:18;;:::i;:::-;6938:37;6801:180;;;;:::o;7341:128::-;7408:9;;;7429:11;;;7426:37;;;7443:18;;:::i;7474:217::-;7514:1;7540;7530:132;;7584:10;7579:3;7575:20;7572:1;7565:31;7619:4;7616:1;7609:15;7647:4;7644:1;7637:15;7530:132;-1:-1:-1;7676:9:1;;7474:217::o;7696:168::-;7769:9;;;7800;;7817:15;;;7811:22;;7797:37;7787:71;;7838:18;;:::i;7869:125::-;7934:9;;;7955:10;;;7952:36;;;7968:18;;:::i;7999:356::-;8201:2;8183:21;;;8220:18;;;8213:30;8279:34;8274:2;8259:18;;8252:62;8346:2;8331:18;;7999:356::o;8360:127::-;8421:10;8416:3;8412:20;8409:1;8402:31;8452:4;8449:1;8442:15;8476:4;8473:1;8466:15;8492:175;8529:3;8573:4;8566:5;8562:16;8602:4;8593:7;8590:17;8587:43;;8610:18;;:::i;:::-;8659:1;8646:15;;8492:175;-1:-1:-1;;8492:175:1:o;8672:184::-;8742:6;8795:2;8783:9;8774:7;8770:23;8766:32;8763:52;;;8811:1;8808;8801:12;8763:52;-1:-1:-1;8834:16:1;;8672:184;-1:-1:-1;8672:184:1:o;9620:380::-;9699:1;9695:12;;;;9742;;;9763:61;;9817:4;9809:6;9805:17;9795:27;;9763:61;9870:2;9862:6;9859:14;9839:18;9836:38;9833:161;;9916:10;9911:3;9907:20;9904:1;9897:31;9951:4;9948:1;9941:15;9979:4;9976:1;9969:15;9833:161;;9620:380;;;:::o;10763:216::-;10827:9;;;10855:11;;;10802:3;10885:9;;10913:10;;10909:19;;10938:10;;10930:19;;10906:44;10903:70;;;10953:18;;:::i;:::-;10903:70;;10763:216;;;;:::o;11263:245::-;11330:6;11383:2;11371:9;11362:7;11358:23;11354:32;11351:52;;;11399:1;11396;11389:12;11351:52;11431:9;11425:16;11450:28;11472:5;11450:28;:::i;11924:200::-;11990:9;;;11963:4;12018:9;;12046:10;;12058:12;;;12042:29;12081:12;;;12073:21;;12039:56;12036:82;;;12098:18;;:::i;12536:287::-;12665:3;12703:6;12697:13;12719:66;12778:6;12773:3;12766:4;12758:6;12754:17;12719:66;:::i;:::-;12801:16;;;;;12536:287;-1:-1:-1;;12536:287:1:o
Swarm Source
ipfs://90a06f517c358598a95393848a4c786b53bdec0bae78f3e46e06a36c669f5a0a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.