Skip to content

Commit

Permalink
EMP feature (nukeFund) + mint total supply ok (depth 100000)
Browse files Browse the repository at this point in the history
  • Loading branch information
drikssy committed Oct 4, 2024
1 parent 6414eb7 commit 70577aa
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 15 deletions.
27 changes: 26 additions & 1 deletion contracts/NukeFund.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
address public ethCollector;
uint256 public initNukeFactorDivisor = 100;

uint256 public unpauseAt;
uint256 public empDivisor = 10;
bool public isEMPActive = false;

// Events

// Errors
Expand All @@ -33,6 +37,7 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
error NukeFund__TokenNotMature();
error NukeFund__AddressIsZero();
error NukeFund__DivisorIsZero();
error NukeFund__EmpIsActive();

// Modifiers

Expand Down Expand Up @@ -72,6 +77,10 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
}

function nuke(uint256 tokenId) public whenNotPaused nonReentrant {
if (isEMPActive) {
if (block.number < unpauseAt) revert NukeFund__EmpIsActive();
isEMPActive = false;
}
ITraitForgeNft traitForgeNft = _getTraitForgeNft();
if (traitForgeNft.ownerOf(tokenId) != msg.sender) revert NukeFund__CallerNotTokenOwner();
if (
Expand All @@ -97,6 +106,8 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
(bool success,) = payable(msg.sender).call{ value: claimAmount }("");
require(success, "Failed to send Ether");

_activateEmpIfNeeded(tokenId);

emit Nuked(msg.sender, tokenId, claimAmount); // Emit the event with the actual claim amount
emit FundBalanceUpdated(fund); // Update the fund balance
}
Expand Down Expand Up @@ -135,6 +146,11 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
initNukeFactorDivisor = value;
}

function setEmpDivisor(uint256 value) external onlyProtocolMaintainer {
if (value == 0) revert NukeFund__DivisorIsZero();
empDivisor = value;
}

// View function to see the current balance of the fund
function getFundBalance() public view returns (uint256) {
return fund;
Expand Down Expand Up @@ -162,7 +178,8 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
uint256 entropy = traitForgeNft.getTokenEntropy(tokenId);
uint256 adjustedAge = calculateAge(tokenId);

uint256 initialNukeFactor = entropy / initNukeFactorDivisor; // calcualte initalNukeFactor based on entropy, 5 digits
uint256 initialNukeFactor = entropy / initNukeFactorDivisor; // calcualte initalNukeFactor based on entropy, 5
// digits

uint256 finalNukeFactor = ((adjustedAge * defaultNukeFactorIncrease) / MAX_DENOMINATOR) + initialNukeFactor; // CONSIDER
// USING DYNAMIC INCREASE BY ENTROPY INSTEAD OF DEFAULT
Expand All @@ -180,6 +197,14 @@ contract NukeFund is INukeFund, AddressProviderResolver, ReentrancyGuard, Pausab
return tokenAgeInSeconds >= minimumDaysHeld;
}

function _activateEmpIfNeeded(uint256 tokenId) private {
uint256 entropy = _getTraitForgeNft().getTokenEntropy(tokenId);
if (entropy % 10 == 7) {
isEMPActive = true; // sets EMPActive to true if the token is an emp
unpauseAt = block.number + (entropy / empDivisor); // sets the end index of pause
}
}

function _getDevFundAddress() private view returns (address) {
return _addressProvider.getDevFund();
}
Expand Down
6 changes: 3 additions & 3 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ wrap_comments = true
via-ir = false

[invariant]
runs = 128
depth = 128
fail_on_revert = true
runs = 1
depth = 200000
fail_on_revert = false

[rpc_endpoints]
base = "https://base-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}"
Expand Down
20 changes: 9 additions & 11 deletions test/integration/invariants/Handler.t.sol
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import { Test } from "@forge-std/Test.sol";
import { Test, console } from "@forge-std/Test.sol";
import { TraitForgeNft } from "contracts/TraitForgeNft.sol";

contract Handler is Test {
TraitForgeNft public traitForgeNft;

constructor(TraitForgeNft _traitForgeNft) {
traitForgeNft = _traitForgeNft;
_skipWhitelistTime();
}

function singleMint() public {
_skipWhitelistTime();
bytes32[] memory proofs = new bytes32[](0);
uint256 price = traitForgeNft.calculateMintPrice();
vm.deal(msg.sender, price);
vm.prank(msg.sender);
traitForgeNft.mintToken{ value: price }(proofs);
}

function mintWithBudget(uint96 value) public {
_skipWhitelistTime();
uint256 price = traitForgeNft.calculateMintPrice();
uint256 budget = bound(uint256(value), price, 1 ether);
bytes32[] memory proofs = new bytes32[](0);
vm.deal(msg.sender, budget);
vm.prank(msg.sender);
traitForgeNft.mintWithBudget{ value: budget }(proofs, 1);
}
// function mintWithBudget() public {
// uint256 price = traitForgeNft.calculateMintPrice();
// bytes32[] memory proofs = new bytes32[](0);
// vm.deal(msg.sender, price);
// vm.prank(msg.sender);
// traitForgeNft.mintWithBudget{ value: price }(proofs, 1);
// }

function _skipWhitelistTime() internal {
uint256 _endWhitheListTimestamp = traitForgeNft.whitelistEndTime();
Expand Down

0 comments on commit 70577aa

Please sign in to comment.