mirror of
https://github.com/serai-dex/serai.git
synced 2024-12-23 12:09:37 +00:00
7122e0faf4
Event retrieval was prior: - Retrieve all events in the block, which may be hundreds of KB - Filter to just a few Since it's frequent to want multiple sets of events, each filtered in their own way, this caused the retrieval to happen multiple times. Now, it only will happen once. Also has the scoped clients take a reference, not an owned TemporalSerai.
105 lines
2.9 KiB
Rust
105 lines
2.9 KiB
Rust
use rand_core::{RngCore, OsRng};
|
|
|
|
use blake2::{
|
|
digest::{consts::U32, Digest},
|
|
Blake2b,
|
|
};
|
|
|
|
use scale::Encode;
|
|
|
|
use serai_abi::coins::primitives::OutInstructionWithBalance;
|
|
use sp_core::Pair;
|
|
|
|
use serai_client::{
|
|
primitives::{
|
|
Amount, NetworkId, Coin, Balance, BlockHash, SeraiAddress, Data, ExternalAddress,
|
|
insecure_pair_from_name,
|
|
},
|
|
in_instructions::{
|
|
InInstructionsEvent,
|
|
primitives::{InInstruction, InInstructionWithBalance, Batch},
|
|
},
|
|
coins::{primitives::OutInstruction, CoinsEvent},
|
|
Serai, SeraiCoins,
|
|
};
|
|
|
|
mod common;
|
|
use common::{tx::publish_tx, in_instructions::provide_batch};
|
|
|
|
serai_test!(
|
|
burn: (|serai: Serai| async move {
|
|
let network = NetworkId::Bitcoin;
|
|
let id = 0;
|
|
|
|
let mut block_hash = BlockHash([0; 32]);
|
|
OsRng.fill_bytes(&mut block_hash.0);
|
|
|
|
let pair = insecure_pair_from_name("Dave");
|
|
let public = pair.public();
|
|
let address = SeraiAddress::from(public);
|
|
|
|
let coin = Coin::Bitcoin;
|
|
let amount = Amount(OsRng.next_u64().saturating_add(1));
|
|
let balance = Balance { coin, amount };
|
|
|
|
let batch = Batch {
|
|
network,
|
|
id,
|
|
block: block_hash,
|
|
instructions: vec![InInstructionWithBalance {
|
|
instruction: InInstruction::Transfer(address),
|
|
balance,
|
|
}],
|
|
};
|
|
|
|
let block = provide_batch(&serai, batch.clone()).await;
|
|
|
|
let instruction = {
|
|
let serai = serai.as_of(block);
|
|
let batches = serai.in_instructions().batch_events().await.unwrap();
|
|
assert_eq!(
|
|
batches,
|
|
vec![InInstructionsEvent::Batch {
|
|
network,
|
|
id,
|
|
block: block_hash,
|
|
instructions_hash: Blake2b::<U32>::digest(batch.instructions.encode()).into(),
|
|
}]
|
|
);
|
|
|
|
assert_eq!(
|
|
serai.coins().mint_events().await.unwrap(),
|
|
vec![CoinsEvent::Mint { to: address, balance }]
|
|
);
|
|
assert_eq!(serai.coins().coin_supply(coin).await.unwrap(), amount);
|
|
assert_eq!(serai.coins().coin_balance(coin, address).await.unwrap(), amount);
|
|
|
|
// Now burn it
|
|
let mut rand_bytes = vec![0; 32];
|
|
OsRng.fill_bytes(&mut rand_bytes);
|
|
let external_address = ExternalAddress::new(rand_bytes).unwrap();
|
|
|
|
let mut rand_bytes = vec![0; 32];
|
|
OsRng.fill_bytes(&mut rand_bytes);
|
|
let data = Data::new(rand_bytes).unwrap();
|
|
|
|
OutInstructionWithBalance {
|
|
balance,
|
|
instruction: OutInstruction { address: external_address, data: Some(data) },
|
|
}
|
|
};
|
|
|
|
let block = publish_tx(
|
|
&serai,
|
|
&serai.sign(&pair, SeraiCoins::burn_with_instruction(instruction.clone()), 0, 0),
|
|
)
|
|
.await;
|
|
|
|
let serai = serai.as_of(block);
|
|
let serai = serai.coins();
|
|
let events = serai.burn_with_instruction_events().await.unwrap();
|
|
assert_eq!(events, vec![CoinsEvent::BurnWithInstruction { from: address, instruction }]);
|
|
assert_eq!(serai.coin_supply(coin).await.unwrap(), Amount(0));
|
|
assert_eq!(serai.coin_balance(coin, address).await.unwrap(), Amount(0));
|
|
})
|
|
);
|