

Security Researcher
Founder @SoloditOfficial. Co-founder and Security Researcher @CyfrinAudits. Judge at @code4rena. Top Warden of 2023 @code4rena.
High
Total
Medium
Solo
Total

Total Earnings
#47 All Time

Payouts

1st Places

2nd Places

3rd Places
All
Sherlock
Code4rena
Apr '23
Findings not publicly available for private contests.
Feb '23
Findings not publicly available for private contests.
medium
Reward tokens can't be added again once they are removed because there is no way to reset the user's previous debt/cache state.
medium
Users wouldn't claim their unclaimed rewards once the reward token is removed.
medium
`SingleSidedLiquidityVault.deposit()` and `SingleSidedLiquidityVault.withdraw()` will revert if `rewardToken.lastRewardTime > block.timestamp`.
high
User can lose up to whole stake on vault withdrawal when there are funds locked in the strategy
medium
If the strategy incurs a loss the Active Pool will stop working until the shortfall is paid out entirely
medium
In `ReaperVaultV2`, we should update `lockedProfit` and `lastReport` before changing `lockedProfitDegradation`.
medium
`ReaperBaseStrategyv4.harvest()` might revert in an emergency.
Findings not publicly available for private contests.
Jan '23
high
Lost Rewards in MultiRewardStaking Upon Third-Party Withdraw
high
Staking rewards can be drained
high
Incorrect Reward Duration After Change in Reward Speed in MultiRewardStaking
medium
Faulty Escrow config will lock up reward tokens in Staking contract
medium
vault.changeAdapter can be misused to drain fees
medium
`Vault.redeem` function does not use `syncFeeCheckpoint` modifier
medium
cool down time period is not properly respected for the `harvest` method
medium
Users can fail to withdraw deposited assets from a vault that uses `YearnAdapter` contract as its adapter because `maxLoss` input for calling corresponding Yearn vault's `withdraw` function cannot be specified
medium
In `MultiRewardStaking.addRewardToken()`, `rewardsPerSecond` is not accurate enough to handle all type of reward tokens.
medium
Total assets of yearn vault are not correct
medium
Anyone can reset fees to 0 value when Vault is deployed
Dec '22
high
Malicious user can steal all assets in BondNFT
high
Users can bypass the `maxWinPercent` limit using a partially closing
high
User can abuse tight stop losses and high leverage to make risk free trades
high
Not enough margin pulled or burned from user when adding to a position
medium
Centralization risks: owner can freeze withdraws and use timelock to steal all funds
medium
StopLoss/TakeProfit should be validated again for the new price in `Trading.executeLimitOrder()`
high
`LPDA` price can underflow the price due to bad settings and potentially brick the contract
high
`saleReceiver` and `feeReceiver` can steal refunds after sale has ended
medium
`OpenEdition.buy()` might revert due to uint overflow when it should work.
medium
Editions should be checked if they are actually deployed from the legitimate Escher721Factory
medium
ETH will get stuck if all NFTs do not get sold.
medium
Sale contracts can be bricked if any other minter mints a token with an id that overlaps the sale
medium
Escher721 contract does not have setTokenRoyalty function
medium
Use of `payable.transfer()` Might Render ETH Impossible to Withdraw
Findings not publicly available for private contests.
Nov '22
high
A malicious user can drain the protocol funds using `reclaimContract()`.
high
Attacker can trigger permanent lock of funds of normal traders
medium
The NFT might be locked inside the protocol forever after the contract was settled.
medium
Protocol can lose the fee and withdrawal function can become useless.
high
`Staking.unstake()` doesn't decrease the original voting power that was used in `Staking.stake()`.
high
`Staking._stakeToken()` calculates `stakedTimeBonus` wrongly.
high
The total community voting power can be huge because of incorrect conditions.
medium
`Governance.queue()` should update the `CommunityScoreData.proposalsPassed` instead of `CommunityScoreData.proposalsCreated`.
medium
Voters can increase their community voting power without any token voting power using `castVote()`.
medium
`Staking._stakeToken()` and `Staking.evilBonus()` don't calculate a voting power for a monster like a document.
high
Attacker can steal any funds in the contract by state confusion (no preconditions)
high
Bidders might fail to withdraw their unused funds after the auction was finalized because the contract doesn't have enough balance.
medium
Seller's ability to decrypt bids before reveal could result in a much higher clearing price than anticpated and make buyers distrust the system
medium
Denial of service when `baseAmount` is equal to zero
medium
Incompatibility with fee-on-transfer/inflationary/deflationary/rebasing tokens, on both base tokens and quote tokens, with varying impacts
medium
The sorting logic is not strict enough
high
Borrower can close a credit without repaying debt
high
Repaying a line of credit with a higher than necessary claimed revenue amount will force the borrower into liquidation
medium
Reentrancy bug allows lender to steal other lenders funds
medium
Mutual consent cannot be revoked and stays valid forever
medium
Variable balance ERC20 support
Oct '22
high
Refinance validation is wrong
high
Potential debt calculation on new loan is wrong
high
`AuctionHouse.cancelAuction()` doesn't refund the last bidder.
medium
timeToEpochEnd is wrong
medium
Rate is used in wrong units
medium
`AuctionHouse.createBid()` will revert when it should increase the duration.
medium
Inconsistent usage of `firstBidTime` in `AuctionHouse.createAuction()` and `AuctionHouse.createBid()`
medium
ChangeInSlope function is wrong.
medium
Borrower might get loss while repaying.
high
The `Vault` contract should check more validations to prevent the `first depositor` issue.
medium
`Vault.convertToShares()` and `onTokenTransfer()` check the wrong condition for the first deposit.
medium
`Vault._withdrawFromPlugin()` always reverts when `_amount == 0`.
medium
The admin might add the same plugin using `Vault.addPlugin()` by fault.
Sep '22
high
In `Auction.sol`, users might fail to withdraw the funds from the processed auction because of the uint underflow.
high
`AuctionInternal._previewWithdraw()` might return the wrong result after some orders are removed during the withdrawal.
medium
`Auction.getEpochsByBuyer()` might omit some valid epochs.
medium
Chainlink's latestRoundData might return stale or incorrect results.
Aug '22
high
Builder can halve the interest paid to a community owner due to arithmetic rounding
high
Project funds can be drained by reusing signatures, in some cases
medium
Project.changeOrder() would work unexpectedly for non SCConfirmed tasks.
medium
Project.addTasks() wouldn't work properly when it's called from disputes contract.
medium
Builders must pay more interest when the system is paused.
medium
In Project.setComplete(), the signature can be reused when the first call is reverted for some reason.
medium
It should not submit a project with no total budget. Requires at least one task with cost > 0
medium
New subcontractor can be set for a SCConfirmed task without current subcontractor consent
medium
Missing upper limit definition in replaceLenderFee() of HomeFi.sol
medium
Hash approval not possible when contractor == subcontractor
Jul '22
high
Failed proposal can be committed again
high
Users can lose fractions to precision loss during migraction if _newFractionSupply is set very low
high
Proposal which started buyout which fails is able to settle migration as if its buyout succeeded.
high
Any fractions deposited into any proposal can be stolen at any time until it is commited
high
Migration::withdrawContribution falsely assumes that user should get exactly his original contribution back
high
Cash-out from a successful buyout allows an attacker to drain Ether from the `Buyout` contract
high
```migrateFractions``` may be called more than once by the same user which may lead to loss of tokens for other users
medium
Migration.join() and Migration.leave() can still work after unsucessful migration.
Jun '22
high
Zero strike call options can be systemically used to steal premium from the taker
high
`acceptCounterOffer()` May Result In Both Orders Being Filled
medium
`fillOrder()` and `exercise()` may lock Ether sent to the contract, forever
medium
Options with a small strike price will round down to 0 and can prevent assets to be withdrawn
medium
Malicious Token Contracts May Lead To Locking Orders
high
Funds may be stuck when `redeeming` for Illuminate
high
Illuminate PT redeeming allows for burning from other accounts
high
[H-05] Not minting iPTs for lenders in several lend functions
medium
Swivel lend method doesn't pull protocol fee from user
medium
Lend method signature for illuminate does not track the accumulated fee
May '22
medium
Strategy in StakerVault.sol can steal more rewards even though it's designed strategies shouldn't get rewards.
medium
Users can claim more fees than expected if governance migrates current rewardToken again by fault.
medium
StakerVault.unstake(), StakerVault.unstakeFor() would revert with a uint underflow error of StakerVault.strategiesTotalStaked, StakerVault._poolTotalStaked.
high
RubiconRouter _swap does not pass whole amount to RubiconMarket
high
RubiconRouter.swapEntireBalance() doesn't handle the slippage check properly
medium
Strategists can take more rewards than they should using the function strategistBootyClaim().
medium
maxSellAllAmount and maxBuyAllAmount functions can be unintentionally paused (always revert).