1use crate::*;
2
3use ethers::types::transaction::eip712::EIP712Domain;
4use ethers::{prelude::k256::ecdsa::SigningKey, signers::Wallet, types::Address};
5use rand::SeedableRng;
6use std::env;
7use std::result::Result;
8use std::str::FromStr;
9
10use crate::bindings::eip712;
11
12pub fn load_env_address(key: &str) -> Result<Address, SbError> {
13 let key = &env::var(key).unwrap_or(String::new());
14 Address::from_str(key).map_err(|_| SbError::EnvVariableMissing(key.to_string()))
15}
16
17pub fn generate_signer() -> Wallet<SigningKey> {
18 let mut randomness = [0; 32];
19 switchboard_common::Gramine::read_rand(&mut randomness).unwrap();
20 let mut seeded_rng = rand::rngs::StdRng::from_seed(randomness);
21 ethers::signers::Wallet::new(&mut seeded_rng)
22}
23pub fn sign_typed_data(
24 wallet: Wallet<ethers::core::k256::ecdsa::SigningKey>,
25 payload: &eip712::Transaction,
26 domain: EIP712Domain,
27) -> Result<ethers::types::Signature, ethers::signers::WalletError> {
28 let encoded = payload
29 .encode_eip712(domain)
30 .map_err(|e| ethers::signers::WalletError::Eip712Error(e.to_string()))?;
31
32 wallet.sign_hash(ethers::core::types::H256::from(encoded))
33}