(fix): new_keystore returns uuid as well (#559)
* (fix): new_keystore returns uuid as well * (chore): add changelog for the changes * (chore): revert fmt change pushed accidentally * (chore): remove 2nd fmt change pushed accidentally
This commit is contained in:
parent
6bf45a0b5d
commit
6cd5625787
|
@ -14,6 +14,7 @@
|
||||||
- `abigen!` now supports multiple contracts [#498](https://github.com/gakonst/ethers-rs/pull/498)
|
- `abigen!` now supports multiple contracts [#498](https://github.com/gakonst/ethers-rs/pull/498)
|
||||||
- Use rust types as contract function inputs for human readable abi [#482](https://github.com/gakonst/ethers-rs/pull/482)
|
- Use rust types as contract function inputs for human readable abi [#482](https://github.com/gakonst/ethers-rs/pull/482)
|
||||||
- Add EIP-712 `sign_typed_data` signer method; add ethers-core type `Eip712` trait and derive macro in ethers-derive-eip712 [#481](https://github.com/gakonst/ethers-rs/pull/481)
|
- Add EIP-712 `sign_typed_data` signer method; add ethers-core type `Eip712` trait and derive macro in ethers-derive-eip712 [#481](https://github.com/gakonst/ethers-rs/pull/481)
|
||||||
|
- `LocalWallet::new_keystore` now returns a tuple `(LocalWallet, String)` instead of `LocalWallet`, where the string represents the UUID of the newly created encrypted JSON keystore. The JSON keystore is stored as a file `/dir/uuid`. The issue [#557](https://github.com/gakonst/ethers-rs/issues/557) is addressed [#559](https://github.com/gakonst/ethers-rs/pull/559)
|
||||||
|
|
||||||
### 0.5.3
|
### 0.5.3
|
||||||
|
|
||||||
|
|
|
@ -61,18 +61,23 @@ impl Clone for Wallet<SigningKey> {
|
||||||
|
|
||||||
impl Wallet<SigningKey> {
|
impl Wallet<SigningKey> {
|
||||||
/// Creates a new random encrypted JSON with the provided password and stores it in the
|
/// Creates a new random encrypted JSON with the provided password and stores it in the
|
||||||
/// provided directory
|
/// provided directory. Returns a tuple (Wallet, String) of the wallet instance for the
|
||||||
|
/// keystore with its random UUID.
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
pub fn new_keystore<P, R, S>(dir: P, rng: &mut R, password: S) -> Result<Self, WalletError>
|
pub fn new_keystore<P, R, S>(
|
||||||
|
dir: P,
|
||||||
|
rng: &mut R,
|
||||||
|
password: S,
|
||||||
|
) -> Result<(Self, String), WalletError>
|
||||||
where
|
where
|
||||||
P: AsRef<Path>,
|
P: AsRef<Path>,
|
||||||
R: Rng + CryptoRng + rand_core::CryptoRng,
|
R: Rng + CryptoRng + rand_core::CryptoRng,
|
||||||
S: AsRef<[u8]>,
|
S: AsRef<[u8]>,
|
||||||
{
|
{
|
||||||
let (secret, _) = eth_keystore::new(dir, rng, password)?;
|
let (secret, uuid) = eth_keystore::new(dir, rng, password)?;
|
||||||
let signer = SigningKey::from_bytes(secret.as_slice())?;
|
let signer = SigningKey::from_bytes(secret.as_slice())?;
|
||||||
let address = secret_key_to_address(&signer);
|
let address = secret_key_to_address(&signer);
|
||||||
Ok(Self { signer, address, chain_id: 1 })
|
Ok((Self { signer, address, chain_id: 1 }, uuid))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decrypts an encrypted JSON from the provided path to construct a Wallet instance
|
/// Decrypts an encrypted JSON from the provided path to construct a Wallet instance
|
||||||
|
@ -140,7 +145,6 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::Signer;
|
use crate::Signer;
|
||||||
use ethers_core::types::Address;
|
use ethers_core::types::Address;
|
||||||
use std::fs;
|
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
@ -148,7 +152,7 @@ mod tests {
|
||||||
// create and store a random encrypted JSON keystore in this directory
|
// create and store a random encrypted JSON keystore in this directory
|
||||||
let dir = tempdir().unwrap();
|
let dir = tempdir().unwrap();
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let key = Wallet::<SigningKey>::new_keystore(&dir, &mut rng, "randpsswd").unwrap();
|
let (key, uuid) = Wallet::<SigningKey>::new_keystore(&dir, &mut rng, "randpsswd").unwrap();
|
||||||
|
|
||||||
// sign a message using the above key
|
// sign a message using the above key
|
||||||
let message = "Some data";
|
let message = "Some data";
|
||||||
|
@ -156,14 +160,11 @@ mod tests {
|
||||||
|
|
||||||
// read from the encrypted JSON keystore and decrypt it, while validating that the
|
// read from the encrypted JSON keystore and decrypt it, while validating that the
|
||||||
// signatures produced by both the keys should match
|
// signatures produced by both the keys should match
|
||||||
let paths = fs::read_dir(dir).unwrap();
|
let path = Path::new(dir.path()).join(uuid);
|
||||||
for path in paths {
|
let key2 = Wallet::<SigningKey>::decrypt_keystore(&path.clone(), "randpsswd").unwrap();
|
||||||
let path = path.unwrap().path();
|
let signature2 = key2.sign_message(message).await.unwrap();
|
||||||
let key2 = Wallet::<SigningKey>::decrypt_keystore(&path.clone(), "randpsswd").unwrap();
|
assert_eq!(signature, signature2);
|
||||||
let signature2 = key2.sign_message(message).await.unwrap();
|
assert!(std::fs::remove_file(&path).is_ok());
|
||||||
assert_eq!(signature, signature2);
|
|
||||||
assert!(std::fs::remove_file(&path).is_ok());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|
Loading…
Reference in New Issue