Banner
https://sherlock-files.ams3.digitaloceanspaces.com/twitter_images/95219cd6-2e84-44e0-a820-0cb9dcd9e9e2.jpg

hansfriese

Security Researcher

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

Contact Me

High

64

Total

Medium

2

Solo

119

Total

$202.63K

Total Earnings

#47 All Time

87x

Payouts

gold

7x

1st Places

silver

5x

2nd Places

bronze

4x

3rd Places

All

Sherlock

Code4rena

Apr '23

Notional Update #3

Notional Update #3

2,572.61 USDC • Sherlock • hansfriese

bronze

Findings not publicly available for private contests.

Feb '23

Syndr

Syndr

1,564.56 USDC • Sherlock • hansfriese

#5

Findings not publicly available for private contests.

OlympusDAO

OlympusDAO

450.72 USDC • 3 total findings • Sherlock • hansfriese

#16

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`.

Ethos Reserve contest

Ethos Reserve contest

13,062.09 USDC • 4 total findings • Code4rena • hansfriese

gold

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.

Volta

Volta

1,662.01 USDC • Sherlock • hansfriese

bronze

Findings not publicly available for private contests.

Jan '23

Popcorn contest

Popcorn contest

3,503.37 USDC • 11 total findings • Code4rena • hansfriese

#4

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

Numoen contest

Numoen contest

25,278.25 USDC • 3 total findings • Code4rena • hansfriese

gold

high

Precision loss in the invariant function can lead to loss of funds

medium

Wrong init code hash

medium

First liquidity provider will suffer from revert or fund loss

RabbitHole Quest Protocol contest

RabbitHole Quest Protocol contest

1,360.43 USDC • Code4rena • hansfriese

#4

Drips Protocol contest

Drips Protocol contest

122.82 USDC • Code4rena • hansfriese

#12

Timeswap contest

Timeswap contest

21,290 USDC • 3 total findings • Code4rena • hansfriese

gold

high

TimeswapV2LiquidityToken should not use totalSupply()+1 as tokenId

high

Rebalance logic is wrong and this distorts the pool's important states

medium

Burning a `ERC1155Enumerable` token doesn't remove it from the enumeration

Cooler

Cooler

442.13 USDC • 4 total findings • Sherlock • hansfriese

#5

high

Lenders can default the loan by reverting the `repay()` function.

high

Borrowers can abuse lenders and steal debt tokens.

medium

`Cooler.roll()` wouldn't work as expected when `newCollateral = 0`.

medium

`Cooler.clear()` should set `rollable = false` when it adds the loans.

Ondo Finance contest

Ondo Finance contest

7,517.41 USDC • 1 total finding • Code4rena • hansfriese

silver

medium

Admin should be able to refund or redeem the sanctioned users

Biconomy - Smart Contract Wallet contest

Biconomy - Smart Contract Wallet contest

78.26 USDC • 1 total finding • Code4rena • hansfriese

#49

medium

methods used by EntryPoint has `onlyOwner` modifier

UXD Protocol

UXD Protocol

2,230.24 USDC • 2 total findings • Sherlock • hansfriese

#5

medium

`PerpDepository._rebalanceNegativePnlWithSwap()` shouldn't use a `sqrtPriceLimitX96` twice.

medium

`rebalanceLite` should provide a slippage protection

Dec '22

Papr contest

Papr contest

3,832.46 USDC • 2 total findings • Code4rena • hansfriese

bronze

medium

Last collateral check is not safe

medium

user fund loss because function purchaseLiquidationAuctionNFT() take extra liquidation penalty when user's last collateral is liquidated, (set wrong value for maxDebtCached when isLastCollateral is true)

GoGoPool contest

GoGoPool contest

3,053.2 USDC • Code4rena • hansfriese

#4

Forgeries contest

Forgeries contest

572.54 USDC • 2 total findings • Code4rena • hansfriese

#7

high

Admin does not have to wait to call `lastResortTimelockOwnerClaimNFT()`

medium

Raffle creator can rug participants

Caviar contest

Caviar contest

440.87 USDC • 4 total findings • Code4rena • hansfriese

#18

high

Liquidity providers may lose funds when adding liquidity

high

First depositor can break minting of shares

medium

Rounding error in buyQuote might result in free tokens

medium

Pair price may be manipulated by direct transfers

Tigris Trade contest

Tigris Trade contest

4,709.84 USDC • 6 total findings • Code4rena • hansfriese

#4

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()`

prePO contest

prePO contest

953.2 USDC • 3 total findings • Code4rena • hansfriese

#9

high

A whale user is able to cause freeze of funds of other users by bypassing withdraw limit

medium

`PrePOMarket.setFinalLongPayout()` shouldn't be called twice.

medium

Manager can get around min reserves check, draining all funds from Collateral.sol

Escher contest

Escher contest

1,765.14 USDC • 8 total findings • Code4rena • hansfriese

#6

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

Lyra

Lyra

868.23 USDC • Sherlock • hansfriese

#6

Findings not publicly available for private contests.

Maverick contest

Maverick contest

17,868.05 USDC • Code4rena • hansfriese

gold
NounsDAO

NounsDAO

464.15 USDC • 2 total findings • Sherlock • hansfriese

#4

medium

rescueERC20() is not safe for tokens with multiple addresses

medium

Anyone can fabricate the stream history

Nov '22

ParaSpace contest

ParaSpace contest

54.08 USDC • Code4rena • hansfriese

#52

Opyn Crab Netting

Opyn Crab Netting

44.82 USDC • 1 total finding • Sherlock • hansfriese

#21

high

A malicious user can cancel other's orders using `CrabNetting.checkOrder()`.

Isomorph

Isomorph

1,636.21 USDC • 4 total findings • Sherlock • hansfriese

#6

medium

Wrong constants for time delay

medium

The protocol shouldn't charge interests when paused

medium

Lyra vault underestimates the collateral value

medium

The virtual price of collateral is less than it should be.

Redacted Cartel contest

Redacted Cartel contest

207.69 USDC • 2 total findings • Code4rena • hansfriese

#26

medium

Deposit Feature Of The Vault Will Break If Update To A New Platform

medium

Anyone can call AutoPxGmx.compound and perform sandwich attacks with control parameters

Buffer Finance

Buffer Finance

1,013.05 USDC • 2 total findings • Sherlock • hansfriese

#6

high

Keepers can modify option exercise result using different asset price

medium

`tokenX.transfer` will not work as intended from some ERC20 tokens.

Bull v Bear

Bull v Bear

472.32 USDC • 4 total findings • Sherlock • hansfriese

#7

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.

FrankenDAO

FrankenDAO

2,575.24 USDC • 6 total findings • Sherlock • hansfriese

silver

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.

Bond Protocol

Bond Protocol

802.13 USDC • 1 total finding • Sherlock • hansfriese

#6

medium

Circuit breaker could cancel the last transaction to prevent an unnecessary loss

SIZE contest

SIZE contest

12,443.79 USDC • 6 total findings • Code4rena • hansfriese

gold

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

Debt DAO contest

Debt DAO contest

3,471.29 USDC • 5 total findings • Code4rena • hansfriese

#7

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

Paladin - Warden Pledges contest

Paladin - Warden Pledges contest

257.44 USDC • 2 total findings • Code4rena • hansfriese

#19

medium

Pausing `WardenPledge` contract, which takes effect immediately, by its owner can unexpectedly block pledge creator from calling `closePledge` or `retrievePledgeRewards` function

medium

Owner can transfer all ERC20 reward token out using function recoverERC20

Inverse Finance contest

Inverse Finance contest

3,434.96 USDC • 2 total findings • Code4rena • hansfriese

#6

medium

Liquidation should make a borrower _healthier_

medium

Chainlink oracle data feed is not sufficiently validated and can return stale `price`

Illuminate

Illuminate

344.33 USDC • 3 total findings • Sherlock • hansfriese

#18

high

`ERC5095.withdraw()` and `ERC5095.redeem()` don't transfer the principal token to the contract when they work before maturity.

medium

`ERC5095.mint()` uses the wrong slippage limit.

medium

Can not change the fee of the Redeemer

Astaria

Astaria

866.55 USDC • 9 total findings • Sherlock • hansfriese

#10

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.

Holograph contest

Holograph contest

0 USDC • Code4rena • hansfriese

#43

3xcalibur contest

3xcalibur contest

555.44 USDC • Code4rena • hansfriese

#14

Juicebox contest

Juicebox contest

342 USDC • Code4rena • hansfriese

#15

Mover

Mover

2,594.88 USDC • 1 total finding • Sherlock • hansfriese

silver

high

Users might steal the remaining fees inside the `ExchangeProxy` contract after `cardTopupToken` is changed.

Union Finance

Union Finance

684.00 USDC • 2 total findings • Sherlock • hansfriese

#13

medium

`AssetManager.removeAdapter()` doesn't update `withdrawSeq` after removing an adapter.

medium

`AssetManager.rebalance()` will revert when the balance of `tokenAddress` in the money market is 0.

Trader Joe v2 contest

Trader Joe v2 contest

2,157.04 USDC • 2 total findings • Code4rena • hansfriese

#10

high

Transfering funds to yourself increases your balance

medium

Very critical `Owner` privileges can cause complete destruction of the project in a possible privateKey exploit

Blur Exchange contest

Blur Exchange contest

114.82 USDC • 1 total finding • Code4rena • hansfriese

#20

high

StandardPolicyERC1155.sol returns amount == 1 instead of amount == order.amount

Mycelium

Mycelium

1,345.87 USDC • 4 total findings • Sherlock • hansfriese

silver

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

Knox Finance

Knox Finance

6,578.08 USDC • 4 total findings • Sherlock • hansfriese

bronze

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.

Frax Ether Liquid Staking contest

Frax Ether Liquid Staking contest

12.49 USDC • 1 total finding • Code4rena • hansfriese

#78

medium

frxETHMinter: Non-conforming ERC20 tokens not recoverable

VTVL contest

VTVL contest

636.42 USDC • 2 total findings • Code4rena • hansfriese

#10

high

Permanent freeze of vested tokens due to overflow in _baseVestedAmount

medium

Reentrancy may allow an admin to steal funds

Art Gobblers contest

Art Gobblers contest

2,383.77 USDC • 2 total findings • Code4rena • hansfriese

#10

high

Can Recover Gobblers Burnt In Legendary Mint

medium

The reveal process could brick if `randProvider` stops working

Harpie

Harpie

23.74 USDC • 1 total finding • Sherlock • hansfriese

#20

medium

Funds might be locked inside the `Vault` for the fee-on-transfer tokens.

PartyDAO contest

PartyDAO contest

83.56 USDC • Code4rena • hansfriese

#51

Notional

Notional

2,972.23 USDC • 1 total finding • Sherlock • hansfriese

#6

high

`TradingUtils._executeTrade()` doesn't check `preTradeBalance` properly.

FEI and TRIBE Redemption contest

FEI and TRIBE Redemption contest

81.81 USDC • Code4rena • hansfriese

#6

Canto Dex Oracle contest

Canto Dex Oracle contest

146.62 CANTO • Code4rena • hansfriese

#10

Nouns Builder contest

Nouns Builder contest

162.01 USDC • 3 total findings • Code4rena • hansfriese

#62

medium

Founders can receive less tokens that expected

medium

`Token:mint`: infinite loop if the founders' shares sum up to 100

medium

Index out of bounds error when properties length is more than attributes length breaks minting

Aug '22

Sentiment

Sentiment

219.53 USDC • 1 total finding • Sherlock • hansfriese

#22

medium

`Account` contract might be locked when `underlying` = address(0).

Olympus DAO contest

Olympus DAO contest

1,193.84 USDC • 2 total findings • Code4rena • hansfriese

#17

high

In `Governance.sol`, it might be impossible to activate a new proposal forever after failed to execute the previous active proposal.

medium

Inconsistant parameter requirements between `constructor()` and `Set() functions` in `RANGE.sol` and `Operator.sol`.

Rigor Protocol contest

Rigor Protocol contest

5,180.34 USDC • 10 total findings • Code4rena • hansfriese

gold

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

Axelar Network v2 contest

Axelar Network v2 contest

58.72 USDC • Code4rena • hansfriese

#38

Golom contest

Golom contest

259.38 USDC • Code4rena • hansfriese

#45

Yield Witch v2 contest

Yield Witch v2 contest

39.92 USDC • Code4rena • hansfriese

#37

Swivel v3 contest

Swivel v3 contest

2,104.07 USDC • 3 total findings • Code4rena • hansfriese

#8

medium

With most functions in VaultTracker.sol, users can call them only once after maturity has been reached.

medium

Swivel.setFee() is implemented wrongly.

medium

Error in allowance logic

Fractional v2 contest

Fractional v2 contest

4,474.07 USDC • 8 total findings • Code4rena • hansfriese

#5

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.

Juicebox V2 contest

Juicebox V2 contest

18.28 USDC • 2 total findings • Code4rena • hansfriese

#62

high

ORACLE DATA FEED CAN BE OUTDATED YET USED ANYWAYS WHICH WILL IMPACT ON PAYMENT LOGIC

medium

Use a safe transfer helper library for ERC20 transfers

Jun '22

Putty contest

Putty contest

4,724 USDC • 5 total findings • Code4rena • hansfriese

gold

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

Nibbl contest

Nibbl contest

3,019.73 USDC • 2 total findings • Code4rena • hansfriese

silver

medium

Twav._getTwav() will return a wrong result when twavObservations[TWAV_BLOCK_NUMBERS - 1].timestamp = 0.

medium

`Twav.sol#_getTwav()` will revert when timestamp > 4294967296

Yieldy contest

Yieldy contest

552.08 USDC • 3 total findings • Code4rena • hansfriese

#19

medium

No way to set CURVE_POOL approval after setting new curve pool address

medium

Cannot mint to exactly max supply using `_mint` function

medium

`_storeRebase()` is called with the wrong parameters

Illuminate contest

Illuminate contest

490.36 USDC • 5 total findings • Code4rena • hansfriese

#25

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

Nested Finance contest

Nested Finance contest

81.82 USDC • Code4rena • hansfriese

#16

Infinity NFT Marketplace contest

Infinity NFT Marketplace contest

82.8 USDC • Code4rena • hansfriese

#49

Canto contest

Canto contest

3,884.36 USDC • 2 total findings • Code4rena • hansfriese

#8

high

WETH.sol computes the wrong totalSupply()

high

WETH.allowance() returns wrong result.

Connext Amarok contest

Connext Amarok contest

941.66 USDC • 1 total finding • Code4rena • hansfriese

#17

medium

Missing whenNotPaused modifier

Notional x Index Coop

Notional x Index Coop

135.56 USDC • Code4rena • hansfriese

#36

May '22

Backd Tokenomics contest

Backd Tokenomics contest

6,380.59 USDC • 3 total findings • Code4rena • hansfriese

#5

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.

veToken Finance contest

veToken Finance contest

153.16 USDT • Code4rena • hansfriese

#44

Velodrome Finance contest

Velodrome Finance contest

2,239.86 USDC • 2 total findings • Code4rena • hansfriese

#11

high

VotingEscrow's merge and withdraw aren't available for approved users

medium

Alter velo receptions computation

Rubicon contest

Rubicon contest

1,224.54 USDC • 4 total findings • Code4rena • hansfriese

#13

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).

Sturdy contest

Sturdy contest

28.46 USDC • Code4rena • hansfriese

#50

Aura Finance contest

Aura Finance contest

247.07 USDC • Code4rena • hansfriese

#28

Cally contest

Cally contest

84.99 USDC • Code4rena • hansfriese

#53

Enso Finance contest

Enso Finance contest

279.33 USDT • Code4rena • hansfriese

#38

Alchemix contest

Alchemix contest

89.43 DAI • Code4rena • hansfriese

#43

FactoryDAO contest

FactoryDAO contest

116.33 DAI • Code4rena • hansfriese

#42

Cudos contest

Cudos contest

65.9 USDC • Code4rena • hansfriese

#51

Forgotten Runes Warrior Guild contest

Forgotten Runes Warrior Guild contest

45.73 USDC • Code4rena • hansfriese

#53

bunker.finance contest

bunker.finance contest

52.48 USDC • Code4rena • hansfriese

#26