Skip to main content

o2_tools/
parallel_nonce.rs

1use 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}