1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use ethers::types::transaction::eip712::EIP712Domain;
use ethers::{prelude::k256::ecdsa::SigningKey, signers::Wallet, types::Address};
use rand::SeedableRng;
use std::env;
use std::result::Result;
use std::str::FromStr;

use crate::bindings::{eip712, error::SwitchboardClientError};

pub fn load_env_address(key: &str) -> Result<Address, SwitchboardClientError> {
    Address::from_str(&env::var(key).unwrap())
        .map_err(|_| SwitchboardClientError::EnvVariableMissing(key.to_string()))
}

pub fn generate_signer() -> Wallet<SigningKey> {
    let mut randomness = [0; 32];
    switchboard_common::Gramine::read_rand(&mut randomness).unwrap();
    let mut seeded_rng = rand::rngs::StdRng::from_seed(randomness);
    ethers::signers::Wallet::new(&mut seeded_rng)
}
pub fn sign_typed_data(
    wallet: Wallet<ethers::core::k256::ecdsa::SigningKey>,
    payload: &eip712::Transaction,
    domain: EIP712Domain,
) -> Result<ethers::types::Signature, ethers::signers::WalletError> {
    let encoded = payload
        .encode_eip712(domain)
        .map_err(|e| ethers::signers::WalletError::Eip712Error(e.to_string()))?;

    wallet.sign_hash(ethers::core::types::H256::from(encoded))
}