BasedToken

0x64bccc2b81de41c582c7304c429567fb8d3b5b1d

Verification
Verified
v0.8.35+commit.47b9dedd
Type
Contract
15,026 bytes
ABI entries
58
22 read · 16 write
License
none

Contract information

Address
0x64bccc2b81de41c582c7304c429567fb8d3b5b1d
Chain
Robinhood Chain (4663)
Compiler
v0.8.35+commit.47b9dedd
Optimization
Enabled
Creation tx
0x9e8cd52741…55e7b41fc5

Token

Name
PIXEL MOG
Symbol
PKS
Decimals
18
Holders
2

Read contract (22)

allowance(address, address)uint256
balanceOf(address)uint256
decimals()uint8
dividendTokenBalanceOf(address)uint256
dividendTracker()address
gasForProcessing()uint256
getAccountDividendsInfo(address, address)address, int256, int256, uint256, uint256, uint256, uint256, uint256
getAccountDividendsInfoAtIndex(uint256, address)address, int256, int256, uint256, uint256, uint256, uint256, uint256
getClaimWait()uint256
getLastProcessedIndex()uint256
getMinimumTokenBalanceForDividends()uint256
getNumberOfDividendTokenHolders()uint256
getRewardTokenAt(uint256)address
getRewardTokensLength()uint256
getTotalDividendsDistributed(address)uint256
isExcludedFromDividends(address)bool
name()string
owner()address
symbol()string
totalSupply()uint256
tradingEnabled()bool
withdrawableDividendOf(address, address)uint256

Events (8)

ApprovalGasForProcessingUpdatedInitializedOwnershipTransferredProcessedDividendTrackerTradingEnabledTransferUpdateDividendTracker

ABI

[
  {
    "inputs": [],
    "name": "ERC1167FailedCreateClone",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "allowance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientAllowance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "balance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "approver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidApprover",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidReceiver",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSpender",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidInitialization",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotInitializing",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "OwnableInvalidOwner",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "OwnableUnauthorizedAccount",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "GasForProcessingUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint64",
        "name": "version",
        "type": "uint64"
      }
    ],
    "name": "Initialized",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "iterations",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "claims",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "lastProcessedIndex",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "bool",
        "name": "automatic",
        "type": "bool"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "gas",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "processor",
        "type": "address"
      }
    ],
    "name": "ProcessedDividendTracker",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [],
    "name": "TradingEnabled",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "tracker",
        "type": "address"
      }
    ],
    "name": "UpdateDividendTracker",
    "type": "event"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "token",
        "type": "address"
      }
    ],
    "name": "addRewardToken",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "claim",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "dividendTokenBalanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "dividendTracker",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "enableTrade",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "excludeFromDividends",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "gasForProcessing",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "rewardToken",
        "type": "address"
      }
    ],
    "name": "getAccountDividendsInfo",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "int256",
        "name": "",
        "type": "int256"
      },
      {
        "internalType": "int256",
        "name": "",
        "type": "int256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "rewardToken",
        "type": "address"
      }
    ],
    "name": "getAccountDividendsInfoAtIndex",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "int256",
        "name": "",
        "type": "int256"
      },
      {
        "internalType": "int256",
        "name": "",
        "type": "int256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getClaimWait",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getLastProcessedIndex",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getMinimumTokenBalanceForDividends",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getNumberOfDividendTokenHolders",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index",
        "type": "uint256"
      }
    ],
    "name": "getRewardTokenAt",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getRewardTokensLength",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "rewardToken",
        "type": "address"
      }
    ],
    "name": "getTotalDividendsDistributed",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_totalSupply",
        "type": "uint256"
      },
      {
        "internalType": "string",
        "name": "name",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "symbol",
        "type": "string"
      },
      {
        "internalType": "uint8",
        "name": "__decimals",
        "type": "uint8"
      },
      {
        "internalType": "address[]",
        "name": "_rewardTokens",
        "type": "address[]"
      },
      {
        "internalType": "uint256",
        "name": "minimumTokenBalanceForDividends",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "v4Hook",
        "type": "address"
      }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "isExcludedFromDividends",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "gas",
        "type": "uint256"
      }
    ],
    "name": "processDividendTracker",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "tradingEnabled",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "claimWait",
        "type": "uint256"
      }
    ],
    "name": "updateClaimWait",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newAddress",
        "type": "address"
      }
    ],
    "name": "updateDividendTracker",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "newValue",
        "type": "uint256"
      }
    ],
    "name": "updateGasForProcessing",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "updateMinimumTokenBalanceForDividends",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newV4Hook",
        "type": "address"
      }
    ],
    "name": "updateV4Hook",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "rewardToken",
        "type": "address"
      }
    ],
    "name": "withdrawableDividendOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "stateMutability": "payable",
    "type": "receive"
  }
]

Source code

// SPDX-License-Identifier: MIT
//Created on based.bid - Instant Token Launchpad with ZERO Cost
pragma solidity 0.8.35;
import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {DividendTokenDividendTracker} from "./DividendTokenDividendTracker.sol";

contract BasedToken is Initializable, ERC20Upgradeable, OwnableUpgradeable {
    address public dividendTracker;
    uint256 public gasForProcessing;
    uint8 private _decimals;
    bool public tradingEnabled;

    event TradingEnabled();
    event UpdateDividendTracker(address indexed tracker);
    event GasForProcessingUpdated(uint256 indexed value);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    modifier validateTransfer(address from, address to) {
        require(
            tradingEnabled ||
                _msgSender() == owner() ||
                from == owner() ||
                to == owner() ||
                from == address(0) ||
                to == address(0),
            "not listed"
        );
        _;
    }

    /// @param _rewardTokens Reward assets paid to holders. Use `address(0)` for native coin.
    function initialize(
        uint256 _totalSupply,
        string memory name,
        string memory symbol,
        uint8 __decimals,
        address[] memory _rewardTokens,
        uint256 minimumTokenBalanceForDividends,
        address v4Hook
    ) public initializer {
        __ERC20_init(name, symbol);
        __Ownable_init(msg.sender);
        gasForProcessing = 300000;
        emit GasForProcessingUpdated(300000);
        address tracker = Clones.clone(0x9C25B6ff9123C29D61ad8989D5F540714054f667);
        dividendTracker = tracker;
        emit UpdateDividendTracker(tracker);
        DividendTokenDividendTracker(payable(tracker)).initialize(
            _rewardTokens,
            minimumTokenBalanceForDividends,
            v4Hook
        );
        _decimals = __decimals;
        _mint(msg.sender, _totalSupply);
        DividendTokenDividendTracker(payable(tracker)).excludeFromDividends(address(this));
        DividendTokenDividendTracker(payable(tracker)).excludeFromDividends(tracker);
        DividendTokenDividendTracker(payable(tracker)).excludeFromDividends(owner());
        DividendTokenDividendTracker(payable(tracker)).excludeFromDividends(address(0xdead));
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(
            newAddress != dividendTracker,
            "The dividend tracker already has that address"
        );

        address newDividendTracker = payable(newAddress);

        require(
            DividendTokenDividendTracker(payable(newDividendTracker)).owner() ==
                address(this),
            "The new dividend tracker must be owned by the DIVIDENEDTOKEN token contract"
        );

        DividendTokenDividendTracker(payable(newDividendTracker)).excludeFromDividends(
            newDividendTracker
        );
        DividendTokenDividendTracker(payable(newDividendTracker)).excludeFromDividends(
            address(this)
        );
        DividendTokenDividendTracker(payable(newDividendTracker)).excludeFromDividends(
            address(0xdead)
        );

        emit UpdateDividendTracker(newAddress);

        dividendTracker = newDividendTracker;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(
            newValue >= 200000 && newValue <= 500000,
            "gasForProcessing must be between 200,000 and 500,000"
        );
        require(
            newValue != gasForProcessing,
            "Cannot update gasForProcessing to same value"
        );
        emit GasForProcessingUpdated(newValue);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        DividendTokenDividendTracker(payable(dividendTracker)).updateClaimWait(
            claimWait
        );
    }

    function getClaimWait() external view returns (uint256) {
        return DividendTokenDividendTracker(payable(dividendTracker)).claimWait();
    }

    function updateMinimumTokenBalanceForDividends(
        uint256 amount
    ) external onlyOwner {
        DividendTokenDividendTracker(payable(dividendTracker))
            .updateMinimumTokenBalanceForDividends(amount);
    }

    function getMinimumTokenBalanceForDividends()
        external
        view
        returns (uint256)
    {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .minimumTokenBalanceForDividends();
    }

    function addRewardToken(address token) external onlyOwner {
        DividendTokenDividendTracker(payable(dividendTracker)).addRewardToken(token);
    }

    function getRewardTokensLength() external view returns (uint256) {
        return DividendTokenDividendTracker(payable(dividendTracker)).rewardTokensLength();
    }

    function getRewardTokenAt(uint256 index) external view returns (address) {
        return DividendTokenDividendTracker(payable(dividendTracker)).rewardTokens(index);
    }

    function getTotalDividendsDistributed(address rewardToken) external view returns (uint256) {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .totalDividendsDistributed(rewardToken);
    }

    function withdrawableDividendOf(
        address account,
        address rewardToken
    ) public view returns (uint256) {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .withdrawableDividendOf(account, rewardToken);
    }

    function dividendTokenBalanceOf(
        address account
    ) public view returns (uint256) {
        return DividendTokenDividendTracker(payable(dividendTracker)).balanceOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner {
        DividendTokenDividendTracker(payable(dividendTracker)).excludeFromDividends(
            account
        );
    }

    function isExcludedFromDividends(
        address account
    ) public view returns (bool) {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .isExcludedFromDividends(account);
    }

    function getAccountDividendsInfo(
        address account,
        address rewardToken
    )
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return
            DividendTokenDividendTracker(payable(dividendTracker)).getAccount(account, rewardToken);
    }

    function getAccountDividendsInfoAtIndex(
        uint256 index,
        address rewardToken
    )
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return
            DividendTokenDividendTracker(payable(dividendTracker)).getAccountAtIndex(
                index,
                rewardToken
            );
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = DividendTokenDividendTracker(payable(dividendTracker)).process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            msg.sender
        );
    }

    function claim() external {
        DividendTokenDividendTracker(payable(dividendTracker)).processAccount(
            payable(msg.sender),
            false
        );
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return
            DividendTokenDividendTracker(payable(dividendTracker))
                .getNumberOfTokenHolders();
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override validateTransfer(from, to) {
        super._update(from, to, amount);

        DividendTokenDividendTracker tracker = DividendTokenDividendTracker(payable(dividendTracker));
        try tracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try tracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if (from != address(0) && to != address(0) && tradingEnabled) {
            uint256 gas = gasForProcessing;
            try tracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations, claims, lastProcessedIndex, true, gas, msg.sender
                );
            } catch {}
        }
    }

    function enableTrade() external onlyOwner {
        require(!tradingEnabled, "trading already enabled");
        tradingEnabled = true;
        emit TradingEnabled();
    }

    function updateV4Hook(address newV4Hook) public onlyOwner {
        DividendTokenDividendTracker(payable(dividendTracker)).updateV4Hook(newV4Hook);
    }

    receive() external payable {}
}
Chain explorer4039msChain node94ms