contract;

// ANCHOR: basic_storage_declaration
storage {
    var1: u64 = 1,
    var2: b256 = b256::zero(),
    var3: Address = Address::zero(),
    var4: Option<u8> = None,
}
// ANCHOR_END: basic_storage_declaration

abi StorageExample {
    #[storage(write)]
    fn store_something();

    #[storage(read)]
    fn get_something();
}

impl StorageExample for Contract {
    #[storage(write)]
    fn store_something() {
        // ANCHOR: basic_storage_write
        storage.var1.write(42);
        storage
            .var2
            .write(0x1111111111111111111111111111111111111111111111111111111111111111);
        storage
            .var3
            .write(Address::from(0x1111111111111111111111111111111111111111111111111111111111111111));
        storage.var4.write(Some(2u8));
        // ANCHOR_END: basic_storage_write
    }
    #[storage(read)]
    fn get_something() {
        // ANCHOR: basic_storage_read
        let var1: u64 = storage.var1.read();
        let var2: b256 = storage.var2.try_read().unwrap_or(b256::zero());
        let var3: Address = storage.var3.try_read().unwrap_or(Address::zero());
        let var4: Option<u8> = storage.var4.try_read().unwrap_or(None);
        // ANCHOR_END: basic_storage_read
    }
}