The docs which clarifies the reward ratio for MartenitsaToken to HealthToken clearly states that For every 3 different MartenitsaTokens you receive 1 HealthToken
. However, a review of the implementation shows that the for every 3
different MartenitsaTokens any individual holds, that individual gets 1000000000000000000
HealthToken. The issue here lies in that the HealthToken::distributeHealthToken
does a 10 ** 18
on the amount to be minted which is not considered in the calculation of rewards.
contract POC is Test {
MartenitsaMarketplace martenitsaMarketplace;
HealthToken health;
MartenitsaToken martenitsaToken;
MartenitsaVoting voting;
address buyer = makeAddr("buyer");
address[] public producers;
address chasy = makeAddr("chasy");
function setUp() public {
producers.push(chasy);
martenitsaToken = new MartenitsaToken();
health = new HealthToken();
martenitsaMarketplace = new MartenitsaMarketplace(address(health), address(martenitsaToken));
voting = new MartenitsaVoting(address(martenitsaMarketplace), address(health));
health.setMarketAndVotingAddress(address(martenitsaMarketplace), address(voting));
martenitsaToken.setProducers(producers);
vm.deal(buyer, 2 ether);
}
function test_ratioOfHtToMt() public {
vm.startPrank(chasy);
martenitsaToken.createMartenitsa("bracelet");
martenitsaMarketplace.listMartenitsaForSale(0, 1 wei);
martenitsaToken.approve(address(martenitsaMarketplace), 0);
vm.stopPrank();
vm.startPrank(chasy);
martenitsaToken.createMartenitsa("bracelet");
martenitsaMarketplace.listMartenitsaForSale(1, 1 wei);
martenitsaToken.approve(address(martenitsaMarketplace), 1);
vm.stopPrank();
vm.startPrank(chasy);
martenitsaToken.createMartenitsa("bracelet");
martenitsaMarketplace.listMartenitsaForSale(2, 1 wei);
martenitsaToken.approve(address(martenitsaMarketplace), 2);
vm.stopPrank();
vm.startPrank(buyer);
martenitsaMarketplace.buyMartenitsa{value: 1 wei}(0);
vm.stopPrank();
vm.startPrank(buyer);
martenitsaMarketplace.buyMartenitsa{value: 1 wei}(1);
vm.stopPrank();
vm.startPrank(buyer);
martenitsaMarketplace.buyMartenitsa{value: 1 wei}(2);
vm.stopPrank();
vm.startPrank(buyer);
martenitsaMarketplace.collectReward();
vm.stopPrank();
assertEq(health.balanceOf(buyer), 1000000000000000000);
assertEq(martenitsaToken.balanceOf(buyer), 3);
}
}
The HealthToken intentetd total supply would always be different than what is intended.