1pub use oasis_contract_sdk_types::{CodeId, InstanceId};
3use oasis_runtime_sdk::{
4 core::common::crypto::hash::Hash,
5 types::{address::Address, token},
6};
7
8use super::{Error, MODULE_NAME};
9
10#[derive(Clone, Copy, Debug, cbor::Encode, cbor::Decode)]
12pub enum Policy {
13 #[cbor(rename = "nobody", as_struct)]
14 Nobody,
15
16 #[cbor(rename = "address")]
17 Address(Address),
18
19 #[cbor(rename = "everyone", as_struct)]
20 Everyone,
21}
22
23impl Policy {
24 pub fn enforce(&self, caller: &Address) -> Result<(), Error> {
26 match self {
27 Policy::Nobody => Err(Error::Forbidden),
29 Policy::Address(address) if address == caller => Ok(()),
31 Policy::Address(_) => Err(Error::Forbidden),
32 Policy::Everyone => Ok(()),
34 }
35 }
36}
37
38#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, cbor::Encode, cbor::Decode)]
40#[repr(u8)]
41pub enum ABI {
42 OasisV1 = 1,
44}
45
46#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
48#[cbor(no_default)]
49pub struct Code {
50 pub id: CodeId,
52
53 pub hash: Hash,
55
56 pub abi: ABI,
58
59 #[cbor(optional)]
61 pub abi_sv: u32,
62
63 pub uploader: Address,
65
66 pub instantiate_policy: Policy,
68}
69
70#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
72#[cbor(no_default)]
73pub struct Instance {
74 pub id: InstanceId,
76
77 pub code_id: CodeId,
79
80 pub creator: Address,
82
83 pub upgrades_policy: Policy,
85}
86
87impl Instance {
88 pub fn address_for(id: InstanceId) -> Address {
90 Address::from_module_raw(MODULE_NAME, &id.as_u64().to_be_bytes())
91 }
92
93 pub fn address(&self) -> Address {
95 Self::address_for(self.id)
96 }
97}
98
99#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
101#[cbor(no_default)]
102pub struct Upload {
103 pub abi: ABI,
105
106 pub instantiate_policy: Policy,
108
109 pub code: Vec<u8>,
111}
112
113#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
115pub struct UploadResult {
116 pub id: CodeId,
118}
119
120#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
122#[cbor(no_default)]
123pub struct Instantiate {
124 pub code_id: CodeId,
126
127 pub upgrades_policy: Policy,
129
130 pub data: Vec<u8>,
132
133 pub tokens: Vec<token::BaseUnits>,
135}
136
137#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
139pub struct InstantiateResult {
140 pub id: InstanceId,
142}
143
144#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
146#[cbor(no_default)]
147pub struct Call {
148 pub id: InstanceId,
150
151 pub data: Vec<u8>,
153
154 pub tokens: Vec<token::BaseUnits>,
156}
157
158#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
160#[cbor(transparent)]
161pub struct CallResult(pub Vec<u8>);
162
163#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
165#[cbor(no_default)]
166pub struct Upgrade {
167 pub id: InstanceId,
169
170 pub code_id: CodeId,
172
173 pub data: Vec<u8>,
175
176 pub tokens: Vec<token::BaseUnits>,
178}
179
180#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
182#[cbor(no_default)]
183pub struct ChangeUpgradePolicy {
184 pub id: InstanceId,
186
187 pub upgrades_policy: Policy,
189}
190
191#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
193#[cbor(no_default)]
194pub struct CodeQuery {
195 pub id: CodeId,
197}
198
199#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
201pub struct CodeStorageQuery {
202 pub id: CodeId,
204}
205
206#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
208pub struct CodeStorageQueryResult {
209 pub code: Vec<u8>,
211}
212
213#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
215pub struct InstanceQuery {
216 pub id: InstanceId,
218}
219
220#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
222pub struct InstanceStorageQuery {
223 pub id: InstanceId,
225
226 pub key: Vec<u8>,
228}
229
230#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
231pub struct InstanceStorageQueryResult {
232 pub value: Option<Vec<u8>>,
234}
235
236#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
238#[repr(u32)]
239pub enum StoreKind {
240 Public = 0,
241 Confidential = 1,
242}
243
244#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
246#[cbor(no_default)]
247pub struct InstanceRawStorageQuery {
248 pub id: InstanceId,
250
251 pub store_kind: StoreKind,
253
254 #[cbor(optional)]
256 pub limit: Option<u64>,
257
258 #[cbor(optional)]
260 pub offset: Option<u64>,
261}
262
263#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
265pub struct InstanceRawStorageQueryResult {
266 pub items: Vec<(Vec<u8>, Vec<u8>)>,
268}
269
270#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
272#[repr(u8)]
273pub enum PublicKeyKind {
274 Transaction = 1,
275}
276
277#[derive(Clone, Debug, cbor::Encode, cbor::Decode)]
279#[cbor(no_default)]
280pub struct PublicKeyQuery {
281 pub id: InstanceId,
283
284 pub kind: PublicKeyKind,
286}
287
288#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
290pub struct PublicKeyQueryResult {
291 pub key: Vec<u8>,
293
294 pub checksum: Vec<u8>,
296
297 pub signature: Vec<u8>,
299}
300
301#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
303pub struct CustomQuery {
304 pub id: InstanceId,
306
307 pub data: Vec<u8>,
309}
310
311#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
313#[cbor(transparent)]
314pub struct CustomQueryResult(pub Vec<u8>);
315
316#[derive(Clone, Debug, Default, cbor::Encode, cbor::Decode)]
318pub struct ContractEvent {
319 pub id: InstanceId,
321 #[cbor(optional)]
323 pub data: Vec<u8>,
324}
325
326#[cfg(test)]
327mod test {
328 use super::*;
329
330 #[test]
331 fn test_instanceid_to_address() {
332 let tcs = vec![
333 (
334 InstanceId::from(0),
335 "oasis1qq08mjlkztsgpgrar082rzzxwjaplxmgjs5ftugn",
336 ),
337 (
338 InstanceId::from(1),
339 "oasis1qpg6jv8mxwlv4z578xyjxl7d793jamltdg9czzkx",
340 ),
341 (
342 InstanceId::from(14324),
343 "oasis1qzasj0kq0hlq6vzw4ajhrwgp3tqx6rnwvg2ylu2v",
344 ),
345 (
346 InstanceId::from(u64::MAX),
347 "oasis1qqr0nxsu5aqpu4k85z4h5z08vrfmawnnqycl6gup",
348 ),
349 ];
350
351 for (id, address) in tcs {
352 let instance_address = Instance::address_for(id);
353 assert_eq!(
354 instance_address.to_bech32(),
355 address.to_string(),
356 "instance address should match"
357 );
358 }
359 }
360}