use crate::frame::{
balances::{
Balances,
BalancesEventsDecoder,
},
system::{
System,
SystemEventsDecoder,
},
};
use codec::{
Decode,
Encode,
};
use core::marker::PhantomData;
pub type Gas = u64;
#[module]
pub trait Contracts: System + Balances {}
#[derive(Clone, Debug, Eq, PartialEq, Call, Encode)]
pub struct PutCodeCall<'a, T: Contracts> {
pub _runtime: PhantomData<T>,
pub code: &'a [u8],
}
#[derive(Clone, Debug, Eq, PartialEq, Call, Encode)]
pub struct InstantiateCall<'a, T: Contracts> {
#[codec(compact)]
pub endowment: <T as Balances>::Balance,
#[codec(compact)]
pub gas_limit: Gas,
pub code_hash: &'a <T as System>::Hash,
pub data: &'a [u8],
}
#[derive(Clone, Debug, PartialEq, Call, Encode)]
pub struct CallCall<'a, T: Contracts> {
pub dest: &'a <T as System>::Address,
pub value: <T as Balances>::Balance,
#[codec(compact)]
pub gas_limit: Gas,
pub data: &'a [u8],
}
#[derive(Clone, Debug, Eq, PartialEq, Event, Decode)]
pub struct CodeStoredEvent<T: Contracts> {
pub code_hash: T::Hash,
}
#[derive(Clone, Debug, Eq, PartialEq, Event, Decode)]
pub struct InstantiatedEvent<T: Contracts> {
pub caller: <T as System>::AccountId,
pub contract: <T as System>::AccountId,
}
#[cfg(test)]
mod tests {
use super::*;
subxt_test!({
name: test_put_code_and_instantiate,
prelude: {
const CONTRACT: &str = r#"
(module
(func (export "call"))
(func (export "deploy"))
)
"#;
let wasm = wabt::wat2wasm(CONTRACT).expect("invalid wabt");
let code_hash;
},
step: {
call: PutCodeCall {
_runtime: PhantomData,
code: &wasm,
},
event: CodeStoredEvent {
code_hash: {
code_hash = event.code_hash.clone();
event.code_hash.clone()
},
},
},
step: {
call: InstantiateCall {
endowment: 100_000_000_000_000,
gas_limit: 500_000_000,
code_hash: &code_hash,
data: &[],
},
event: InstantiatedEvent {
caller: alice.clone(),
contract: event.contract.clone(),
},
},
});
}