use crate::{
buffer::Payload,
ids::{ActorId, CodeId, MessageId, prelude::*},
message::{
Dispatch, DispatchKind, GasLimit, Message, Packet, Salt, StoredDispatch, StoredMessage,
Value,
},
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct InitMessage {
id: MessageId,
destination: ActorId,
payload: Payload,
gas_limit: Option<GasLimit>,
value: Value,
}
impl InitMessage {
pub fn from_packet(id: MessageId, packet: InitPacket) -> Self {
Self {
id,
destination: packet.program_id,
payload: packet.payload,
gas_limit: packet.gas_limit,
value: packet.value,
}
}
pub fn into_message(self, source: ActorId) -> Message {
Message::new(
self.id,
source,
self.destination,
self.payload,
self.gas_limit,
self.value,
None,
)
}
pub fn into_stored(self, source: ActorId) -> StoredMessage {
self.into_message(source).into_stored()
}
pub fn into_dispatch(self, source: ActorId) -> Dispatch {
Dispatch::new(DispatchKind::Init, self.into_message(source))
}
pub fn into_stored_dispatch(self, source: ActorId) -> StoredDispatch {
self.into_dispatch(source).into_stored()
}
pub fn id(&self) -> MessageId {
self.id
}
pub fn destination(&self) -> ActorId {
self.destination
}
pub fn payload_bytes(&self) -> &[u8] {
&self.payload
}
pub fn gas_limit(&self) -> Option<GasLimit> {
self.gas_limit
}
pub fn value(&self) -> Value {
self.value
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(any(feature = "mock", test), derive(Default))]
pub struct InitPacket {
program_id: ActorId,
code_id: CodeId,
salt: Salt,
payload: Payload,
gas_limit: Option<GasLimit>,
value: Value,
}
impl InitPacket {
pub fn new_from_user(
code_id: CodeId,
salt: Salt,
payload: Payload,
gas_limit: GasLimit,
value: Value,
) -> Self {
Self {
program_id: ActorId::generate_from_user(code_id, &salt),
code_id,
salt,
payload,
gas_limit: Some(gas_limit),
value,
}
}
pub fn new_from_program(
code_id: CodeId,
salt: Salt,
payload: Payload,
message_id: MessageId,
gas_limit: Option<GasLimit>,
value: Value,
) -> Self {
Self {
program_id: ActorId::generate_from_program(message_id, code_id, &salt),
code_id,
salt,
payload,
gas_limit,
value,
}
}
pub fn destination(&self) -> ActorId {
self.program_id
}
pub fn code_id(&self) -> CodeId {
self.code_id
}
pub fn salt(&self) -> &[u8] {
&self.salt
}
}
impl Packet for InitPacket {
fn payload_bytes(&self) -> &[u8] {
&self.payload
}
fn payload_len(&self) -> u32 {
self.payload.len_u32()
}
fn gas_limit(&self) -> Option<GasLimit> {
self.gas_limit
}
fn value(&self) -> Value {
self.value
}
fn kind() -> DispatchKind {
DispatchKind::Init
}
}