1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
use std::vec::Vec; use crate::errors::Result; use crate::types::{CanonicalAddr, HumanAddr}; // Extern holds all external dependencies of the contract, // designed to allow easy dependency injection at runtime #[derive(Clone)] pub struct Extern<S: Storage, A: Api> { pub storage: S, pub api: A, } // ReadonlyStorage is access to the contracts persistent data store //pub trait ReadonlyStorage: Clone { pub trait ReadonlyStorage { fn get(&self, key: &[u8]) -> Option<Vec<u8>>; } // Storage extends ReadonlyStorage to give mutable access pub trait Storage: ReadonlyStorage { fn set(&mut self, key: &[u8], value: &[u8]); } // Api are callbacks to system functions defined outside of the wasm modules. // This is a trait to allow Mocks in the test code. // // Currently it just supports address conversion, we could add eg. crypto functions here. // These should all be pure (stateless) functions. If you need state, you probably want // to use the Querier (TODO) // // We should consider if there is a way for modules to opt-in to only a subset of these // Api for backwards compatibility in systems that don't have them all. pub trait Api: Copy + Clone + Send { fn canonical_address(&self, human: &HumanAddr) -> Result<CanonicalAddr>; fn human_address(&self, canonical: &CanonicalAddr) -> Result<HumanAddr>; }