#47330 [SC-Low] The fee calculation in `settle_market` is unreasonable.
Description
Brief/Intro
Vulnerability Details
fn _settlement_fee_payments(
ref self: ContractState,
account: ContractAddress,
account_state: @AccountState,
pending_token_balance: i128, // usdc
token_balance_address: ContractAddress,
trade_size: i128,
trade_price: i128,
settlement_token_price: NonZero<i128>,
asset: @PerpetualMarketAsset,
) -> i128 {
let fee_account = self.getFeeAccount();
let base_fee = asset
.calculate_fee(
*account_state.asset_data,
trade_size,
trade_price,
false,
account_state.fee_rates,
);
let (fee, referrer, fee_commission) = account_state
.get_trade_fee_and_referral_commission(base_fee);
let balance_after_fee = pending_token_balance - fee;
self
.token
.write_asset_balance(account, token_balance_address, balance_after_fee.into());
let settlement_token_address = self.getSettlementTokenAsset();
let fee_in_settlement_token = div_128(fee, settlement_token_price);
if fee_commission == 0 {
self
.token
.upsert_asset_balance(
fee_account, settlement_token_address, fee_in_settlement_token.into(),
);
} else {
let fee_commission_in_settlement_token = div_128(
fee_commission, settlement_token_price,
);
self
.token
.upsert_asset_balance(
referrer,
settlement_token_address,
fee_commission_in_settlement_token.into(),
);
self
.token
.upsert_asset_balance(
fee_account,
settlement_token_address,
(fee_in_settlement_token - fee_commission_in_settlement_token).into(),
);
}
self.emit(AccountComponent::Event::Fee(Fee { account: account, fee: fee.into() }));
return balance_after_fee;
}Impact Details
References
Proof of Concept
Proof of Concept
Previous#47317 [SC-Low] Transfer function only allows collateral transfers from free balance but can be bypassedNext#47318 [SC-Insight] If the counterparty happens to be their own referrer, the protocol does not take the referral fee into account during the risk check.
Was this helpful?