-
Notifications
You must be signed in to change notification settings - Fork 53
Open
Labels
questionFurther information is requestedFurther information is requested
Description
Summary
AddressStorage does not provide methods for accounts removal
This limits experience of validating PDA create/close flow
Basic Example
#[flow]
fn flow1(&mut self) {
let address = self.new_account();
self.fuzz_accounts.account.insert_with_address(address);
}
#[flow]
fn flow2(&mut self) {
let address_opt = self.fuzz_accounts.account.get(&mut self.trident);
if address_opt.is_none() {
return;
}
let address = address_opt.unwrap();
self.fuzz_accounts.account.remove(address);
self.close_account(address);
}Drawbacks
Vec<Pubkey> is O(n) complexity for element search
Unresolved questions
Let me propose the patch to address_storage.rs file
removefunction implementedinsertfunctions are modified to add address to storage only once
/// Inserts a new address into storage
///
/// Generates a new address (either a PDA or random keypair) and stores it.
/// If PDA seeds are provided, attempts to derive a PDA. If derivation fails
/// or no seeds are provided, generates a random keypair address.
///
/// # Arguments
/// * `trident` - The Trident instance for random number generation
/// * `seeds` - Optional PDA seeds for deriving a program-derived address
///
/// # Returns
/// The newly created and stored address
pub fn insert(&mut self, trident: &mut Trident, seeds: Option<PdaSeeds>) -> Pubkey {
let address = self.get_or_create_address(seeds, trident);
if !self.addresses.iter().any(|x| *x == address) {
self.addresses.push(address);
}
address
}
/// Inserts an existing address into storage
///
/// Stores a pre-existing address without generating a new one.
/// Useful when you need to track addresses created elsewhere.
///
/// # Arguments
/// * `address` - The address to store
pub fn insert_with_address(&mut self, address: Pubkey) {
if !self.addresses.iter().any(|x| *x == address) {
self.addresses.push(address);
}
}
/// Removes an existing address from storage
///
/// Removes specified address from the storage.
/// Useful when you closed account.
///
/// # Arguments
/// * `address` - The address to remove
pub fn remove(&mut self, address: Pubkey) {
if let Some(i) = self.addresses.iter().position(|x| *x == address) {
self.addresses.swap_remove(i);
}
}Implementation PR
No response
Reference Issues
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
questionFurther information is requestedFurther information is requested