Summary
Tokens can be distributed to teamGnosis, even if DistributionParams.teamGnosis is 0.
Vulnerability Details
When the new mintAmount is distributed from TempeGold._distribute(), it will be split between staking, escrow, and teamGnosis. If there is a remainder, teamGnosis will be prioritized (line 239), and will handle the remainder. However, the teamGnosis percentage can be 0, as stated in the Known Issues section:
In Temple Gold contract, setDistributionParams() can be executed with 0 value for a parameter eg. params.gnosis -
This is intentional to freely distribute minted TGLD to staking and dai gold auction only.
In this case, the mint amount is expected to be split only between staking and escrow. However, if there is a remainder, it will still be sent to teamGnosis.
function _distribute(DistributionParams storage params, uint256 mintAmount) private {
uint256 stakingAmount = TempleMath.mulDivRound(params.staking, mintAmount, DISTRIBUTION_DIVISOR, false);
if (stakingAmount > 0) {
>> _mint(address(staking), stakingAmount);
staking.notifyDistribution(stakingAmount);
}
uint256 escrowAmount = TempleMath.mulDivRound(params.escrow, mintAmount, DISTRIBUTION_DIVISOR, false);
if (escrowAmount > 0) {
>> _mint(address(escrow), escrowAmount);
escrow.notifyDistribution(escrowAmount);
}
uint256 gnosisAmount = mintAmount - stakingAmount - escrowAmount;
if (gnosisAmount > 0) {
>> _mint(teamGnosis, gnosisAmount);
}
_totalDistributed += mintAmount;
emit Distributed(stakingAmount, escrowAmount, gnosisAmount, block.timestamp);
}
Impact
Tokens will be sent to teamGnosis unintentionally.
Tools Used
Manual Review
Recommendations
If DistributionParams.teamGnosis is 0, distribute the remaining tokens to either staking or escrow.
function _distribute(DistributionParams storage params, uint256 mintAmount) private {
uint256 stakingAmount = TempleMath.mulDivRound(params.staking, mintAmount, DISTRIBUTION_DIVISOR, false);
if (stakingAmount > 0) {
_mint(address(staking), stakingAmount);
staking.notifyDistribution(stakingAmount);
}
uint256 escrowAmount = TempleMath.mulDivRound(params.escrow, mintAmount, DISTRIBUTION_DIVISOR, false);
+ if (params.teamGnosis == 0) {
+ escrowAmount += mintAmount - stakingAmount - escrowAmount;
+ }
if (escrowAmount > 0) {
_mint(address(escrow), escrowAmount);
escrow.notifyDistribution(escrowAmount);
}
uint256 gnosisAmount = mintAmount - stakingAmount - escrowAmount;
if (gnosisAmount > 0) {
_mint(teamGnosis, gnosisAmount);
}
_totalDistributed += mintAmount;
emit Distributed(stakingAmount, escrowAmount, gnosisAmount, block.timestamp);
}