PoolTogether - AcT3R's results

General Information

Platform: Code4rena

Start Date: 04/03/2024

Pot Size: $36,500 USDC

Total HM: 9

Participants: 80

Period: 7 days

Judge: hansfriese

Total Solo HM: 2

Id: 332

League: ETH

PoolTogether

Findings Distribution

Researcher Performance

Rank: 77/80

Findings: 1

Award: $1.47

🌟 Selected for report: 0

🚀 Solo Findings: 0

Awards

1.4652 USDC - $1.47

Labels

bug
3 (High Risk)
satisfactory
sufficient quality report
edited-by-warden
:robot:_10_group
duplicate-59

External Links

Lines of code

https://github.com/code-423n4/2024-03-pooltogether/blob/480d58b9e8611c13587f28811864aea138a0021a/pt-v5-vault/src/PrizeVault.sol#L611-L622

Vulnerability details

Impact

The claimYieldFeeShares method is intended to claim the yield fee in shares based on _shares parameter. The yield fee recipient passes the number of shares it wants to claim, which is then compared with the yieldFeeBalance which should represent the amount of claimable shares for the recipient. In case _shares parameter is lower than yieldFeeBalance, it will mint the _shares amount of shares but will reset the yieldFeeBalance to 0 in any case. The result is that the yield fee recipient receives fewer shares than it should, and the value that would come from the rest of the shares is lost to him and the assets are shared with the depositors.

Proof of Concept

function claimYieldFeeShares(uint256 _shares) external onlyYieldFeeRecipient {
        if (_shares == 0) revert MintZeroShares();

        uint256 _yieldFeeBalance = yieldFeeBalance;
        if (_shares > _yieldFeeBalance) revert SharesExceedsYieldFeeBalance(_shares, _yieldFeeBalance);

@>      yieldFeeBalance -= _yieldFeeBalance;

        _mint(msg.sender, _shares);

        emit ClaimYieldFeeShares(msg.sender, _shares);
    }

https://github.com/code-423n4/2024-03-pooltogether/blob/480d58b9e8611c13587f28811864aea138a0021a/pt-v5-vault/src/PrizeVault.sol#L611-L622

Tools Used

Manual review

There are multiple possible solutions for the issue.

One is to remove _shares parameter and mint the number of shares to the fee recipient based on the yieldFeeBalance value.

   function claimYieldFeeShares() external onlyYieldFeeRecipient {
        uint256 _yieldFeeBalance = yieldFeeBalance;

        yieldFeeBalance = 0;

        _mint(msg.sender, _yieldFeeBalance);

        emit ClaimYieldFeeShares(msg.sender, _yieldFeeBalance);
   }

The other one is to leave _shares parameter but properly calculate the yieldFeeBalance based on the _shares parameter.

   function claimYieldFeeShares(uint256 _shares) external onlyYieldFeeRecipient {
        if (_shares == 0) revert MintZeroShares();

        uint256 _yieldFeeBalance = yieldFeeBalance;
        if (_shares > _yieldFeeBalance) revert SharesExceedsYieldFeeBalance(_shares, _yieldFeeBalance);

        yieldFeeBalance -= _shares;

        _mint(msg.sender, _shares);

        emit ClaimYieldFeeShares(msg.sender, _shares);
    }

Assessed type

Error

#0 - c4-pre-sort

2024-03-11T21:38:39Z

raymondfam marked the issue as sufficient quality report

#1 - c4-pre-sort

2024-03-11T21:38:46Z

raymondfam marked the issue as duplicate of #10

#2 - c4-pre-sort

2024-03-13T04:38:08Z

raymondfam marked the issue as duplicate of #59

#3 - c4-judge

2024-03-15T07:40:39Z

hansfriese marked the issue as satisfactory

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter