Skip to content
Request an audit

‹ All findings

DarkPoolAssetManager can be drained by looping over join(), joinSplit() or swap() with only some initial amount

Crit/HighSingularity·Three Sigma · Private DeFi access · 26th February, 20243S-SG-C05

Description

DarkPoolAssetManager::join(), DarkPoolAssetManager::joinSplit() and DarkPoolAssetManager::swap() don't check if the 2 notes are the same.

Thus, using only 1 note, it's possible to double the amount of funds available. When used in a loop, this enables draining the whole asset manager.

Here is the poc for join() and joinSplit and here for swap().

Recommendation

Check if the input notes are the same.

Status

Addressed in #8b300f0.