o2_tools/
parallel_nonce.rs1use crate::trade_account_deploy::{
2 ParallelNonceUsedEvent,
3 Secp256k1,
4 Signature,
5};
6use fuels::{
7 accounts::{
8 signers::private_key::PrivateKeySigner,
9 wallet::Unlocked,
10 },
11 core::{
12 codec::*,
13 traits::Tokenizable,
14 },
15 crypto::{
16 Message,
17 Signature as FuelSignature,
18 },
19 prelude::*,
20 programs::responses::CallResponse,
21 types::U256,
22};
23use sha2::{
24 Digest,
25 Sha256,
26};
27
28pub fn generate_parallel_session_digest<T>(nonce: U256, args: T) -> [u8; 32]
29where
30 T: Tokenizable,
31{
32 let bytes = calldata!((nonce, args)).unwrap();
33 Sha256::digest(&bytes).into()
34}
35
36pub fn generate_parallel_session_signing_payload<T>(nonce: U256, args: T) -> Message
37where
38 T: Tokenizable,
39{
40 Message::from_bytes(generate_parallel_session_digest(nonce, args))
41}
42
43pub async fn create_parallel_signature_args<T>(
44 wallet: &Wallet<Unlocked<PrivateKeySigner>>,
45 nonce: U256,
46 args: T,
47) -> Signature
48where
49 T: Tokenizable,
50{
51 let fuel_signature = create_parallel_fuel_signature(wallet, nonce, args).await;
52 Signature::Secp256k1(Secp256k1 {
53 bits: *fuel_signature,
54 })
55}
56
57pub async fn create_parallel_fuel_signature<T>(
58 wallet: &Wallet<Unlocked<PrivateKeySigner>>,
59 nonce: U256,
60 args: T,
61) -> FuelSignature
62where
63 T: Tokenizable,
64{
65 let message = generate_parallel_session_signing_payload(nonce, args);
66 wallet.signer().sign(message).await.unwrap()
67}
68
69pub fn build_parallel_nonce(
70 nonce_session_id: u8,
71 timestamp: u64,
72 word_position: u128,
73 bitmap_position: u8,
74) -> U256 {
75 U256::from(bitmap_position)
76 | (U256::from(word_position) << 8)
77 | (U256::from(timestamp) << 136)
78 | (U256::from(nonce_session_id) << 168)
79}
80
81pub fn assert_parallel_nonce_used_event<T>(
82 tx_result: &CallResponse<T>,
83 expected_nonce: U256,
84) {
85 let logs = tx_result
86 .decode_logs_with_type::<ParallelNonceUsedEvent>()
87 .unwrap();
88 let result_event: &ParallelNonceUsedEvent = logs.first().unwrap();
89
90 assert_eq!(expected_nonce, result_event.nonce);
91}