Skip to main content

ExampleContract

Struct ExampleContract 

Source
pub struct ExampleContract;
Expand description

Neo N3 Contract Examples

Basic Hello-World pattern showing how to expose a method that simply returns contract state:

use neo_devpack::prelude::*;

#[neo_contract]
pub struct HelloWorld {
    greeting: NeoString,
}

impl HelloWorld {
    #[neo_method]
    pub fn say_hello(&self) -> NeoResult<NeoString> {
        Ok(self.greeting.clone())
    }
}

A more complete storage-backed counter that demonstrates manifest overlays, permissions, witnesses and event emission:

use neo_devpack::prelude::*;

#[neo_event]
pub struct CounterIncreased {
    pub account: NeoByteString,
    pub new_value: NeoInteger,
}

neo_manifest_overlay!(r#"{
    "name": "FamousCounter",
    "features": { "storage": true }
}"#);
neo_permission!("*", ["balanceOf"]);
neo_supported_standards!(["NEP-17"]);

#[neo_contract]
pub struct FamousCounter;

impl FamousCounter {
    #[neo_method]
    pub fn increment(&self, caller: NeoByteString) -> NeoResult<NeoInteger> {
        if !NeoRuntime::check_witness(&caller)?.as_bool() {
            return Err(NeoError::InvalidOperation);
        }

        let context = NeoStorage::get_context()?;
        let counter_key = NeoByteString::from_slice(b"counter");
        NeoStorage::put(&context, &counter_key, &NeoByteString::from_slice(b"1"))?;

        CounterIncreased {
            account: caller.clone(),
            new_value: NeoInteger::new(1),
        }
        .emit()?;

        Ok(NeoInteger::new(1))
    }
}

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.