Have InInstructions track the latest block for a network in storage

This commit is contained in:
Luke Parker 2023-04-16 02:57:19 -04:00
parent 9676584ffe
commit 36cdf6d4bf
No known key found for this signature in database
3 changed files with 24 additions and 3 deletions

View file

@ -4,11 +4,24 @@ use primitives::SignedBatch;
use subxt::utils::Encoded;
use crate::{Serai, SeraiError};
use crate::{
primitives::{BlockHash, NetworkId},
SeraiError, Serai, scale_value,
};
pub type InInstructionsEvent = in_instructions::Event<Runtime>;
const PALLET: &str = "InInstructions";
impl Serai {
pub async fn get_latest_block_for_network(
&self,
hash: [u8; 32],
network: NetworkId,
) -> Result<Option<BlockHash>, SeraiError> {
self.storage(PALLET, "LatestBlock", Some(vec![scale_value(network)]), hash).await
}
pub async fn get_batch_events(
&self,
block: [u8; 32],

View file

@ -41,6 +41,7 @@ serai_test!(
let block = provide_batch(batch).await;
let serai = serai().await;
assert_eq!(serai.get_latest_block_for_network(block, network).await.unwrap(), Some(block_hash));
let batches = serai.get_batch_events(block).await.unwrap();
assert_eq!(batches, vec![InInstructionsEvent::Batch { network, id, block: block_hash }]);

View file

@ -52,11 +52,17 @@ pub mod pallet {
#[pallet::pallet]
pub struct Pallet<T>(PhantomData<T>);
// Latest block number agreed upon for a coin
// The amount of batches a network has issued, which is also the ID to use for the next batch
#[pallet::storage]
#[pallet::getter(fn batch)]
#[pallet::getter(fn batches)]
pub(crate) type Batches<T: Config> = StorageMap<_, Blake2_256, NetworkId, u32, OptionQuery>;
// The latest block a network has acknowledged as finalized
#[pallet::storage]
#[pallet::getter(fn last_block)]
pub(crate) type LatestBlock<T: Config> =
StorageMap<_, Blake2_256, NetworkId, BlockHash, OptionQuery>;
impl<T: Config> Pallet<T> {
fn execute(instruction: InInstructionWithBalance) -> Result<(), ()> {
match instruction.instruction {
@ -77,6 +83,7 @@ pub mod pallet {
let mut batch = batch.batch;
Batches::<T>::insert(batch.network, batch.id);
LatestBlock::<T>::insert(batch.network, batch.block);
Self::deposit_event(Event::Batch {
network: batch.network,
id: batch.id,