Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Quickstart

Build your first account module in 5 minutes.

1. Define Storage

Every account has isolated storage. Define your state using typed collections:

use evolve_collections::Item;
 
// Single value storage
static VALUE: Item<u128> = Item::new(b"value");

2. Create Your Account

Use the #[account_impl] macro to define your account module:

use evolve_core::prelude::*;
use evolve_macros::account_impl;
use evolve_collections::Item;
 
static VALUE: Item<u128> = Item::new(b"value");
 
#[account_impl(Counter)]
pub mod counter {
    use super::*;
 
    #[init]
    fn initialize(env: &impl Env) -> SdkResult<()> {
        VALUE.set(env, 0)?;
        Ok(())
    }
 
    #[exec]
    fn increment(env: &impl Env) -> SdkResult<()> {
        let current = VALUE.get(env)?.unwrap_or(0);
        VALUE.set(env, current + 1)?;
        Ok(())
    }
 
    #[query]
    fn get_value(env: &impl Env) -> SdkResult<u128> {
        Ok(VALUE.get(env)?.unwrap_or(0))
    }
}

Function Types

MacroPurposeState ChangesReturns
#[init]One-time initializationYesSdkResult<()>
#[exec]State-mutating executionYesSdkResult<T>
#[query]Read-only queriesNoSdkResult<T>

3. Write Tests

Use MockEnv for unit testing:

use evolve_testing::MockEnv;
 
#[test]
fn test_counter() {
    let env = MockEnv::builder()
        .with_caller(AccountId::new(1))
        .build();
 
    counter::initialize(&env).unwrap();
    counter::increment(&env).unwrap();
 
    assert_eq!(counter::get_value(&env).unwrap(), 1);
}

4. Register Your Account

Register your account code in the State Transition Function:

use evolve_stf::StfBuilder;
 
let stf = StfBuilder::new()
    .register_account::<Counter>()
    .build();

5. Run

cargo test
cargo run

Next Steps