Problem
Public functions that read from persistent storage will panic with a VM trap if invoked before initialize() has been called. There is no is_initialized() guard, so any deploy-without-init race condition produces opaque failures rather than a clear NotInitialized error.
Context
The API frontend retries on transient errors. A panic on uninitialized state looks transient — but it isn't. Wrapping every public read with a typed init check lets the API surface a clear "contract not initialized" message and stop retrying.
Before Starting
Read these context files first:
- context/architecture-context.md
- context/code-standards.md
- context/progress-tracker.md
- contracts/*/src/lib.rs
What To Build
- Add
pub fn is_initialized(env: &Env) -> bool helper in each contract's lib.rs that checks env.storage().instance().has(&StorageKey::Admin).
- At the top of every public function (mutating or read-only) that touches persistent storage, add:
if !Self::is_initialized(&env) { return Err(ContractError::NotInitialized); }.
- Exclude
initialize() itself and any pure helper that doesn't read storage.
- Add
ContractError::NotInitialized = 1 variant in errors.rs if missing.
- Write one regression test per contract that calls a getter before initialize and asserts
NotInitialized.
- Document the convention in
code-standards.md.
Files To Touch
- All 5
contracts/*/src/lib.rs
- All 5
contracts/*/src/errors.rs
- All 5
contracts/*/src/tests.rs
context/code-standards.md
Acceptance Criteria
Mandatory Checks Before PR
Problem
Public functions that read from persistent storage will panic with a VM trap if invoked before
initialize()has been called. There is nois_initialized()guard, so any deploy-without-init race condition produces opaque failures rather than a clearNotInitializederror.Context
The API frontend retries on transient errors. A panic on uninitialized state looks transient — but it isn't. Wrapping every public read with a typed init check lets the API surface a clear "contract not initialized" message and stop retrying.
Before Starting
Read these context files first:
What To Build
pub fn is_initialized(env: &Env) -> boolhelper in each contract'slib.rsthat checksenv.storage().instance().has(&StorageKey::Admin).if !Self::is_initialized(&env) { return Err(ContractError::NotInitialized); }.initialize()itself and any pure helper that doesn't read storage.ContractError::NotInitialized = 1variant inerrors.rsif missing.NotInitialized.code-standards.md.Files To Touch
contracts/*/src/lib.rscontracts/*/src/errors.rscontracts/*/src/tests.rscontext/code-standards.mdAcceptance Criteria
is_initializedcheckContractError::NotInitializedexists in all 5 error enumsMandatory Checks Before PR