amadeus_runtime/consensus/bic/
contract.rs1use crate::Result;
2use crate::bcat;
3use crate::consensus::consensus_apply::ApplyEnv;
4use crate::consensus::consensus_kv::{kv_get, kv_put};
5
6pub fn validate(wasm: &[u8]) -> Result<()> {
8 if wasm.len() < 8 {
10 return Err("wasm_too_small");
11 }
12 if &wasm[0..4] != b"\x00asm" {
13 return Err("invalid_wasm_magic");
14 }
15 if &wasm[4..8] != b"\x01\x00\x00\x00" {
17 return Err("invalid_wasm_version");
18 }
19 Ok(())
20}
21
22pub fn call_deploy(env: &mut ApplyEnv, args: Vec<Vec<u8>>) -> Result<()> {
23 if args.len() != 1 {
24 return Err("invalid_args");
25 }
26 let wasmbytes = args[0].as_slice();
27
28 validate(wasmbytes)?;
30
31 kv_put(env, &bcat(&[b"account:", env.caller_env.account_caller.as_slice(), b":attribute:bytecode"]), wasmbytes)?;
32 Ok(())
33}
34
35pub fn bytecode(env: &mut ApplyEnv, account: &[u8]) -> Result<Option<Vec<u8>>> {
36 kv_get(env, &bcat(&[b"account:", &account, b":attribute:bytecode"]))
37}
38
39pub fn call(env: &mut ApplyEnv, function: &str, args: &[Vec<u8>]) -> Result<()> {
41 match function {
42 "deploy" => call_deploy(env, args.to_vec()),
43 _ => Err("invalid_function"),
44 }
45}