use thruput_rpc_api::{ChunkPosition, ChunkRecord};
use thruput_xdr::types::BlockHeight;
use xdrs::VecM;
use crate::{
Delta, KeyChangeBatch, KeyChangeChunk, NativeTokensTransferredChunk,
};
impl ChunkRecord for NativeTokensTransferredChunk {
type Key = BlockHeight;
type Part = VecM<Delta>;
fn into_chunk(self) -> (BlockHeight, ChunkPosition, VecM<Delta>) {
(
self.block,
ChunkPosition::new(self.chunk_index, self.chunk_count),
self.deltas,
)
}
}
impl ChunkRecord for KeyChangeChunk {
type Key = BlockHeight;
type Part = KeyChangeBatch;
fn into_chunk(self) -> (BlockHeight, ChunkPosition, KeyChangeBatch) {
(
self.height,
ChunkPosition::new(self.chunk_index, self.chunk_count),
self.changes,
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::KeyChange;
use thruput_xdr::types::{ContractAddress, int128_xdr};
fn delta(lowbits: u64) -> Delta {
Delta {
address: ContractAddress::default(),
native_token_delta: int128_xdr {
highbits: 0,
lowbits,
},
}
}
#[test]
fn a_transfer_chunk_comes_apart_into_block_position_and_deltas() {
let chunk = NativeTokensTransferredChunk {
block: BlockHeight::new(42),
chunk_index: 1,
chunk_count: 3,
deltas: VecM(vec![delta(1), delta(2)]),
};
let bytes = xdrs::txs::encode(&chunk).expect("encodes");
let decoded: NativeTokensTransferredChunk =
xdrs::txs::decode(&bytes).expect("decodes");
let (block, position, deltas) = decoded.into_chunk();
assert_eq!(block, BlockHeight::new(42));
assert_eq!(position, ChunkPosition::new(1, 3));
assert_eq!(deltas, VecM(vec![delta(1), delta(2)]));
}
#[test]
fn a_key_change_chunk_comes_apart_into_height_position_and_changes() {
let change = KeyChange {
address: ContractAddress::default(),
auth_data: None,
};
let chunk = KeyChangeChunk {
height: BlockHeight::new(5),
chunk_index: 0,
chunk_count: 1,
changes: VecM(vec![change.clone()]),
};
let (height, position, changes) = chunk.into_chunk();
assert_eq!(height, BlockHeight::new(5));
assert_eq!(position, ChunkPosition::new(0, 1));
assert_eq!(changes, VecM(vec![change]));
}
}