/// Claim tokens for team/giveaways.
/// @param addresses An array of addresses to mint tokens for
/// @param quantities An array of quantities for each respective address to mint
/// @dev This method does NOT increment an addresses minting total

function ownerClaim(address[] calldata addresses, uint256[] calldata quantities) external onlyOwner nonReentrant {
        require(addresses.length == quantities.length, "Invalid args");
        IGraveyard graveyard = IGraveyard(GRAVEYARD_ADDRESS);
        for (uint256 a = 0;a < addresses.length;a++) {
            graveyard.updateClaimable(addresses[a], 1e18 * 1000 * quantities[a]);
            _mint(addresses[a], quantities[a]);
        }
    }


/// Returns rewards for address for reward actions.
/// Multiplier of 10 * token balance + multiplier if set.
/// @param from The address to calculate reward rate for

function getRewardRate(address from) external view returns (uint256) {
        uint256 balance = balanceOf(from);
        if (_dataAddress == address(0)) return 1e18 * 10 * balance;
        ICryptData data = ICryptData(_dataAddress);
        uint256 rate = 0;
        for (uint256 i = 0;i < balance;i++) {
            rate += data.getRewardRate(tokenOfOwnerByIndex(from, i));
        }
        return rate;
    }


// Stake $HIPPO

function stake(uint256 amount) public updateStakingReward(msg.sender) {
        require(isStart, "not started");
        require(0 < amount, ":stake: Fund Error");
        totalStakedAmount = totalStakedAmount.add(amount);
        staked[msg.sender].stakedHIPPO = staked[msg.sender].stakedHIPPO.add(amount);
        HippoToken.safeTransferFrom(msg.sender, address(this), amount);
        staked[msg.sender].lastBlock = block.number;
        emit Staked(msg.sender, amount, totalStakedAmount);
    }