Account Changes
Storage is now name-based, not index-based. All storage access code must be updated.
Quick Fix
Replace numeric indices with StorageSlotName:
src/account.rs
// Before
let value = account.storage().get_slot(0)?;
// After
let slot_name = StorageSlotName::new("my_slot")?;
let value = account.storage().get_slot(&slot_name)?;
Named Storage Slots
Replace index-based storage access with StorageSlotName identifiers.
Rust
src/account.rs
- // Before: access by numeric index
- let value = account.storage().get_slot(0)?;
- account.storage_mut().set_slot(0, new_value)?;
+ // After: access by name
+ let slot_name = StorageSlotName::new("my_slot")?;
+ let value = account.storage().get_slot(&slot_name)?;
+ account.storage_mut().set_slot(&slot_name, new_value)?;
MASM Updates
The set_map_item procedure now takes slot IDs and returns only old values:
src/contract.masm
- # Before
- exec.account::set_map_item
- # Returns: [OLD_MAP_ROOT, OLD_VALUE, ...]
+ # After
+ exec.account::set_map_item
+ # Returns: [OLD_VALUE, ...]
The return value change means you may need to update stack manipulation after calling set_map_item.
Keystore Changes
Remove RNG generics from FilesystemKeyStore:
src/client.rs
- use miden_client::keystore::FilesystemKeyStore;
- let keystore = FilesystemKeyStore::<rand::rngs::StdRng>::new(path)?;
+ use miden_client::keystore::FilesystemKeyStore;
+ let keystore = FilesystemKeyStore::new(path)?;
Web Component Compilation
Web component compilation now requires AccountComponentCode from CodeBuilder:
src/component.rs
- // Before
- let component = AccountComponent::compile(source)?;
+ // After
+ use miden_protocol::code::CodeBuilder;
+ let code = CodeBuilder::new()
+ .with_source(source)
+ .build()?;
+ let component = AccountComponent::new(code)?;
Storage Schemas
Replace AccountComponentTemplate with metadata-driven StorageSchema:
src/schema.rs
- use miden_lib::AccountComponentTemplate;
- let template = AccountComponentTemplate::new(slots)?;
+ use miden_standards::StorageSchema;
+ let schema = StorageSchema::builder()
+ .add_slot("balance", StorageSlotType::Value)
+ .add_slot("metadata", StorageSlotType::Map)
+ .build()?;
Procedure Roots
Use AccountProcedureRoot instead of AccountProcedureInfo:
src/procedure.rs
- use miden_objects::accounts::AccountProcedureInfo;
- let info = AccountProcedureInfo::new(digest, storage_offset)?;
+ use miden_protocol::accounts::AccountProcedureRoot;
+ let root = AccountProcedureRoot::new(digest)?;
Migration Steps
- Identify all storage slot access patterns in your code
- Define
StorageSlotNameconstants for each slot - Update storage access to use names instead of indices
- Remove RNG type parameters from keystore initialization
- Update component compilation to use
CodeBuilder - Migrate storage templates to
StorageSchema - Replace
AccountProcedureInfowithAccountProcedureRoot
Common Errors
| Error | Cause | Fix |
|---|---|---|
no method named 'get_slot' taking u32 | API changed to names | Use StorageSlotName |
FilesystemKeyStore expects 0 type parameters | RNG generic removed | Remove type parameter |
AccountComponentTemplate not found | Renamed | Use StorageSchema |