Platform: Code4rena
Start Date: 13/11/2023
Pot Size: $24,500 USDC
Total HM: 3
Participants: 120
Period: 4 days
Judge: 0xTheC0der
Id: 306
League: ETH
Rank: 103/120
Findings: 1
Award: $1.37
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: rvierdiiev
Also found by: 0x175, 0x3b, 0xMango, 0xarno, 0xpiken, Bauchibred, DarkTower, ElCid, Giorgio, HChang26, Kose, KupiaSec, Madalad, PENGUN, Pheonix, RaoulSchaffranek, SpicyMeatball, T1MOH, Tricko, Udsen, Yanchuan, aslanbek, ast3ros, bart1e, bin2chen, chaduke, d3e4, deepkin, developerjordy, glcanvas, inzinko, jasonxiale, jnforja, mahyar, max10afternoon, mojito_auditor, neocrao, nmirchev8, openwide, osmanozdemir1, peanuts, pep7siup, peritoflores, pontifex, rice_cooker, rouhsamad, t0x1c, tnquanghuy0512, turvy_fuzz, twcctop, ustas, vangrim, zhaojie, zhaojohnson
1.3743 USDC - $1.37
https://github.com/code-423n4/2023-11-canto/blob/335930cd53cf9a137504a57f1215be52c6d67cb3/1155tech-contracts/src/Market.sol#L150 https://github.com/code-423n4/2023-11-canto/blob/335930cd53cf9a137504a57f1215be52c6d67cb3/1155tech-contracts/src/Market.sol#L174
The Market.sol
contract, which utilizes a linear bonding curve for pricing shares, is vulnerable to sandwich attacks. The susceptibility arises from the dynamic pricing model (linear bonding curve), where share prices increase with each purchase and decrease with each sale in real-time.
amountA
) by calling the buy()
function. The expected price for these shares is calculated using the getPriceAndFee
function, starting from the current tokenCount
(say N
).amountB
shares with a higher gas fee to ensure it's processed first.getPriceAndFee
function calculates the price starting from tokenCount
N
. The loop in getPriceAndFee
iterates from N
to N + amountB
, incrementally increasing the price for each additional share.tokenCount
is incremented by amountB
. Now, when A's transaction is processed, the starting point for the getPriceAndFee
calculation has shifted to N + amountB
.tokenCount
, resulting in a higher total price than anticipated. The loop in getPriceAndFee
iterates from N + amountB
to N + amountB + amountA
, further increasing the price for each of A's shares.sell()
transaction to sell their amountB
shares.tokenCount
is now higher due to A's purchase, the price at which B sells their shares could be inflated, allowing B to realize a profit.tokenCount
.There are many ways to deal with frontrunning schemes, but here are two recommendations:
The above does not prevent a scheme where the attacker uses multiple addresses, whereas the other recommendation to implement is:
MEV
#0 - c4-pre-sort
2023-11-18T10:00:34Z
minhquanym marked the issue as duplicate of #12
#1 - c4-judge
2023-11-28T23:14:14Z
MarioPoneder changed the severity to 2 (Med Risk)
#2 - c4-judge
2023-11-28T23:29:03Z
MarioPoneder marked the issue as satisfactory