57425 sc low referral percentage updates are ignored due to append only storage in nftfactory
Description
Issue description
fn _set_referral_percentages(ref self: ContractState, percentages: Span<u16>) {
assert(percentages.len() == 5, super::Errors::WRONG_PERCENTAGES_LEN);
for i in 0..percentages.len() {
self.used_to_percentage.append().write(*percentages.at(i));
};
}
fn getReferralRate(
self: @ContractState,
referral_user: ContractAddress,
referral_code: felt252,
amount: u256,
) -> u256 {
let used = self.used_code.entry(referral_user).entry(referral_code).read();
assert(used > 0, super::Errors::REFFERAL_CODE_NOT_USED_BY_USER);
let rate = amount * self.used_to_percentage.at(used.into()).read().into() / SKALING_FACTOR;
rate
}
fn _set_referral_user(ref self: ContractState, referral_code: felt252, referral_user: ContractAddress) {
// ...
let used_code = self.used_code.entry(referral_user).entry(referral_code).read();
if used_code < 4 {
self.used_code.entry(referral_user).entry(referral_code).write(used_code + 1);
}
// ...
}Impact
Recommended mitigation steps
Proof of Concept
Previous57307 sc low cairo factory referral percentages never updateNext57595 sc low single tier swap path can stall core flows
Was this helpful?