Skip to content
This repository was archived by the owner on Sep 12, 2023. It is now read-only.

Commit 84a510c

Browse files
committed
fixup! feat(taker): import seed
1 parent 51eb1c8 commit 84a510c

File tree

6 files changed

+42
-18
lines changed

6 files changed

+42
-18
lines changed

crates/daemon-tests/tests/main/import_seed.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use daemon::bdk::bitcoin;
2+
use daemon::seed;
23
use daemon::seed::RandomSeed;
34
use daemon::seed::Seed;
45
use daemon_tests::open_cfd;
@@ -34,6 +35,7 @@ async fn fail_to_import_seed_with_open_cfds() {
3435
RandomSeed::default().seed(),
3536
data_dir,
3637
bitcoin::Network::Testnet,
38+
seed::TAKER_WALLET_SEED_FILE,
3739
)
3840
.await
3941
.expect_err("import seed should be rejected as open CFDs exist");

crates/daemon/src/lib.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ where
459459
seed: Vec<u8>,
460460
data_dir: PathBuf,
461461
network: Network,
462+
name: &str,
462463
) -> Result<()> {
463464
let open_cfd_ids = self.db.load_open_cfd_ids().await?;
464465

@@ -471,8 +472,9 @@ where
471472
self.wallet_actor
472473
.send(wallet::ImportSeed {
473474
seed,
474-
seed_path: data_dir.join(seed::TAKER_WALLET_SEED_FILE),
475+
path: data_dir,
475476
network,
477+
name: name.to_string(),
476478
})
477479
.await??;
478480

crates/daemon/src/wallet.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::bitcoin::secp256k1::Secp256k1;
22
use crate::seed::RandomSeed;
33
use crate::seed::Seed;
4+
use crate::seed::RANDOM_SEED_SIZE;
45
use crate::wallet::sled::Db;
56
use anyhow::anyhow;
67
use anyhow::bail;
@@ -183,10 +184,10 @@ where
183184
{
184185
pub fn import_seed(&mut self, msg: ImportSeed) -> Result<AddressInfo> {
185186
let seed = msg.seed;
186-
let import_seed: [u8; 256] = seed
187+
let import_seed: [u8; RANDOM_SEED_SIZE] = seed
187188
.clone()
188189
.try_into()
189-
.map_err(|_| anyhow!("seed must be 256 bytes long"))?;
190+
.map_err(|_| anyhow!("seed must be {RANDOM_SEED_SIZE} bytes long"))?;
190191

191192
let import_seed = RandomSeed::from(import_seed);
192193
let ext_priv_key = import_seed.derive_extended_priv_key(msg.network)?;
@@ -197,8 +198,17 @@ where
197198
// recreate and update wallet
198199
self.wallet = Actor::build_wallet(ext_priv_key, db)?;
199200

201+
let name = msg.name;
202+
let wallet_seed = msg.path.join(&name);
203+
204+
let now = Timestamp::now();
205+
let backup_seed = msg.path.join(format!("{name}.{now}.back"));
206+
207+
// copying old seed file to safety.
208+
tokio::fs::copy(&wallet_seed, &backup_seed).await?;
209+
200210
// write imported seed file to disk.
201-
tokio::fs::write(msg.seed_path.as_path(), seed).await?;
211+
tokio::fs::write(wallet_seed.as_path(), seed).await?;
202212

203213
self.wallet
204214
.get_address(AddressIndex::LastUnused)
@@ -410,7 +420,8 @@ pub struct Sign {
410420

411421
pub struct ImportSeed {
412422
pub seed: Vec<u8>,
413-
pub seed_path: PathBuf,
423+
pub path: PathBuf,
424+
pub name: String,
414425
pub network: Network,
415426
}
416427

@@ -540,7 +551,6 @@ fn seed_and_rpc_on_same_network(rpc: &electrum_client::Client, network: Network)
540551
#[cfg(test)]
541552
mod tests {
542553
use super::*;
543-
use crate::seed;
544554
use bdk::database::MemoryDatabase;
545555
use bdk_ext::keypair;
546556
use bdk_ext::new_test_wallet;
@@ -630,13 +640,13 @@ mod tests {
630640
let mut import_seed = [0u8; 32];
631641
thread_rng().fill(&mut import_seed);
632642

633-
let seed_path = data_dir.join(seed::TAKER_WALLET_SEED_FILE);
634643
// import seed
635644
actor
636645
.send(ImportSeed {
637646
seed: import_seed.to_vec(),
638647
network: Network::Testnet,
639-
seed_path,
648+
path: data_dir,
649+
name: crate::seed::TAKER_WALLET_SEED_FILE.to_string(),
640650
})
641651
.await
642652
.unwrap()
@@ -670,8 +680,6 @@ mod tests {
670680

671681
let wallet = actor.create(None).spawn(&mut tasks);
672682

673-
let seed_path = data_dir.join(seed::TAKER_WALLET_SEED_FILE);
674-
675683
const IMPORT_SEED: [u8; 256] = [
676684
137, 78, 181, 39, 89, 143, 9, 224, 92, 125, 51, 183, 87, 95, 206, 236, 135, 33, 54, 10,
677685
237, 169, 132, 74, 230, 66, 244, 244, 89, 224, 23, 62, 163, 60, 39, 66, 19, 213, 68,
@@ -693,7 +701,8 @@ mod tests {
693701
.send(ImportSeed {
694702
seed: IMPORT_SEED.to_vec(),
695703
network: Network::Testnet,
696-
seed_path,
704+
path: data_dir,
705+
name: crate::seed::TAKER_WALLET_SEED_FILE.to_string(),
697706
})
698707
.await
699708
.unwrap()

crates/model/src/lib.rs

+6
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,12 @@ impl Timestamp {
487487
}
488488
}
489489

490+
impl fmt::Display for Timestamp {
491+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
492+
self.0.fmt(f)
493+
}
494+
}
495+
490496
/// Funding rate per SETTLEMENT_INTERVAL
491497
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
492498
pub struct FundingRate(Decimal);

crates/taker/src/routes.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use daemon::projection;
1212
use daemon::projection::CfdAction;
1313
use daemon::projection::FeedReceivers;
1414
use daemon::seed;
15+
use daemon::seed::RANDOM_SEED_SIZE;
1516
use daemon::wallet;
1617
use daemon::Environment;
1718
use daemon::TakerActorSystem;
@@ -46,7 +47,6 @@ use std::path::PathBuf;
4647
use tokio::select;
4748
use tokio::sync::watch;
4849
use tracing::instrument;
49-
use daemon::seed::RANDOM_SEED_SIZE;
5050

5151
type Taker = TakerActorSystem<
5252
oracle::Actor,
@@ -357,11 +357,15 @@ pub async fn put_import_seed(
357357
}
358358

359359
// fetch seed from upload stream as bytes. we only support the random seed.
360-
let seed = seed.open(RANDOM_SEED_SIZE.bytes()).into_bytes().await.map_err(|e| {
361-
HttpApiProblem::new(StatusCode::INTERNAL_SERVER_ERROR)
362-
.title("Could not import seed file")
363-
.detail(format!("{e:#}"))
364-
})?;
360+
let seed = seed
361+
.open(RANDOM_SEED_SIZE.bytes())
362+
.into_bytes()
363+
.await
364+
.map_err(|e| {
365+
HttpApiProblem::new(StatusCode::INTERNAL_SERVER_ERROR)
366+
.title("Could not import seed file")
367+
.detail(format!("{e:#}"))
368+
})?;
365369

366370
if !seed.is_complete() {
367371
return Err(HttpApiProblem::new(StatusCode::BAD_REQUEST).title("Exceeded max file size."));
@@ -372,6 +376,7 @@ pub async fn put_import_seed(
372376
seed.into_inner(),
373377
data_dir.inner().clone(),
374378
*network.inner(),
379+
seed::TAKER_WALLET_SEED_FILE,
375380
)
376381
.await
377382
.map_err(|e| {

taker-frontend/src/components/Wallet.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ export default function Wallet(
338338
children={<Icon as={FaSeedling} />}
339339
/>
340340
<Input
341-
placeholder="Your seed ..."
341+
placeholder="Click here to import your seed ..."
342342
onClick={() => {
343343
const element = document.getElementById("importSeed");
344344
if (element) {

0 commit comments

Comments
 (0)