diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a623363..c5a0d996 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -275,6 +275,7 @@ - `eth-keystore-rs` crate updated. Allow an optional name for the to-be-generated keystore file [#910](https://github.com/gakonst/ethers-rs/pull/910) +- [1983](https://github.com/gakonst/ethers-rs/pull/1983) Added a `from_bytes` function for the `Wallet` type. ### 0.6.0 diff --git a/ethers-signers/src/wallet/private_key.rs b/ethers-signers/src/wallet/private_key.rs index cdddf00a..ed10949c 100644 --- a/ethers-signers/src/wallet/private_key.rs +++ b/ethers-signers/src/wallet/private_key.rs @@ -90,6 +90,13 @@ impl Wallet { let address = secret_key_to_address(&signer); Self { signer, address, chain_id: 1 } } + + /// Creates a new Wallet instance from a raw scalar value (big endian). + pub fn from_bytes(bytes: &[u8]) -> Result { + let signer = SigningKey::from_bytes(bytes)?; + let address = secret_key_to_address(&signer); + Ok(Self { signer, address, chain_id: 1 }) + } } impl PartialEq for Wallet { @@ -305,4 +312,17 @@ mod tests { Address::from_str("6813Eb9362372EEF6200f3b1dbC3f819671cBA69").expect("Decoding failed") ); } + + #[test] + fn key_from_bytes() { + let wallet: Wallet = + "0000000000000000000000000000000000000000000000000000000000000001".parse().unwrap(); + + let key_as_bytes = wallet.signer.to_bytes(); + let wallet_from_bytes = Wallet::from_bytes(&key_as_bytes).unwrap(); + + assert_eq!(wallet.address, wallet_from_bytes.address); + assert_eq!(wallet.chain_id, wallet_from_bytes.chain_id); + assert_eq!(wallet.signer, wallet_from_bytes.signer); + } }