Beginner FriendlyGameFi
100 EXP
View results
Submission Details
Impact: low
Likelihood: high
Invalid

Inefficient Resource Address Retrieval in View Function

Description

The get_resource_address() view function recreates the signer from the capability on every call instead of storing the resource address directly in ModuleData. Since the resource account address never changes after initialization, this approach wastes gas unnecessarily.

Root Cause

The function recreates the signer every time to get its address:

#[view]
fun get_resource_address(): address acquires ModuleData {
let module_data = borrow_global<ModuleData>(@pizza_drop);
let resource_signer = account::create_signer_with_capability(&module_data.signer_cap);
signer::address_of(&resource_signer)
}

Impact

  • Unnecessary gas consumption on every view function call

  • Inefficient pattern that could be avoided with simple storage optimization

Recommended Mitigation

Store the resource address directly in ModuleData during initialization:

struct ModuleData has key {
signer_cap: SignerCapability,
+ resource_address: address,
}
fun init_module(pizza_drop: &signer) {
// ...
+ let resource_address = signer::address_of(&resource_signer);
move_to(pizza_drop, ModuleData {
signer_cap,
+ resource_address,
});
}
#[view]
fun get_resource_address(): address acquires ModuleData {
- let module_data = borrow_global<ModuleData>(@pizza_drop);
- let resource_signer = account::create_signer_with_capability(&module_data.signer_cap);
- signer::address_of(&resource_signer)
+ borrow_global<ModuleData>(@pizza_drop).resource_address
}
Updates

Appeal created

bube Lead Judge 11 days ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.