use alloy_network::Ethereum;
use alloy_primitives::{Address, Bytes};
use alloy_provider::Provider;
use alloy_rpc_types::TransactionRequest;
use alloy_sol_types::sol;
use tracing::{debug, info};
use MessageTransmitter::MessageTransmitterInstance;
pub struct MessageTransmitterContract<P: Provider<Ethereum>> {
instance: MessageTransmitterInstance<P>,
}
impl<P: Provider<Ethereum>> MessageTransmitterContract<P> {
pub fn new(address: Address, provider: P) -> Self {
debug!(
contract_address = %address,
event = "message_transmitter_contract_initialized"
);
Self {
instance: MessageTransmitterInstance::<P>::new(address, provider),
}
}
pub fn receive_message_transaction(
&self,
message: Bytes,
attestation: Bytes,
from_address: Address,
) -> TransactionRequest {
info!(
message_len = message.len(),
attestation_len = attestation.len(),
from_address = %from_address,
contract_address = %self.instance.address(),
version = "v1",
event = "receive_message_transaction_created"
);
self.instance
.receiveMessage(message, attestation)
.from(from_address)
.into_transaction_request()
}
pub async fn is_nonce_used(&self, nonce_hash: [u8; 32]) -> Result<bool, alloy_contract::Error> {
let nonce_status = self.instance.usedNonces(nonce_hash.into()).call().await?;
debug!(
nonce_hash = ?nonce_hash,
nonce_status = %nonce_status,
is_used = nonce_status == 1,
event = "is_nonce_used_checked"
);
Ok(nonce_status == 1)
}
pub fn address(&self) -> Address {
*self.instance.address()
}
}
sol!(
#[allow(clippy::too_many_arguments)]
#[allow(missing_docs)]
#[sol(rpc)]
MessageTransmitter,
"abis/v1_message_transmitter.json"
);