diff --git a/.github/workflows/monero-tests.yaml b/.github/workflows/monero-tests.yaml index ef643d6c6..a72a85a58 100644 --- a/.github/workflows/monero-tests.yaml +++ b/.github/workflows/monero-tests.yaml @@ -39,9 +39,6 @@ jobs: GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-simple-request-rpc --lib GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-address --lib GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet --lib - GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-seed --lib - GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package polyseed --lib - GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet-util --lib # Doesn't run unit tests with features as the tests workflow will @@ -65,7 +62,6 @@ jobs: GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-serai --test '*' GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-simple-request-rpc --test '*' GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet --test '*' - GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet-util --test '*' - name: Run Integration Tests # Don't run if the the tests workflow also will @@ -74,4 +70,3 @@ jobs: GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-serai --all-features --test '*' GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-simple-request-rpc --test '*' GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet --all-features --test '*' - GITHUB_CI=true RUST_BACKTRACE=1 cargo test --package monero-wallet-util --all-features --test '*' diff --git a/.github/workflows/networks-tests.yml b/.github/workflows/networks-tests.yml index f346b9861..5966a6a85 100644 --- a/.github/workflows/networks-tests.yml +++ b/.github/workflows/networks-tests.yml @@ -45,7 +45,4 @@ jobs: -p monero-simple-request-rpc \ -p monero-address \ -p monero-wallet \ - -p monero-seed \ - -p polyseed \ - -p monero-wallet-util \ -p monero-serai-verify-chain diff --git a/Cargo.lock b/Cargo.lock index c049284b6..47088261f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1054,7 +1054,6 @@ name = "bitcoin-serai" version = "0.3.0" dependencies = [ "bitcoin", - "flexible-transcript", "hex", "k256", "modular-frost", @@ -4960,19 +4959,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "monero-seed" -version = "0.1.0" -dependencies = [ - "curve25519-dalek", - "hex", - "monero-primitives", - "rand_core", - "std-shims", - "thiserror", - "zeroize", -] - [[package]] name = "monero-serai" version = "0.1.4-alpha" @@ -5047,21 +5033,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "monero-wallet-util" -version = "0.1.0" -dependencies = [ - "curve25519-dalek", - "hex", - "monero-seed", - "monero-wallet", - "polyseed", - "rand_core", - "std-shims", - "thiserror", - "zeroize", -] - [[package]] name = "multiaddr" version = "0.18.1" @@ -5776,17 +5747,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] - [[package]] name = "pasta_curves" version = "0.5.1" @@ -5831,9 +5791,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac", - "password-hash", - "sha2", ] [[package]] @@ -5946,20 +5903,6 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "polyseed" -version = "0.1.0" -dependencies = [ - "hex", - "pbkdf2 0.12.2", - "rand_core", - "sha3", - "std-shims", - "subtle", - "thiserror", - "zeroize", -] - [[package]] name = "polyval" version = "0.6.2" @@ -8377,7 +8320,7 @@ dependencies = [ "dleq", "flexible-transcript", "minimal-ed448", - "monero-wallet-util", + "monero-wallet", "multiexp", "schnorr-signatures", ] @@ -8456,6 +8399,7 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", + "sp-std", "zeroize", ] diff --git a/Cargo.toml b/Cargo.toml index 3416d2225..357698b6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,9 +55,6 @@ members = [ "networks/monero/rpc/simple-request", "networks/monero/wallet/address", "networks/monero/wallet", - "networks/monero/wallet/seed", - "networks/monero/wallet/polyseed", - "networks/monero/wallet/util", "networks/monero/verify-chain", "message-queue", diff --git a/coordinator/src/cosign_evaluator.rs b/coordinator/src/cosign_evaluator.rs index 29d9cc4b0..844360081 100644 --- a/coordinator/src/cosign_evaluator.rs +++ b/coordinator/src/cosign_evaluator.rs @@ -12,9 +12,9 @@ use tokio::{ use borsh::BorshSerialize; use sp_application_crypto::RuntimePublic; use serai_client::{ - primitives::{NETWORKS, NetworkId, Signature}, - validator_sets::primitives::{Session, ValidatorSet}, - SeraiError, TemporalSerai, Serai, + primitives::{ExternalNetworkId, Signature, EXTERNAL_NETWORKS}, + validator_sets::primitives::{ExternalValidatorSet, Session}, + Serai, SeraiError, TemporalSerai, }; use serai_db::{Get, DbTxn, Db, create_db}; @@ -28,17 +28,17 @@ use crate::{ create_db! { CosignDb { - ReceivedCosign: (set: ValidatorSet, block: [u8; 32]) -> CosignedBlock, - LatestCosign: (network: NetworkId) -> CosignedBlock, - DistinctChain: (set: ValidatorSet) -> (), + ReceivedCosign: (set: ExternalValidatorSet, block: [u8; 32]) -> CosignedBlock, + LatestCosign: (network: ExternalNetworkId) -> CosignedBlock, + DistinctChain: (set: ExternalValidatorSet) -> (), } } pub struct CosignEvaluator { db: Mutex, serai: Arc, - stakes: RwLock>>, - latest_cosigns: RwLock>, + stakes: RwLock>>, + latest_cosigns: RwLock>, } impl CosignEvaluator { @@ -79,7 +79,7 @@ impl CosignEvaluator { let serai = self.serai.as_of_latest_finalized_block().await?; let mut stakes = HashMap::new(); - for network in NETWORKS { + for network in EXTERNAL_NETWORKS { // Use if this network has published a Batch for a short-circuit of if they've ever set a key let set_key = serai.in_instructions().last_batch_for_network(network).await?.is_some(); if set_key { @@ -87,7 +87,7 @@ impl CosignEvaluator { network, serai .validator_sets() - .total_allocated_stake(network) + .total_allocated_stake(network.into()) .await? .expect("network which published a batch didn't have a stake set") .0, @@ -126,9 +126,9 @@ impl CosignEvaluator { async fn set_with_keys_fn( serai: &TemporalSerai<'_>, - network: NetworkId, - ) -> Result, SeraiError> { - let Some(latest_session) = serai.validator_sets().session(network).await? else { + network: ExternalNetworkId, + ) -> Result, SeraiError> { + let Some(latest_session) = serai.validator_sets().session(network.into()).await? else { log::warn!("received cosign from {:?}, which doesn't yet have a session", network); return Ok(None); }; @@ -136,13 +136,13 @@ impl CosignEvaluator { Ok(Some( if serai .validator_sets() - .keys(ValidatorSet { network, session: prior_session }) + .keys(ExternalValidatorSet { network, session: prior_session }) .await? .is_some() { - ValidatorSet { network, session: prior_session } + ExternalValidatorSet { network, session: prior_session } } else { - ValidatorSet { network, session: latest_session } + ExternalValidatorSet { network, session: latest_session } }, )) } @@ -204,16 +204,12 @@ impl CosignEvaluator { let mut total_stake = 0; let mut total_on_distinct_chain = 0; - for network in NETWORKS { - if network == NetworkId::Serai { - continue; - } - + for network in EXTERNAL_NETWORKS { // Get the current set for this network let set_with_keys = { let mut res; while { - res = set_with_keys_fn(&serai, cosign.network).await; + res = set_with_keys_fn(&serai, network).await; res.is_err() } { log::error!( @@ -231,7 +227,8 @@ impl CosignEvaluator { let stake = { let mut res; while { - res = serai.validator_sets().total_allocated_stake(set_with_keys.network).await; + res = + serai.validator_sets().total_allocated_stake(set_with_keys.network.into()).await; res.is_err() } { log::error!( @@ -271,7 +268,7 @@ impl CosignEvaluator { #[allow(clippy::new_ret_no_self)] pub fn new(db: D, p2p: P, serai: Arc) -> mpsc::UnboundedSender { let mut latest_cosigns = HashMap::new(); - for network in NETWORKS { + for network in EXTERNAL_NETWORKS { if let Some(cosign) = LatestCosign::get(&db, network) { latest_cosigns.insert(network, cosign); } diff --git a/coordinator/src/db.rs b/coordinator/src/db.rs index 04ee9d350..934e50506 100644 --- a/coordinator/src/db.rs +++ b/coordinator/src/db.rs @@ -6,9 +6,9 @@ use blake2::{ use scale::Encode; use borsh::{BorshSerialize, BorshDeserialize}; use serai_client::{ - primitives::NetworkId, - validator_sets::primitives::{Session, ValidatorSet}, in_instructions::primitives::{Batch, SignedBatch}, + primitives::ExternalNetworkId, + validator_sets::primitives::{ExternalValidatorSet, Session}, }; pub use serai_db::*; @@ -18,21 +18,21 @@ use crate::tributary::{TributarySpec, Transaction, scanner::RecognizedIdType}; create_db!( MainDb { - HandledMessageDb: (network: NetworkId) -> u64, + HandledMessageDb: (network: ExternalNetworkId) -> u64, ActiveTributaryDb: () -> Vec, - RetiredTributaryDb: (set: ValidatorSet) -> (), + RetiredTributaryDb: (set: ExternalValidatorSet) -> (), FirstPreprocessDb: ( - network: NetworkId, + network: ExternalNetworkId, id_type: RecognizedIdType, id: &[u8] ) -> Vec>, - LastReceivedBatchDb: (network: NetworkId) -> u32, - ExpectedBatchDb: (network: NetworkId, id: u32) -> [u8; 32], - BatchDb: (network: NetworkId, id: u32) -> SignedBatch, - LastVerifiedBatchDb: (network: NetworkId) -> u32, - HandoverBatchDb: (set: ValidatorSet) -> u32, - LookupHandoverBatchDb: (network: NetworkId, batch: u32) -> Session, - QueuedBatchesDb: (set: ValidatorSet) -> Vec + LastReceivedBatchDb: (network: ExternalNetworkId) -> u32, + ExpectedBatchDb: (network: ExternalNetworkId, id: u32) -> [u8; 32], + BatchDb: (network: ExternalNetworkId, id: u32) -> SignedBatch, + LastVerifiedBatchDb: (network: ExternalNetworkId) -> u32, + HandoverBatchDb: (set: ExternalValidatorSet) -> u32, + LookupHandoverBatchDb: (network: ExternalNetworkId, batch: u32) -> Session, + QueuedBatchesDb: (set: ExternalValidatorSet) -> Vec } ); @@ -61,7 +61,7 @@ impl ActiveTributaryDb { ActiveTributaryDb::set(txn, &existing_bytes); } - pub fn retire_tributary(txn: &mut impl DbTxn, set: ValidatorSet) { + pub fn retire_tributary(txn: &mut impl DbTxn, set: ExternalValidatorSet) { let mut active = Self::active_tributaries(txn).1; for i in 0 .. active.len() { if active[i].set() == set { @@ -82,7 +82,7 @@ impl ActiveTributaryDb { impl FirstPreprocessDb { pub fn save_first_preprocess( txn: &mut impl DbTxn, - network: NetworkId, + network: ExternalNetworkId, id_type: RecognizedIdType, id: &[u8], preprocess: &Vec>, @@ -108,19 +108,19 @@ impl ExpectedBatchDb { } impl HandoverBatchDb { - pub fn set_handover_batch(txn: &mut impl DbTxn, set: ValidatorSet, batch: u32) { + pub fn set_handover_batch(txn: &mut impl DbTxn, set: ExternalValidatorSet, batch: u32) { Self::set(txn, set, &batch); LookupHandoverBatchDb::set(txn, set.network, batch, &set.session); } } impl QueuedBatchesDb { - pub fn queue(txn: &mut impl DbTxn, set: ValidatorSet, batch: &Transaction) { + pub fn queue(txn: &mut impl DbTxn, set: ExternalValidatorSet, batch: &Transaction) { let mut batches = Self::get(txn, set).unwrap_or_default(); batch.write(&mut batches).unwrap(); Self::set(txn, set, &batches); } - pub fn take(txn: &mut impl DbTxn, set: ValidatorSet) -> Vec { + pub fn take(txn: &mut impl DbTxn, set: ExternalValidatorSet) -> Vec { let batches_vec = Self::get(txn, set).unwrap_or_default(); txn.del(Self::key(set)); diff --git a/coordinator/src/main.rs b/coordinator/src/main.rs index 58de348d2..adcc49ef1 100644 --- a/coordinator/src/main.rs +++ b/coordinator/src/main.rs @@ -23,8 +23,8 @@ use serai_db::{DbTxn, Db}; use scale::Encode; use borsh::BorshSerialize; use serai_client::{ - primitives::NetworkId, - validator_sets::primitives::{Session, ValidatorSet, KeyPair}, + primitives::ExternalNetworkId, + validator_sets::primitives::{ExternalValidatorSet, KeyPair, Session}, Public, Serai, SeraiInInstructions, }; @@ -79,7 +79,7 @@ pub struct ActiveTributary { #[derive(Clone)] pub enum TributaryEvent { NewTributary(ActiveTributary), - TributaryRetired(ValidatorSet), + TributaryRetired(ExternalValidatorSet), } // Creates a new tributary and sends it to all listeners. @@ -145,7 +145,7 @@ async fn handle_processor_message( p2p: &P, cosign_channel: &mpsc::UnboundedSender, tributaries: &HashMap>, - network: NetworkId, + network: ExternalNetworkId, msg: &processors::Message, ) -> bool { #[allow(clippy::nonminimal_bool)] @@ -193,7 +193,8 @@ async fn handle_processor_message( .iter() .map(|plan| plan.session) .filter(|session| { - RetiredTributaryDb::get(&txn, ValidatorSet { network, session: *session }).is_none() + RetiredTributaryDb::get(&txn, ExternalValidatorSet { network, session: *session }) + .is_none() }) .collect::>(); @@ -265,7 +266,7 @@ async fn handle_processor_message( } // This causes an action on Substrate yet not on any Tributary coordinator::ProcessorMessage::SignedSlashReport { session, signature } => { - let set = ValidatorSet { network, session: *session }; + let set = ExternalValidatorSet { network, session: *session }; let signature: &[u8] = signature.as_ref(); let signature = serai_client::Signature(signature.try_into().unwrap()); @@ -393,7 +394,7 @@ async fn handle_processor_message( if let Some(relevant_tributary_value) = relevant_tributary { if RetiredTributaryDb::get( &txn, - ValidatorSet { network: msg.network, session: relevant_tributary_value }, + ExternalValidatorSet { network: msg.network, session: relevant_tributary_value }, ) .is_some() { @@ -782,7 +783,7 @@ async fn handle_processor_messages( processors: Pro, p2p: P, cosign_channel: mpsc::UnboundedSender, - network: NetworkId, + network: ExternalNetworkId, mut tributary_event: mpsc::UnboundedReceiver>, ) { let mut tributaries = HashMap::new(); @@ -831,7 +832,7 @@ async fn handle_processor_messages( #[allow(clippy::too_many_arguments)] async fn handle_cosigns_and_batch_publication( mut db: D, - network: NetworkId, + network: ExternalNetworkId, mut tributary_event: mpsc::UnboundedReceiver>, ) { let mut tributaries = HashMap::new(); @@ -905,7 +906,7 @@ async fn handle_cosigns_and_batch_publication( for batch in start_id ..= last_id { let is_pre_handover = LookupHandoverBatchDb::get(&txn, network, batch + 1); if let Some(session) = is_pre_handover { - let set = ValidatorSet { network, session }; + let set = ExternalValidatorSet { network, session }; let mut queued = QueuedBatchesDb::take(&mut txn, set); // is_handover_batch is only set for handover `Batch`s we're participating in, making // this safe @@ -923,7 +924,8 @@ async fn handle_cosigns_and_batch_publication( let is_handover = LookupHandoverBatchDb::get(&txn, network, batch); if let Some(session) = is_handover { - for queued in QueuedBatchesDb::take(&mut txn, ValidatorSet { network, session }) { + for queued in QueuedBatchesDb::take(&mut txn, ExternalValidatorSet { network, session }) + { to_publish.push((session, queued)); } } @@ -970,10 +972,7 @@ pub async fn handle_processors( mut tributary_event: broadcast::Receiver>, ) { let mut channels = HashMap::new(); - for network in serai_client::primitives::NETWORKS { - if network == NetworkId::Serai { - continue; - } + for network in serai_client::primitives::EXTERNAL_NETWORKS { let (processor_send, processor_recv) = mpsc::unbounded_channel(); tokio::spawn(handle_processor_messages( db.clone(), @@ -1195,7 +1194,7 @@ pub async fn run( } }); - move |set: ValidatorSet, genesis, id_type, id: Vec| { + move |set: ExternalValidatorSet, genesis, id_type, id: Vec| { log::debug!("recognized ID {:?} {}", id_type, hex::encode(&id)); let mut raw_db = raw_db.clone(); let key = key.clone(); diff --git a/coordinator/src/p2p.rs b/coordinator/src/p2p.rs index cecb35176..a9fd288e3 100644 --- a/coordinator/src/p2p.rs +++ b/coordinator/src/p2p.rs @@ -11,7 +11,9 @@ use rand_core::{RngCore, OsRng}; use scale::{Decode, Encode}; use borsh::{BorshSerialize, BorshDeserialize}; -use serai_client::{primitives::NetworkId, validator_sets::primitives::ValidatorSet, Serai}; +use serai_client::{ + primitives::ExternalNetworkId, validator_sets::primitives::ExternalValidatorSet, Serai, +}; use serai_db::Db; @@ -69,7 +71,7 @@ const BLOCKS_PER_BATCH: usize = BLOCKS_PER_MINUTE + 1; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, BorshSerialize, BorshDeserialize)] pub struct CosignedBlock { - pub network: NetworkId, + pub network: ExternalNetworkId, pub block_number: u64, pub block: [u8; 32], pub signature: [u8; 64], @@ -208,8 +210,8 @@ pub struct HeartbeatBatch { pub trait P2p: Send + Sync + Clone + fmt::Debug + TributaryP2p { type Id: Send + Sync + Clone + Copy + fmt::Debug; - async fn subscribe(&self, set: ValidatorSet, genesis: [u8; 32]); - async fn unsubscribe(&self, set: ValidatorSet, genesis: [u8; 32]); + async fn subscribe(&self, set: ExternalValidatorSet, genesis: [u8; 32]); + async fn unsubscribe(&self, set: ExternalValidatorSet, genesis: [u8; 32]); async fn send_raw(&self, to: Self::Id, msg: Vec); async fn broadcast_raw(&self, kind: P2pMessageKind, msg: Vec); @@ -309,7 +311,7 @@ struct Behavior { #[allow(clippy::type_complexity)] #[derive(Clone)] pub struct LibP2p { - subscribe: Arc>>, + subscribe: Arc>>, send: Arc)>>>, broadcast: Arc)>>>, receive: Arc>>>, @@ -397,7 +399,7 @@ impl LibP2p { let (receive_send, receive_recv) = mpsc::unbounded_channel(); let (subscribe_send, mut subscribe_recv) = mpsc::unbounded_channel(); - fn topic_for_set(set: ValidatorSet) -> IdentTopic { + fn topic_for_set(set: ExternalValidatorSet) -> IdentTopic { IdentTopic::new(format!("{LIBP2P_TOPIC}-{}", hex::encode(set.encode()))) } @@ -407,7 +409,8 @@ impl LibP2p { // The addrs we're currently dialing, and the networks associated with them let dialing_peers = Arc::new(RwLock::new(HashMap::new())); // The peers we're currently connected to, and the networks associated with them - let connected_peers = Arc::new(RwLock::new(HashMap::>::new())); + let connected_peers = + Arc::new(RwLock::new(HashMap::>::new())); // Find and connect to peers let (connect_to_network_send, mut connect_to_network_recv) = @@ -420,7 +423,7 @@ impl LibP2p { let connect_to_network_send = connect_to_network_send.clone(); async move { loop { - let connect = |network: NetworkId, addr: Multiaddr| { + let connect = |network: ExternalNetworkId, addr: Multiaddr| { let dialing_peers = dialing_peers.clone(); let connected_peers = connected_peers.clone(); let to_dial_send = to_dial_send.clone(); @@ -507,7 +510,7 @@ impl LibP2p { connect_to_network_networks.insert(network); } for network in connect_to_network_networks { - if let Ok(mut nodes) = serai.p2p_validators(network).await { + if let Ok(mut nodes) = serai.p2p_validators(network.into()).await { // If there's an insufficient amount of nodes known, connect to all yet add it // back and break if nodes.len() < TARGET_PEERS { @@ -557,7 +560,7 @@ impl LibP2p { // Subscribe to any new topics set = subscribe_recv.recv() => { - let (subscribe, set, genesis): (_, ValidatorSet, [u8; 32]) = + let (subscribe, set, genesis): (_, ExternalValidatorSet, [u8; 32]) = set.expect("subscribe_recv closed. are we shutting down?"); let topic = topic_for_set(set); if subscribe { @@ -776,7 +779,7 @@ impl LibP2p { impl P2p for LibP2p { type Id = PeerId; - async fn subscribe(&self, set: ValidatorSet, genesis: [u8; 32]) { + async fn subscribe(&self, set: ExternalValidatorSet, genesis: [u8; 32]) { self .subscribe .lock() @@ -785,7 +788,7 @@ impl P2p for LibP2p { .expect("subscribe_send closed. are we shutting down?"); } - async fn unsubscribe(&self, set: ValidatorSet, genesis: [u8; 32]) { + async fn unsubscribe(&self, set: ExternalValidatorSet, genesis: [u8; 32]) { self .subscribe .lock() diff --git a/coordinator/src/processors.rs b/coordinator/src/processors.rs index 9157e2a6e..cfdbfa251 100644 --- a/coordinator/src/processors.rs +++ b/coordinator/src/processors.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use serai_client::primitives::NetworkId; +use serai_client::primitives::ExternalNetworkId; use processor_messages::{ProcessorMessage, CoordinatorMessage}; use message_queue::{Service, Metadata, client::MessageQueue}; @@ -8,27 +8,27 @@ use message_queue::{Service, Metadata, client::MessageQueue}; #[derive(Clone, PartialEq, Eq, Debug)] pub struct Message { pub id: u64, - pub network: NetworkId, + pub network: ExternalNetworkId, pub msg: ProcessorMessage, } #[async_trait::async_trait] pub trait Processors: 'static + Send + Sync + Clone { - async fn send(&self, network: NetworkId, msg: impl Send + Into); - async fn recv(&self, network: NetworkId) -> Message; + async fn send(&self, network: ExternalNetworkId, msg: impl Send + Into); + async fn recv(&self, network: ExternalNetworkId) -> Message; async fn ack(&self, msg: Message); } #[async_trait::async_trait] impl Processors for Arc { - async fn send(&self, network: NetworkId, msg: impl Send + Into) { + async fn send(&self, network: ExternalNetworkId, msg: impl Send + Into) { let msg: CoordinatorMessage = msg.into(); let metadata = Metadata { from: self.service, to: Service::Processor(network), intent: msg.intent() }; let msg = borsh::to_vec(&msg).unwrap(); self.queue(metadata, msg).await; } - async fn recv(&self, network: NetworkId) -> Message { + async fn recv(&self, network: ExternalNetworkId) -> Message { let msg = self.next(Service::Processor(network)).await; assert_eq!(msg.from, Service::Processor(network)); diff --git a/coordinator/src/substrate/cosign.rs b/coordinator/src/substrate/cosign.rs index 005607632..644ddf13a 100644 --- a/coordinator/src/substrate/cosign.rs +++ b/coordinator/src/substrate/cosign.rs @@ -19,9 +19,9 @@ use ciphersuite::{Ciphersuite, Ristretto}; use borsh::{BorshSerialize, BorshDeserialize}; use serai_client::{ - SeraiError, Serai, - primitives::NetworkId, - validator_sets::primitives::{Session, ValidatorSet}, + primitives::ExternalNetworkId, + validator_sets::primitives::{ExternalValidatorSet, Session}, + Serai, SeraiError, }; use serai_db::*; @@ -70,13 +70,18 @@ impl LatestCosignedBlock { db_channel! { SubstrateDbChannels { - CosignTransactions: (network: NetworkId) -> (Session, u64, [u8; 32]), + CosignTransactions: (network: ExternalNetworkId) -> (Session, u64, [u8; 32]), } } impl CosignTransactions { // Append a cosign transaction. - pub fn append_cosign(txn: &mut impl DbTxn, set: ValidatorSet, number: u64, hash: [u8; 32]) { + pub fn append_cosign( + txn: &mut impl DbTxn, + set: ExternalValidatorSet, + number: u64, + hash: [u8; 32], + ) { CosignTransactions::send(txn, set.network, &(set.session, number, hash)) } } @@ -256,22 +261,22 @@ async fn advance_cosign_protocol_inner( // Using the keys of the prior block ensures this deadlock isn't reached let serai = serai.as_of(actual_block.header.parent_hash.into()); - for network in serai_client::primitives::NETWORKS { + for network in serai_client::primitives::EXTERNAL_NETWORKS { // Get the latest session to have set keys let set_with_keys = { - let Some(latest_session) = serai.validator_sets().session(network).await? else { + let Some(latest_session) = serai.validator_sets().session(network.into()).await? else { continue; }; let prior_session = Session(latest_session.0.saturating_sub(1)); if serai .validator_sets() - .keys(ValidatorSet { network, session: prior_session }) + .keys(ExternalValidatorSet { network, session: prior_session }) .await? .is_some() { - ValidatorSet { network, session: prior_session } + ExternalValidatorSet { network, session: prior_session } } else { - let set = ValidatorSet { network, session: latest_session }; + let set = ExternalValidatorSet { network, session: latest_session }; if serai.validator_sets().keys(set).await?.is_none() { continue; } @@ -280,7 +285,7 @@ async fn advance_cosign_protocol_inner( }; log::debug!("{:?} will be cosigning {block}", set_with_keys.network); - cosigning.push((set_with_keys, in_set(key, &serai, set_with_keys).await?.unwrap())); + cosigning.push((set_with_keys, in_set(key, &serai, set_with_keys.into()).await?.unwrap())); } break; diff --git a/coordinator/src/substrate/db.rs b/coordinator/src/substrate/db.rs index 2621e5ef7..524931057 100644 --- a/coordinator/src/substrate/db.rs +++ b/coordinator/src/substrate/db.rs @@ -1,4 +1,4 @@ -use serai_client::primitives::NetworkId; +use serai_client::primitives::ExternalNetworkId; pub use serai_db::*; @@ -9,7 +9,7 @@ mod inner_db { SubstrateDb { NextBlock: () -> u64, HandledEvent: (block: [u8; 32]) -> u32, - BatchInstructionsHashDb: (network: NetworkId, id: u32) -> [u8; 32] + BatchInstructionsHashDb: (network: ExternalNetworkId, id: u32) -> [u8; 32] } ); } diff --git a/coordinator/src/substrate/mod.rs b/coordinator/src/substrate/mod.rs index fb1e3aed2..a10806a39 100644 --- a/coordinator/src/substrate/mod.rs +++ b/coordinator/src/substrate/mod.rs @@ -9,11 +9,14 @@ use zeroize::Zeroizing; use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto}; use serai_client::{ - SeraiError, Block, Serai, TemporalSerai, - primitives::{BlockHash, NetworkId}, - validator_sets::{primitives::ValidatorSet, ValidatorSetsEvent}, - in_instructions::InInstructionsEvent, coins::CoinsEvent, + in_instructions::InInstructionsEvent, + primitives::{BlockHash, ExternalNetworkId}, + validator_sets::{ + primitives::{ExternalValidatorSet, ValidatorSet}, + ValidatorSetsEvent, + }, + Block, Serai, SeraiError, TemporalSerai, }; use serai_db::DbTxn; @@ -52,9 +55,9 @@ async fn handle_new_set( new_tributary_spec: &mpsc::UnboundedSender, serai: &Serai, block: &Block, - set: ValidatorSet, + set: ExternalValidatorSet, ) -> Result<(), SeraiError> { - if in_set(key, &serai.as_of(block.hash()), set) + if in_set(key, &serai.as_of(block.hash()), set.into()) .await? .expect("NewSet for set which doesn't exist") { @@ -64,7 +67,7 @@ async fn handle_new_set( let serai = serai.as_of(block.hash()); let serai = serai.validator_sets(); let set_participants = - serai.participants(set.network).await?.expect("NewSet for set which doesn't exist"); + serai.participants(set.network.into()).await?.expect("NewSet for set which doesn't exist"); set_participants.into_iter().map(|(k, w)| (k, u16::try_from(w).unwrap())).collect::>() }; @@ -131,7 +134,7 @@ async fn handle_batch_and_burns( }; let mut batch_block = HashMap::new(); - let mut batches = HashMap::>::new(); + let mut batches = HashMap::>::new(); let mut burns = HashMap::new(); let serai = serai.as_of(block.hash()); @@ -205,8 +208,8 @@ async fn handle_block( db: &mut D, key: &Zeroizing<::F>, new_tributary_spec: &mpsc::UnboundedSender, - perform_slash_report: &mpsc::UnboundedSender, - tributary_retired: &mpsc::UnboundedSender, + perform_slash_report: &mpsc::UnboundedSender, + tributary_retired: &mpsc::UnboundedSender, processors: &Pro, serai: &Serai, block: Block, @@ -226,12 +229,8 @@ async fn handle_block( panic!("NewSet event wasn't NewSet: {new_set:?}"); }; - // If this is Serai, do nothing // We only coordinate/process external networks - if set.network == NetworkId::Serai { - continue; - } - + let Ok(set) = ExternalValidatorSet::try_from(set) else { continue }; if HandledEvent::is_unhandled(db, hash, event_id) { log::info!("found fresh new set event {:?}", new_set); let mut txn = db.txn(); @@ -286,10 +285,7 @@ async fn handle_block( panic!("AcceptedHandover event wasn't AcceptedHandover: {accepted_handover:?}"); }; - if set.network == NetworkId::Serai { - continue; - } - + let Ok(set) = ExternalValidatorSet::try_from(set) else { continue }; if HandledEvent::is_unhandled(db, hash, event_id) { log::info!("found fresh accepted handover event {:?}", accepted_handover); // TODO: This isn't atomic with the event handling @@ -307,10 +303,7 @@ async fn handle_block( panic!("SetRetired event wasn't SetRetired: {retired_set:?}"); }; - if set.network == NetworkId::Serai { - continue; - } - + let Ok(set) = ExternalValidatorSet::try_from(set) else { continue }; if HandledEvent::is_unhandled(db, hash, event_id) { log::info!("found fresh set retired event {:?}", retired_set); let mut txn = db.txn(); @@ -340,8 +333,8 @@ async fn handle_new_blocks( db: &mut D, key: &Zeroizing<::F>, new_tributary_spec: &mpsc::UnboundedSender, - perform_slash_report: &mpsc::UnboundedSender, - tributary_retired: &mpsc::UnboundedSender, + perform_slash_report: &mpsc::UnboundedSender, + tributary_retired: &mpsc::UnboundedSender, processors: &Pro, serai: &Serai, next_block: &mut u64, @@ -395,8 +388,8 @@ pub async fn scan_task( processors: Pro, serai: Arc, new_tributary_spec: mpsc::UnboundedSender, - perform_slash_report: mpsc::UnboundedSender, - tributary_retired: mpsc::UnboundedSender, + perform_slash_report: mpsc::UnboundedSender, + tributary_retired: mpsc::UnboundedSender, ) { log::info!("scanning substrate"); let mut next_substrate_block = NextBlock::get(&db).unwrap_or_default(); @@ -494,9 +487,12 @@ pub async fn scan_task( /// retry. pub(crate) async fn expected_next_batch( serai: &Serai, - network: NetworkId, + network: ExternalNetworkId, ) -> Result { - async fn expected_next_batch_inner(serai: &Serai, network: NetworkId) -> Result { + async fn expected_next_batch_inner( + serai: &Serai, + network: ExternalNetworkId, + ) -> Result { let serai = serai.as_of_latest_finalized_block().await?; let last = serai.in_instructions().last_batch_for_network(network).await?; Ok(if let Some(last) = last { last + 1 } else { 0 }) @@ -519,7 +515,7 @@ pub(crate) async fn expected_next_batch( /// This is deemed fine. pub(crate) async fn verify_published_batches( txn: &mut D::Transaction<'_>, - network: NetworkId, + network: ExternalNetworkId, optimistic_up_to: u32, ) -> Option { // TODO: Localize from MainDb to SubstrateDb diff --git a/coordinator/src/tests/mod.rs b/coordinator/src/tests/mod.rs index db4c158fd..1d9d6d345 100644 --- a/coordinator/src/tests/mod.rs +++ b/coordinator/src/tests/mod.rs @@ -4,7 +4,7 @@ use std::{ collections::{VecDeque, HashSet, HashMap}, }; -use serai_client::{primitives::NetworkId, validator_sets::primitives::ValidatorSet}; +use serai_client::{primitives::ExternalNetworkId, validator_sets::primitives::ExternalValidatorSet}; use processor_messages::CoordinatorMessage; @@ -20,7 +20,7 @@ use crate::{ pub mod tributary; #[derive(Clone)] -pub struct MemProcessors(pub Arc>>>); +pub struct MemProcessors(pub Arc>>>); impl MemProcessors { #[allow(clippy::new_without_default)] pub fn new() -> MemProcessors { @@ -30,12 +30,12 @@ impl MemProcessors { #[async_trait::async_trait] impl Processors for MemProcessors { - async fn send(&self, network: NetworkId, msg: impl Send + Into) { + async fn send(&self, network: ExternalNetworkId, msg: impl Send + Into) { let mut processors = self.0.write().await; let processor = processors.entry(network).or_insert_with(VecDeque::new); processor.push_back(msg.into()); } - async fn recv(&self, _: NetworkId) -> Message { + async fn recv(&self, _: ExternalNetworkId) -> Message { todo!() } async fn ack(&self, _: Message) { @@ -65,8 +65,8 @@ impl LocalP2p { impl P2p for LocalP2p { type Id = usize; - async fn subscribe(&self, _set: ValidatorSet, _genesis: [u8; 32]) {} - async fn unsubscribe(&self, _set: ValidatorSet, _genesis: [u8; 32]) {} + async fn subscribe(&self, _set: ExternalValidatorSet, _genesis: [u8; 32]) {} + async fn unsubscribe(&self, _set: ExternalValidatorSet, _genesis: [u8; 32]) {} async fn send_raw(&self, to: Self::Id, msg: Vec) { let mut msg_ref = msg.as_slice(); diff --git a/coordinator/src/tests/tributary/chain.rs b/coordinator/src/tests/tributary/chain.rs index 7fc6a0647..62feb78bf 100644 --- a/coordinator/src/tests/tributary/chain.rs +++ b/coordinator/src/tests/tributary/chain.rs @@ -15,8 +15,8 @@ use ciphersuite::{ use sp_application_crypto::sr25519; use borsh::BorshDeserialize; use serai_client::{ - primitives::NetworkId, - validator_sets::primitives::{Session, ValidatorSet}, + primitives::ExternalNetworkId, + validator_sets::primitives::{ExternalValidatorSet, Session}, }; use tokio::time::sleep; @@ -50,7 +50,7 @@ pub fn new_spec( let start_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(); - let set = ValidatorSet { session: Session(0), network: NetworkId::Bitcoin }; + let set = ExternalValidatorSet { session: Session(0), network: ExternalNetworkId::Bitcoin }; let set_participants = keys .iter() diff --git a/coordinator/src/tests/tributary/dkg.rs b/coordinator/src/tests/tributary/dkg.rs index 04a528f90..adaa66431 100644 --- a/coordinator/src/tests/tributary/dkg.rs +++ b/coordinator/src/tests/tributary/dkg.rs @@ -10,7 +10,7 @@ use frost::Participant; use sp_runtime::traits::Verify; use serai_client::{ primitives::{SeraiAddress, Signature}, - validator_sets::primitives::{ValidatorSet, KeyPair}, + validator_sets::primitives::{ExternalValidatorSet, KeyPair}, }; use tokio::time::sleep; @@ -350,7 +350,7 @@ async fn dkg_test() { async fn publish_set_keys( &self, _db: &(impl Sync + Get), - set: ValidatorSet, + set: ExternalValidatorSet, removed: Vec, key_pair: KeyPair, signature: Signature, @@ -362,7 +362,7 @@ async fn dkg_test() { &*serai_client::validator_sets::primitives::set_keys_message(&set, &[], &key_pair), &serai_client::Public( frost::dkg::musig::musig_key::( - &serai_client::validator_sets::primitives::musig_context(set), + &serai_client::validator_sets::primitives::musig_context(set.into()), &self.spec.validators().into_iter().map(|(validator, _)| validator).collect::>() ) .unwrap() diff --git a/coordinator/src/tests/tributary/mod.rs b/coordinator/src/tests/tributary/mod.rs index c3f983116..1016248dd 100644 --- a/coordinator/src/tests/tributary/mod.rs +++ b/coordinator/src/tests/tributary/mod.rs @@ -7,7 +7,7 @@ use ciphersuite::{group::Group, Ciphersuite, Ristretto}; use scale::{Encode, Decode}; use serai_client::{ primitives::{SeraiAddress, Signature}, - validator_sets::primitives::{MAX_KEY_SHARES_PER_SET, ValidatorSet, KeyPair}, + validator_sets::primitives::{ExternalValidatorSet, KeyPair, MAX_KEY_SHARES_PER_SET}, }; use processor_messages::coordinator::SubstrateSignableId; @@ -31,7 +31,7 @@ impl PublishSeraiTransaction for () { async fn publish_set_keys( &self, _db: &(impl Sync + serai_db::Get), - _set: ValidatorSet, + _set: ExternalValidatorSet, _removed: Vec, _key_pair: KeyPair, _signature: Signature, diff --git a/coordinator/src/tributary/db.rs b/coordinator/src/tributary/db.rs index fda1c47ba..fe39b7de1 100644 --- a/coordinator/src/tributary/db.rs +++ b/coordinator/src/tributary/db.rs @@ -6,7 +6,7 @@ use borsh::{BorshSerialize, BorshDeserialize}; use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto}; use frost::Participant; -use serai_client::validator_sets::primitives::{KeyPair, ValidatorSet}; +use serai_client::validator_sets::primitives::{KeyPair, ExternalValidatorSet}; use processor_messages::coordinator::SubstrateSignableId; @@ -46,7 +46,7 @@ pub enum Accumulation { create_db!( Tributary { SeraiBlockNumber: (hash: [u8; 32]) -> u64, - SeraiDkgCompleted: (spec: ValidatorSet) -> [u8; 32], + SeraiDkgCompleted: (spec: ExternalValidatorSet) -> [u8; 32], TributaryBlockNumber: (block: [u8; 32]) -> u32, LastHandledBlock: (genesis: [u8; 32]) -> [u8; 32], @@ -80,7 +80,7 @@ create_db!( SlashReports: (genesis: [u8; 32], signer: [u8; 32]) -> Vec, SlashReported: (genesis: [u8; 32]) -> u16, SlashReportCutOff: (genesis: [u8; 32]) -> u64, - SlashReport: (set: ValidatorSet) -> Vec<([u8; 32], u32)>, + SlashReport: (set: ExternalValidatorSet) -> Vec<([u8; 32], u32)>, } ); diff --git a/coordinator/src/tributary/mod.rs b/coordinator/src/tributary/mod.rs index cc9bdb1ea..27bb6396b 100644 --- a/coordinator/src/tributary/mod.rs +++ b/coordinator/src/tributary/mod.rs @@ -1,6 +1,6 @@ use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto}; -use serai_client::validator_sets::primitives::ValidatorSet; +use serai_client::validator_sets::primitives::ExternalValidatorSet; use tributary::{ ReadWrite, @@ -40,7 +40,7 @@ pub fn removed_as_of_dkg_attempt( pub fn removed_as_of_set_keys( getter: &impl Get, - set: ValidatorSet, + set: ExternalValidatorSet, genesis: [u8; 32], ) -> Option::G>> { // SeraiDkgCompleted has the key placed on-chain. diff --git a/coordinator/src/tributary/scanner.rs b/coordinator/src/tributary/scanner.rs index 9b56e0a0f..8e1f48427 100644 --- a/coordinator/src/tributary/scanner.rs +++ b/coordinator/src/tributary/scanner.rs @@ -10,7 +10,7 @@ use tokio::sync::broadcast; use scale::{Encode, Decode}; use serai_client::{ primitives::{SeraiAddress, Signature}, - validator_sets::primitives::{KeyPair, ValidatorSet}, + validator_sets::primitives::{ExternalValidatorSet, KeyPair}, Serai, }; @@ -38,7 +38,7 @@ pub enum RecognizedIdType { pub trait RIDTrait { async fn recognized_id( &self, - set: ValidatorSet, + set: ExternalValidatorSet, genesis: [u8; 32], kind: RecognizedIdType, id: Vec, @@ -47,12 +47,12 @@ pub trait RIDTrait { #[async_trait::async_trait] impl< FRid: Send + Future, - F: Sync + Fn(ValidatorSet, [u8; 32], RecognizedIdType, Vec) -> FRid, + F: Sync + Fn(ExternalValidatorSet, [u8; 32], RecognizedIdType, Vec) -> FRid, > RIDTrait for F { async fn recognized_id( &self, - set: ValidatorSet, + set: ExternalValidatorSet, genesis: [u8; 32], kind: RecognizedIdType, id: Vec, @@ -66,7 +66,7 @@ pub trait PublishSeraiTransaction { async fn publish_set_keys( &self, db: &(impl Sync + Get), - set: ValidatorSet, + set: ExternalValidatorSet, removed: Vec, key_pair: KeyPair, signature: Signature, @@ -86,7 +86,7 @@ mod impl_pst_for_serai { async fn publish( serai: &Serai, db: &impl Get, - set: ValidatorSet, + set: ExternalValidatorSet, tx: serai_client::Transaction, meta: $Meta, ) -> bool { @@ -128,7 +128,7 @@ mod impl_pst_for_serai { async fn publish_set_keys( &self, db: &(impl Sync + Get), - set: ValidatorSet, + set: ExternalValidatorSet, removed: Vec, key_pair: KeyPair, signature: Signature, @@ -140,7 +140,7 @@ mod impl_pst_for_serai { key_pair, signature, ); - async fn check(serai: SeraiValidatorSets<'_>, set: ValidatorSet, (): ()) -> bool { + async fn check(serai: SeraiValidatorSets<'_>, set: ExternalValidatorSet, (): ()) -> bool { if matches!(serai.keys(set).await, Ok(Some(_))) { log::info!("another coordinator set key pair for {:?}", set); return true; diff --git a/coordinator/src/tributary/signing_protocol.rs b/coordinator/src/tributary/signing_protocol.rs index a90ed4799..20dda48eb 100644 --- a/coordinator/src/tributary/signing_protocol.rs +++ b/coordinator/src/tributary/signing_protocol.rs @@ -119,7 +119,7 @@ impl SigningProtocol<'_, T, C> { let algorithm = Schnorrkel::new(b"substrate"); let keys: ThresholdKeys = - musig(&musig_context(self.spec.set()), self.key, participants) + musig(&musig_context(self.spec.set().into()), self.key, participants) .expect("signing for a set we aren't in/validator present multiple times") .into(); diff --git a/coordinator/src/tributary/spec.rs b/coordinator/src/tributary/spec.rs index 92905490f..345584b6d 100644 --- a/coordinator/src/tributary/spec.rs +++ b/coordinator/src/tributary/spec.rs @@ -9,7 +9,7 @@ use frost::Participant; use scale::Encode; use borsh::{BorshSerialize, BorshDeserialize}; -use serai_client::{primitives::PublicKey, validator_sets::primitives::ValidatorSet}; +use serai_client::{primitives::PublicKey, validator_sets::primitives::ExternalValidatorSet}; fn borsh_serialize_validators( validators: &Vec<(::G, u16)>, @@ -43,7 +43,7 @@ fn borsh_deserialize_validators( pub struct TributarySpec { serai_block: [u8; 32], start_time: u64, - set: ValidatorSet, + set: ExternalValidatorSet, #[borsh( serialize_with = "borsh_serialize_validators", deserialize_with = "borsh_deserialize_validators" @@ -55,7 +55,7 @@ impl TributarySpec { pub fn new( serai_block: [u8; 32], start_time: u64, - set: ValidatorSet, + set: ExternalValidatorSet, set_participants: Vec<(PublicKey, u16)>, ) -> TributarySpec { let mut validators = vec![]; @@ -68,7 +68,7 @@ impl TributarySpec { Self { serai_block, start_time, set, validators } } - pub fn set(&self) -> ValidatorSet { + pub fn set(&self) -> ExternalValidatorSet { self.set } diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index c41d72686..1d5b4214f 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -5,20 +5,20 @@ GEM public_suffix (>= 2.0.2, < 7.0) bigdecimal (3.1.8) colorator (1.1.0) - concurrent-ruby (1.3.3) + concurrent-ruby (1.3.4) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) ffi (1.17.0-x86_64-linux-gnu) forwardable-extended (2.6.0) - google-protobuf (4.27.3-x86_64-linux) + google-protobuf (4.28.2-x86_64-linux) bigdecimal rake (>= 13) http_parser.rb (0.8.0) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) - jekyll (4.3.3) + jekyll (4.3.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -63,17 +63,15 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.3.4) - strscan - rouge (4.3.0) + rexml (3.3.7) + rouge (4.4.0) safe_yaml (1.0.5) - sass-embedded (1.77.8-x86_64-linux-gnu) - google-protobuf (~> 4.26) - strscan (3.1.0) + sass-embedded (1.79.3-x86_64-linux-gnu) + google-protobuf (~> 4.27) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - unicode-display_width (2.5.0) - webrick (1.8.1) + unicode-display_width (2.6.0) + webrick (1.8.2) PLATFORMS x86_64-linux diff --git a/message-queue/src/main.rs b/message-queue/src/main.rs index c43cc3c84..b1c6e85ba 100644 --- a/message-queue/src/main.rs +++ b/message-queue/src/main.rs @@ -6,7 +6,7 @@ pub(crate) use std::{ pub(crate) use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto}; pub(crate) use schnorr_signatures::SchnorrSignature; -pub(crate) use serai_primitives::NetworkId; +pub(crate) use serai_primitives::ExternalNetworkId; pub(crate) use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, @@ -193,10 +193,7 @@ async fn main() { KEYS.write().unwrap().insert(service, key); let mut queues = QUEUES.write().unwrap(); if service == Service::Coordinator { - for network in serai_primitives::NETWORKS { - if network == NetworkId::Serai { - continue; - } + for network in serai_primitives::EXTERNAL_NETWORKS { queues.insert( (service, Service::Processor(network)), RwLock::new(Queue(db.clone(), service, Service::Processor(network))), @@ -210,17 +207,13 @@ async fn main() { } }; - // Make queues for each NetworkId, other than Serai - for network in serai_primitives::NETWORKS { - if network == NetworkId::Serai { - continue; - } + // Make queues for each ExternalNetworkId + for network in serai_primitives::EXTERNAL_NETWORKS { // Use a match so we error if the list of NetworkIds changes let Some(key) = read_key(match network { - NetworkId::Serai => unreachable!(), - NetworkId::Bitcoin => "BITCOIN_KEY", - NetworkId::Ethereum => "ETHEREUM_KEY", - NetworkId::Monero => "MONERO_KEY", + ExternalNetworkId::Bitcoin => "BITCOIN_KEY", + ExternalNetworkId::Ethereum => "ETHEREUM_KEY", + ExternalNetworkId::Monero => "MONERO_KEY", }) else { continue; }; diff --git a/message-queue/src/messages.rs b/message-queue/src/messages.rs index 942f3ff51..13c3dee0e 100644 --- a/message-queue/src/messages.rs +++ b/message-queue/src/messages.rs @@ -3,11 +3,11 @@ use ciphersuite::{group::GroupEncoding, Ciphersuite, Ristretto}; use borsh::{BorshSerialize, BorshDeserialize}; -use serai_primitives::NetworkId; +use serai_primitives::ExternalNetworkId; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, BorshSerialize, BorshDeserialize)] pub enum Service { - Processor(NetworkId), + Processor(ExternalNetworkId), Coordinator, } diff --git a/networks/bitcoin/Cargo.toml b/networks/bitcoin/Cargo.toml index 6fc33da1e..5ab44cc6d 100644 --- a/networks/bitcoin/Cargo.toml +++ b/networks/bitcoin/Cargo.toml @@ -26,8 +26,6 @@ rand_core = { version = "0.6", default-features = false } bitcoin = { version = "0.32", default-features = false } k256 = { version = "^0.13.1", default-features = false, features = ["arithmetic", "bits"] } - -transcript = { package = "flexible-transcript", path = "../../crypto/transcript", version = "0.3", default-features = false, features = ["recommended"], optional = true } frost = { package = "modular-frost", path = "../../crypto/frost", version = "0.8", default-features = false, features = ["secp256k1"], optional = true } hex = { version = "0.4", default-features = false, optional = true } @@ -55,8 +53,6 @@ std = [ "bitcoin/serde", "k256/std", - - "transcript/std", "frost", "hex/std", diff --git a/networks/bitcoin/src/crypto.rs b/networks/bitcoin/src/crypto.rs index 72aff20ce..11510909c 100644 --- a/networks/bitcoin/src/crypto.rs +++ b/networks/bitcoin/src/crypto.rs @@ -40,14 +40,12 @@ mod frost_crypto { use bitcoin::hashes::{HashEngine, Hash, sha256::Hash as Sha256}; - use transcript::Transcript; - use k256::{elliptic_curve::ops::Reduce, U256, Scalar}; use frost::{ curve::{Ciphersuite, Secp256k1}, Participant, ThresholdKeys, ThresholdView, FrostError, - algorithm::{Hram as HramTrait, Algorithm, Schnorr as FrostSchnorr}, + algorithm::{Hram as HramTrait, Algorithm, IetfSchnorr as FrostSchnorr}, }; use super::*; @@ -82,16 +80,17 @@ mod frost_crypto { /// /// This must be used with a ThresholdKeys whose group key is even. If it is odd, this will panic. #[derive(Clone)] - pub struct Schnorr(FrostSchnorr); - impl Schnorr { + pub struct Schnorr(FrostSchnorr); + impl Schnorr { /// Construct a Schnorr algorithm continuing the specified transcript. - pub fn new(transcript: T) -> Schnorr { - Schnorr(FrostSchnorr::new(transcript)) + #[allow(clippy::new_without_default)] + pub fn new() -> Schnorr { + Schnorr(FrostSchnorr::ietf()) } } - impl Algorithm for Schnorr { - type Transcript = T; + impl Algorithm for Schnorr { + type Transcript = as Algorithm>::Transcript; type Addendum = (); type Signature = [u8; 64]; diff --git a/networks/bitcoin/src/tests/crypto.rs b/networks/bitcoin/src/tests/crypto.rs index cfc694f40..57a0eb3ee 100644 --- a/networks/bitcoin/src/tests/crypto.rs +++ b/networks/bitcoin/src/tests/crypto.rs @@ -3,7 +3,6 @@ use rand_core::OsRng; use secp256k1::{Secp256k1 as BContext, Message, schnorr::Signature}; use k256::Scalar; -use transcript::{Transcript, RecommendedTranscript}; use frost::{ curve::Secp256k1, Participant, @@ -25,8 +24,7 @@ fn test_algorithm() { *keys = keys.offset(Scalar::from(offset)); } - let algo = - Schnorr::::new(RecommendedTranscript::new(b"bitcoin-serai sign test")); + let algo = Schnorr::new(); let sig = sign( &mut OsRng, &algo, diff --git a/networks/bitcoin/src/wallet/mod.rs b/networks/bitcoin/src/wallet/mod.rs index 195182fff..1a0789585 100644 --- a/networks/bitcoin/src/wallet/mod.rs +++ b/networks/bitcoin/src/wallet/mod.rs @@ -22,7 +22,7 @@ use bitcoin::{ Block, }; #[cfg(feature = "std")] -use bitcoin::consensus::encode::Decodable; +use bitcoin::{hashes::Hash, consensus::encode::Decodable, TapTweakHash}; use crate::crypto::x_only; #[cfg(feature = "std")] @@ -33,12 +33,40 @@ mod send; #[cfg(feature = "std")] pub use send::*; -/// Tweak keys to ensure they're usable with Bitcoin. +/// Tweak keys to ensure they're usable with Bitcoin's Taproot upgrade. /// -/// Taproot keys, which these keys are used as, must be even. This offsets the keys until they're -/// even. +/// This adds an unspendable script path to the key, preventing any outputs received to this key +/// from being spent via a script. To have keys which have spendable script paths, further offsets +/// from this position must be used. +/// +/// After adding an unspendable script path, the key is incremented until its even. This means the +/// existence of the unspendable script path may not provable, without an understanding of the +/// algorithm used here. #[cfg(feature = "std")] pub fn tweak_keys(keys: &ThresholdKeys) -> ThresholdKeys { + // Adds the unspendable script path per + // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-23 + let keys = { + use k256::elliptic_curve::{ + bigint::{Encoding, U256}, + ops::Reduce, + group::GroupEncoding, + }; + let tweak_hash = TapTweakHash::hash(&keys.group_key().to_bytes().as_slice()[1 ..]); + /* + https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#cite_ref-13-0 states how the + bias is negligible. This reduction shouldn't ever occur, yet if it did, the script path + would be unusable due to a check the script path hash is less than the order. That doesn't + impact us as we don't want the script path to be usable. + */ + keys.offset(::F::reduce(U256::from_be_bytes( + *tweak_hash.to_raw_hash().as_ref(), + ))) + }; + + // This doesn't risk re-introducing a script path as you'd have to find a preimage for the tweak + // hash with whatever increment, or manipulate the key so that the tweak hash and increment + // equals the desired offset, yet manipulating the key would change the tweak hash let (_, offset) = make_even(keys.group_key()); keys.offset(Scalar::from(offset)) } @@ -142,6 +170,10 @@ impl Scanner { /// /// This means offsets are surjective, not bijective, and the order offsets are registered in /// may determine the validity of future offsets. + /// + /// The offsets registered must be securely generated. Arbitrary offsets may introduce a script + /// path into the output, allowing the output to be spent by satisfaction of an arbitrary script + /// (not by the signature of the key). pub fn register_offset(&mut self, mut offset: Scalar) -> Option { // This loop will terminate as soon as an even point is found, with any point having a ~50% // chance of being even diff --git a/networks/bitcoin/src/wallet/send.rs b/networks/bitcoin/src/wallet/send.rs index 9a723523a..276f536ed 100644 --- a/networks/bitcoin/src/wallet/send.rs +++ b/networks/bitcoin/src/wallet/send.rs @@ -7,9 +7,7 @@ use thiserror::Error; use rand_core::{RngCore, CryptoRng}; -use transcript::{Transcript, RecommendedTranscript}; - -use k256::{elliptic_curve::sec1::ToEncodedPoint, Scalar}; +use k256::Scalar; use frost::{curve::Secp256k1, Participant, ThresholdKeys, FrostError, sign::*}; use bitcoin::{ @@ -46,7 +44,7 @@ pub enum TransactionError { #[error("fee was too low to pass the default minimum fee rate")] TooLowFee, #[error("not enough funds for these payments")] - NotEnoughFunds, + NotEnoughFunds { inputs: u64, payments: u64, fee: u64 }, #[error("transaction was too large")] TooLargeTransaction, } @@ -215,7 +213,11 @@ impl SignableTransaction { } if input_sat < (payment_sat + needed_fee) { - Err(TransactionError::NotEnoughFunds)?; + Err(TransactionError::NotEnoughFunds { + inputs: input_sat, + payments: payment_sat, + fee: needed_fee, + })?; } // If there's a change address, check if there's change to give it @@ -260,49 +262,23 @@ impl SignableTransaction { res } - /// Returns the outputs this transaction will create. - pub fn outputs(&self) -> &[TxOut] { - &self.tx.output + /// Returns the transaction, sans witness, this will create if signed. + pub fn transaction(&self) -> &Transaction { + &self.tx } /// Create a multisig machine for this transaction. /// /// Returns None if the wrong keys are used. - pub fn multisig( - self, - keys: &ThresholdKeys, - mut transcript: RecommendedTranscript, - ) -> Option { - transcript.domain_separate(b"bitcoin_transaction"); - transcript.append_message(b"root_key", keys.group_key().to_encoded_point(true).as_bytes()); - - // Transcript the inputs and outputs - let tx = &self.tx; - for input in &tx.input { - transcript.append_message(b"input_hash", input.previous_output.txid); - transcript.append_message(b"input_output_index", input.previous_output.vout.to_le_bytes()); - } - for payment in &tx.output { - transcript.append_message(b"output_script", payment.script_pubkey.as_bytes()); - transcript.append_message(b"output_amount", payment.value.to_sat().to_le_bytes()); - } - + pub fn multisig(self, keys: &ThresholdKeys) -> Option { let mut sigs = vec![]; - for i in 0 .. tx.input.len() { - let mut transcript = transcript.clone(); - // This unwrap is safe since any transaction with this many inputs violates the maximum - // size allowed under standards, which this lib will error on creation of - transcript.append_message(b"signing_input", u32::try_from(i).unwrap().to_le_bytes()); - + for i in 0 .. self.tx.input.len() { let offset = keys.clone().offset(self.offsets[i]); if p2tr_script_buf(offset.group_key())? != self.prevouts[i].script_pubkey { None?; } - sigs.push(AlgorithmMachine::new( - Schnorr::new(transcript), - keys.clone().offset(self.offsets[i]), - )); + sigs.push(AlgorithmMachine::new(Schnorr::new(), keys.clone().offset(self.offsets[i]))); } Some(TransactionMachine { tx: self, sigs }) @@ -315,7 +291,7 @@ impl SignableTransaction { /// This will panic if either `cache` is called or the message isn't empty. pub struct TransactionMachine { tx: SignableTransaction, - sigs: Vec>>, + sigs: Vec>, } impl PreprocessMachine for TransactionMachine { @@ -344,7 +320,7 @@ impl PreprocessMachine for TransactionMachine { pub struct TransactionSignMachine { tx: SignableTransaction, - sigs: Vec>>, + sigs: Vec>, } impl SignMachine for TransactionSignMachine { @@ -424,7 +400,7 @@ impl SignMachine for TransactionSignMachine { pub struct TransactionSignatureMachine { tx: Transaction, - sigs: Vec>>, + sigs: Vec>, } impl SignatureMachine for TransactionSignatureMachine { diff --git a/networks/bitcoin/tests/wallet.rs b/networks/bitcoin/tests/wallet.rs index 4b77e61a4..45371414b 100644 --- a/networks/bitcoin/tests/wallet.rs +++ b/networks/bitcoin/tests/wallet.rs @@ -2,8 +2,6 @@ use std::collections::HashMap; use rand_core::{RngCore, OsRng}; -use transcript::{Transcript, RecommendedTranscript}; - use k256::{ elliptic_curve::{ group::{ff::Field, Group}, @@ -94,46 +92,11 @@ fn sign( ) -> Transaction { let mut machines = HashMap::new(); for i in (1 ..= THRESHOLD).map(|i| Participant::new(i).unwrap()) { - machines.insert( - i, - tx.clone() - .multisig(&keys[&i].clone(), RecommendedTranscript::new(b"bitcoin-serai Test Transaction")) - .unwrap(), - ); + machines.insert(i, tx.clone().multisig(&keys[&i].clone()).unwrap()); } sign_without_caching(&mut OsRng, machines, &[]) } -#[test] -fn test_tweak_keys() { - let mut even = false; - let mut odd = false; - - // Generate keys until we get an even set and an odd set - while !(even && odd) { - let mut keys = key_gen(&mut OsRng).drain().next().unwrap().1; - if is_even(keys.group_key()) { - // Tweaking should do nothing - assert_eq!(tweak_keys(&keys).group_key(), keys.group_key()); - - even = true; - } else { - let tweaked = tweak_keys(&keys).group_key(); - assert_ne!(tweaked, keys.group_key()); - // Tweaking should produce an even key - assert!(is_even(tweaked)); - - // Verify it uses the smallest possible offset - while keys.group_key().to_encoded_point(true).tag() == Tag::CompressedOddY { - keys = keys.offset(Scalar::ONE); - } - assert_eq!(tweaked, keys.group_key()); - - odd = true; - } - } -} - async_sequential! { async fn test_scanner() { // Test Scanners are creatable for even keys. @@ -232,10 +195,10 @@ async_sequential! { Err(TransactionError::TooLowFee), ); - assert_eq!( + assert!(matches!( SignableTransaction::new(inputs.clone(), &[(addr(), inputs[0].value() * 2)], None, None, FEE), - Err(TransactionError::NotEnoughFunds), - ); + Err(TransactionError::NotEnoughFunds { .. }), + )); assert_eq!( SignableTransaction::new(inputs, &vec![(addr(), 1000); 10000], None, None, FEE), diff --git a/networks/monero/rpc/src/lib.rs b/networks/monero/rpc/src/lib.rs index 4c5055ccc..3c8d337a9 100644 --- a/networks/monero/rpc/src/lib.rs +++ b/networks/monero/rpc/src/lib.rs @@ -249,7 +249,7 @@ fn rpc_point(point: &str) -> Result { /// While no implementors are directly provided, [monero-simple-request-rpc]( /// https://github.com/serai-dex/serai/tree/develop/networks/monero/rpc/simple-request /// ) is recommended. -pub trait Rpc: Sync + Clone + Debug { +pub trait Rpc: Sync + Clone { /// Perform a POST request to the specified route with the specified body. /// /// The implementor is left to handle anything such as authentication. @@ -1003,10 +1003,10 @@ pub trait Rpc: Sync + Clone + Debug { /// An implementation is provided for any satisfier of `Rpc`. It is not recommended to use an `Rpc` /// object to satisfy this. This should be satisfied by a local store of the output distribution, /// both for performance and to prevent potential attacks a remote node can perform. -pub trait DecoyRpc: Sync + Clone + Debug { +pub trait DecoyRpc: Sync { /// Get the height the output distribution ends at. /// - /// This is equivalent to the hight of the blockchain it's for. This is intended to be cheaper + /// This is equivalent to the height of the blockchain it's for. This is intended to be cheaper /// than fetching the entire output distribution. fn get_output_distribution_end_height( &self, diff --git a/networks/monero/src/block.rs b/networks/monero/src/block.rs index 62a77f8b7..15a8d1fc5 100644 --- a/networks/monero/src/block.rs +++ b/networks/monero/src/block.rs @@ -79,10 +79,13 @@ pub struct Block { } impl Block { - /// The zero-index position of this block within the blockchain. + /// The zero-indexed position of this block within the blockchain. /// /// This information comes from the Block's miner transaction. If the miner transaction isn't - /// structed as expected, this will return None. + /// structed as expected, this will return None. This will return Some for any Block which would + /// pass the consensus rules. + // https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623 + // /src/cryptonote_core/blockchain.cpp#L1365-L1382 pub fn number(&self) -> Option { match &self.miner_transaction { Transaction::V1 { prefix, .. } | Transaction::V2 { prefix, .. } => { diff --git a/networks/monero/wallet/polyseed/Cargo.toml b/networks/monero/wallet/polyseed/Cargo.toml deleted file mode 100644 index 388614814..000000000 --- a/networks/monero/wallet/polyseed/Cargo.toml +++ /dev/null @@ -1,46 +0,0 @@ -[package] -name = "polyseed" -version = "0.1.0" -description = "Rust implementation of Polyseed" -license = "MIT" -repository = "https://github.com/serai-dex/serai/tree/develop/networks/monero/wallet/polyseed" -authors = ["Luke Parker "] -edition = "2021" -rust-version = "1.80" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[lints] -workspace = true - -[dependencies] -std-shims = { path = "../../../../common/std-shims", version = "^0.1.1", default-features = false } - -thiserror = { version = "1", default-features = false, optional = true } - -subtle = { version = "^2.4", default-features = false } -zeroize = { version = "^1.5", default-features = false, features = ["zeroize_derive"] } -rand_core = { version = "0.6", default-features = false } - -sha3 = { version = "0.10", default-features = false } -pbkdf2 = { version = "0.12", features = ["simple"], default-features = false } - -[dev-dependencies] -hex = { version = "0.4", default-features = false, features = ["std"] } - -[features] -std = [ - "std-shims/std", - - "thiserror", - - "subtle/std", - "zeroize/std", - "rand_core/std", - - "sha3/std", - "pbkdf2/std", -] -default = ["std"] diff --git a/networks/monero/wallet/polyseed/LICENSE b/networks/monero/wallet/polyseed/LICENSE deleted file mode 100644 index 91d893c11..000000000 --- a/networks/monero/wallet/polyseed/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022-2024 Luke Parker - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/networks/monero/wallet/polyseed/README.md b/networks/monero/wallet/polyseed/README.md deleted file mode 100644 index 4869bba05..000000000 --- a/networks/monero/wallet/polyseed/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Polyseed - -Rust implementation of [Polyseed](https://github.com/tevador/polyseed). - -This library is usable under no-std when the `std` feature (on by default) is -disabled. - -### Cargo Features - -- `std` (on by default): Enables `std` (and with it, more efficient internal - implementations). diff --git a/networks/monero/wallet/polyseed/src/lib.rs b/networks/monero/wallet/polyseed/src/lib.rs deleted file mode 100644 index 8163d3c46..000000000 --- a/networks/monero/wallet/polyseed/src/lib.rs +++ /dev/null @@ -1,473 +0,0 @@ -#![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![doc = include_str!("../README.md")] -#![deny(missing_docs)] -#![cfg_attr(not(feature = "std"), no_std)] - -use core::fmt; -use std_shims::{sync::LazyLock, string::String, collections::HashMap}; -#[cfg(feature = "std")] -use std::time::{SystemTime, UNIX_EPOCH}; - -use subtle::ConstantTimeEq; -use zeroize::{Zeroize, Zeroizing, ZeroizeOnDrop}; -use rand_core::{RngCore, CryptoRng}; - -use sha3::Sha3_256; -use pbkdf2::pbkdf2_hmac; - -#[cfg(test)] -mod tests; - -// Features -const FEATURE_BITS: u8 = 5; -#[allow(dead_code)] -const INTERNAL_FEATURES: u8 = 2; -const USER_FEATURES: u8 = 3; - -const USER_FEATURES_MASK: u8 = (1 << USER_FEATURES) - 1; -const ENCRYPTED_MASK: u8 = 1 << 4; -const RESERVED_FEATURES_MASK: u8 = ((1 << FEATURE_BITS) - 1) ^ ENCRYPTED_MASK; - -fn user_features(features: u8) -> u8 { - features & USER_FEATURES_MASK -} - -fn polyseed_features_supported(features: u8) -> bool { - (features & RESERVED_FEATURES_MASK) == 0 -} - -// Dates -const DATE_BITS: u8 = 10; -const DATE_MASK: u16 = (1u16 << DATE_BITS) - 1; -const POLYSEED_EPOCH: u64 = 1635768000; // 1st November 2021 12:00 UTC -const TIME_STEP: u64 = 2629746; // 30.436875 days = 1/12 of the Gregorian year - -// After ~85 years, this will roll over. -fn birthday_encode(time: u64) -> u16 { - u16::try_from((time.saturating_sub(POLYSEED_EPOCH) / TIME_STEP) & u64::from(DATE_MASK)) - .expect("value masked by 2**10 - 1 didn't fit into a u16") -} - -fn birthday_decode(birthday: u16) -> u64 { - POLYSEED_EPOCH + (u64::from(birthday) * TIME_STEP) -} - -// Polyseed parameters -const SECRET_BITS: usize = 150; - -const BITS_PER_BYTE: usize = 8; -const SECRET_SIZE: usize = SECRET_BITS.div_ceil(BITS_PER_BYTE); // 19 -const CLEAR_BITS: usize = (SECRET_SIZE * BITS_PER_BYTE) - SECRET_BITS; // 2 - -// Polyseed calls this CLEAR_MASK and has a very complicated formula for this fundamental -// equivalency -#[allow(clippy::cast_possible_truncation)] -const LAST_BYTE_SECRET_BITS_MASK: u8 = ((1 << (BITS_PER_BYTE - CLEAR_BITS)) - 1) as u8; - -const SECRET_BITS_PER_WORD: usize = 10; - -// The amount of words in a seed. -const POLYSEED_LENGTH: usize = 16; -// Amount of characters each word must have if trimmed -pub(crate) const PREFIX_LEN: usize = 4; - -const POLY_NUM_CHECK_DIGITS: usize = 1; -const DATA_WORDS: usize = POLYSEED_LENGTH - POLY_NUM_CHECK_DIGITS; - -// Polynomial -const GF_BITS: usize = 11; -const POLYSEED_MUL2_TABLE: [u16; 8] = [5, 7, 1, 3, 13, 15, 9, 11]; - -type Poly = [u16; POLYSEED_LENGTH]; - -fn elem_mul2(x: u16) -> u16 { - if x < 1024 { - return 2 * x; - } - POLYSEED_MUL2_TABLE[usize::from(x % 8)] + (16 * ((x - 1024) / 8)) -} - -fn poly_eval(poly: &Poly) -> u16 { - // Horner's method at x = 2 - let mut result = poly[POLYSEED_LENGTH - 1]; - for i in (0 .. (POLYSEED_LENGTH - 1)).rev() { - result = elem_mul2(result) ^ poly[i]; - } - result -} - -// Key gen parameters -const POLYSEED_SALT: &[u8] = b"POLYSEED key"; -const POLYSEED_KEYGEN_ITERATIONS: u32 = 10000; - -// Polyseed technically supports multiple coins, and the value for Monero is 0 -// See: https://github.com/tevador/polyseed/blob/dfb05d8edb682b0e8f743b1b70c9131712ff4157 -// /include/polyseed.h#L57 -const COIN: u16 = 0; - -/// An error when working with a Polyseed. -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -#[cfg_attr(feature = "std", derive(thiserror::Error))] -pub enum PolyseedError { - /// The seed was invalid. - #[cfg_attr(feature = "std", error("invalid seed"))] - InvalidSeed, - /// The entropy was invalid. - #[cfg_attr(feature = "std", error("invalid entropy"))] - InvalidEntropy, - /// The checksum did not match the data. - #[cfg_attr(feature = "std", error("invalid checksum"))] - InvalidChecksum, - /// Unsupported feature bits were set. - #[cfg_attr(feature = "std", error("unsupported features"))] - UnsupportedFeatures, -} - -/// Language options for Polyseed. -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Zeroize)] -pub enum Language { - /// English language option. - English, - /// Spanish language option. - Spanish, - /// French language option. - French, - /// Italian language option. - Italian, - /// Japanese language option. - Japanese, - /// Korean language option. - Korean, - /// Czech language option. - Czech, - /// Portuguese language option. - Portuguese, - /// Simplified Chinese language option. - ChineseSimplified, - /// Traditional Chinese language option. - ChineseTraditional, -} - -struct WordList { - words: &'static [&'static str], - has_prefix: bool, - has_accent: bool, -} - -impl WordList { - fn new(words: &'static [&'static str], has_prefix: bool, has_accent: bool) -> WordList { - let res = WordList { words, has_prefix, has_accent }; - // This is needed for a later unwrap to not fails - assert!(words.len() < usize::from(u16::MAX)); - res - } -} - -static LANGUAGES: LazyLock> = LazyLock::new(|| { - HashMap::from([ - (Language::Czech, WordList::new(include!("./words/cs.rs"), true, false)), - (Language::French, WordList::new(include!("./words/fr.rs"), true, true)), - (Language::Korean, WordList::new(include!("./words/ko.rs"), false, false)), - (Language::English, WordList::new(include!("./words/en.rs"), true, false)), - (Language::Italian, WordList::new(include!("./words/it.rs"), true, false)), - (Language::Spanish, WordList::new(include!("./words/es.rs"), true, true)), - (Language::Japanese, WordList::new(include!("./words/ja.rs"), false, false)), - (Language::Portuguese, WordList::new(include!("./words/pt.rs"), true, false)), - ( - Language::ChineseSimplified, - WordList::new(include!("./words/zh_simplified.rs"), false, false), - ), - ( - Language::ChineseTraditional, - WordList::new(include!("./words/zh_traditional.rs"), false, false), - ), - ]) -}); - -/// A Polyseed. -#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)] -pub struct Polyseed { - language: Language, - features: u8, - birthday: u16, - entropy: Zeroizing<[u8; 32]>, - checksum: u16, -} - -impl fmt::Debug for Polyseed { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("Polyseed").finish_non_exhaustive() - } -} - -fn valid_entropy(entropy: &Zeroizing<[u8; 32]>) -> bool { - // Last byte of the entropy should only use certain bits - let mut res = - entropy[SECRET_SIZE - 1].ct_eq(&(entropy[SECRET_SIZE - 1] & LAST_BYTE_SECRET_BITS_MASK)); - // Last 13 bytes of the buffer should be unused - for b in SECRET_SIZE .. entropy.len() { - res &= entropy[b].ct_eq(&0); - } - res.into() -} - -impl Polyseed { - // TODO: Clean this - fn to_poly(&self) -> Poly { - let mut extra_bits = u32::from(FEATURE_BITS + DATE_BITS); - let extra_val = (u16::from(self.features) << DATE_BITS) | self.birthday; - - let mut entropy_idx = 0; - let mut secret_bits = BITS_PER_BYTE; - let mut seed_rem_bits = SECRET_BITS - BITS_PER_BYTE; - - let mut poly = [0; POLYSEED_LENGTH]; - for i in 0 .. DATA_WORDS { - extra_bits -= 1; - - let mut word_bits = 0; - let mut word_val = 0; - while word_bits < SECRET_BITS_PER_WORD { - if secret_bits == 0 { - entropy_idx += 1; - secret_bits = seed_rem_bits.min(BITS_PER_BYTE); - seed_rem_bits -= secret_bits; - } - let chunk_bits = secret_bits.min(SECRET_BITS_PER_WORD - word_bits); - secret_bits -= chunk_bits; - word_bits += chunk_bits; - word_val <<= chunk_bits; - word_val |= - (u16::from(self.entropy[entropy_idx]) >> secret_bits) & ((1u16 << chunk_bits) - 1); - } - - word_val <<= 1; - word_val |= (extra_val >> extra_bits) & 1; - poly[POLY_NUM_CHECK_DIGITS + i] = word_val; - } - - poly - } - - fn from_internal( - language: Language, - masked_features: u8, - encoded_birthday: u16, - entropy: Zeroizing<[u8; 32]>, - ) -> Result { - if !polyseed_features_supported(masked_features) { - Err(PolyseedError::UnsupportedFeatures)?; - } - - if !valid_entropy(&entropy) { - Err(PolyseedError::InvalidEntropy)?; - } - - let mut res = Polyseed { - language, - birthday: encoded_birthday, - features: masked_features, - entropy, - checksum: 0, - }; - res.checksum = poly_eval(&res.to_poly()); - Ok(res) - } - - /// Create a new `Polyseed` with specific internals. - /// - /// `birthday` is defined in seconds since the epoch. - pub fn from( - language: Language, - features: u8, - birthday: u64, - entropy: Zeroizing<[u8; 32]>, - ) -> Result { - Self::from_internal(language, user_features(features), birthday_encode(birthday), entropy) - } - - /// Create a new `Polyseed`. - /// - /// This uses the system's time for the birthday, if available, else 0. - pub fn new(rng: &mut R, language: Language) -> Polyseed { - // Get the birthday - #[cfg(feature = "std")] - let birthday = - SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or(core::time::Duration::ZERO).as_secs(); - #[cfg(not(feature = "std"))] - let birthday = 0; - - // Derive entropy - let mut entropy = Zeroizing::new([0; 32]); - rng.fill_bytes(entropy.as_mut()); - entropy[SECRET_SIZE ..].fill(0); - entropy[SECRET_SIZE - 1] &= LAST_BYTE_SECRET_BITS_MASK; - - Self::from(language, 0, birthday, entropy).unwrap() - } - - /// Create a new `Polyseed` from a String. - #[allow(clippy::needless_pass_by_value)] - pub fn from_string(lang: Language, seed: Zeroizing) -> Result { - // Decode the seed into its polynomial coefficients - let mut poly = [0; POLYSEED_LENGTH]; - - // Validate words are in the lang word list - let lang_word_list: &WordList = &LANGUAGES[&lang]; - for (i, word) in seed.split_whitespace().enumerate() { - // Find the word's index - fn check_if_matches, I: Iterator>( - has_prefix: bool, - mut lang_words: I, - word: &str, - ) -> Option { - if has_prefix { - // Get the position of the word within the iterator - // Doesn't use starts_with and some words are substrs of others, leading to false - // positives - let mut get_position = || { - lang_words.position(|lang_word| { - let mut lang_word = lang_word.as_ref().chars(); - let mut word = word.chars(); - - let mut res = true; - for _ in 0 .. PREFIX_LEN { - res &= lang_word.next() == word.next(); - } - res - }) - }; - let res = get_position(); - // If another word has this prefix, don't call it a match - if get_position().is_some() { - return None; - } - res - } else { - lang_words.position(|lang_word| lang_word.as_ref() == word) - } - } - - let Some(coeff) = (if lang_word_list.has_accent { - let ascii = |word: &str| word.chars().filter(char::is_ascii).collect::(); - check_if_matches( - lang_word_list.has_prefix, - lang_word_list.words.iter().map(|lang_word| ascii(lang_word)), - &ascii(word), - ) - } else { - check_if_matches(lang_word_list.has_prefix, lang_word_list.words.iter(), word) - }) else { - Err(PolyseedError::InvalidSeed)? - }; - - // WordList asserts the word list length is less than u16::MAX - poly[i] = u16::try_from(coeff).expect("coeff exceeded u16"); - } - - // xor out the coin - poly[POLY_NUM_CHECK_DIGITS] ^= COIN; - - // Validate the checksum - if poly_eval(&poly) != 0 { - Err(PolyseedError::InvalidChecksum)?; - } - - // Convert the polynomial into entropy - let mut entropy = Zeroizing::new([0; 32]); - - let mut extra = 0; - - let mut entropy_idx = 0; - let mut entropy_bits = 0; - - let checksum = poly[0]; - for mut word_val in poly.into_iter().skip(POLY_NUM_CHECK_DIGITS) { - // Parse the bottom bit, which is one of the bits of extra - // This iterates for less than 16 iters, meaning this won't drop any bits - extra <<= 1; - extra |= word_val & 1; - word_val >>= 1; - - // 10 bits per word creates a [8, 2], [6, 4], [4, 6], [2, 8] cycle - // 15 % 4 is 3, leaving 2 bits off, and 152 (19 * 8) - 2 is 150, the amount of bits in the - // secret - let mut word_bits = GF_BITS - 1; - while word_bits > 0 { - if entropy_bits == BITS_PER_BYTE { - entropy_idx += 1; - entropy_bits = 0; - } - let chunk_bits = word_bits.min(BITS_PER_BYTE - entropy_bits); - word_bits -= chunk_bits; - let chunk_mask = (1u16 << chunk_bits) - 1; - if chunk_bits < BITS_PER_BYTE { - entropy[entropy_idx] <<= chunk_bits; - } - entropy[entropy_idx] |= - u8::try_from((word_val >> word_bits) & chunk_mask).expect("chunk exceeded u8"); - entropy_bits += chunk_bits; - } - } - - let birthday = extra & DATE_MASK; - // extra is contained to u16, and DATE_BITS > 8 - let features = - u8::try_from(extra >> DATE_BITS).expect("couldn't convert extra >> DATE_BITS to u8"); - - let res = Self::from_internal(lang, features, birthday, entropy); - if let Ok(res) = res.as_ref() { - debug_assert_eq!(res.checksum, checksum); - } - res - } - - /// When this seed was created, defined in seconds since the epoch. - pub fn birthday(&self) -> u64 { - birthday_decode(self.birthday) - } - - /// This seed's features. - pub fn features(&self) -> u8 { - self.features - } - - /// This seed's entropy. - pub fn entropy(&self) -> &Zeroizing<[u8; 32]> { - &self.entropy - } - - /// The key derived from this seed. - pub fn key(&self) -> Zeroizing<[u8; 32]> { - let mut key = Zeroizing::new([0; 32]); - pbkdf2_hmac::( - self.entropy.as_slice(), - POLYSEED_SALT, - POLYSEED_KEYGEN_ITERATIONS, - key.as_mut(), - ); - key - } - - /// The String representation of this seed. - pub fn to_string(&self) -> Zeroizing { - // Encode the polynomial with the existing checksum - let mut poly = self.to_poly(); - poly[0] = self.checksum; - - // Embed the coin - poly[POLY_NUM_CHECK_DIGITS] ^= COIN; - - // Output words - let mut seed = Zeroizing::new(String::new()); - let words = &LANGUAGES[&self.language].words; - for i in 0 .. poly.len() { - seed.push_str(words[usize::from(poly[i])]); - if i < poly.len() - 1 { - seed.push(' '); - } - } - - seed - } -} diff --git a/networks/monero/wallet/polyseed/src/tests.rs b/networks/monero/wallet/polyseed/src/tests.rs deleted file mode 100644 index 4913c2173..000000000 --- a/networks/monero/wallet/polyseed/src/tests.rs +++ /dev/null @@ -1,218 +0,0 @@ -use zeroize::Zeroizing; -use rand_core::OsRng; - -use crate::*; - -#[test] -fn test_polyseed() { - struct Vector { - language: Language, - seed: String, - entropy: String, - birthday: u64, - has_prefix: bool, - has_accent: bool, - } - - let vectors = [ - Vector { - language: Language::English, - seed: "raven tail swear infant grief assist regular lamp \ - duck valid someone little harsh puppy airport language" - .into(), - entropy: "dd76e7359a0ded37cd0ff0f3c829a5ae01673300000000000000000000000000".into(), - birthday: 1638446400, - has_prefix: true, - has_accent: false, - }, - Vector { - language: Language::Spanish, - seed: "eje fin parte célebre tabú pestaña lienzo puma \ - prisión hora regalo lengua existir lápiz lote sonoro" - .into(), - entropy: "5a2b02df7db21fcbe6ec6df137d54c7b20fd2b00000000000000000000000000".into(), - birthday: 3118651200, - has_prefix: true, - has_accent: true, - }, - Vector { - language: Language::French, - seed: "valable arracher décaler jeudi amusant dresser mener épaissir risible \ - prouesse réserve ampleur ajuster muter caméra enchère" - .into(), - entropy: "11cfd870324b26657342c37360c424a14a050b00000000000000000000000000".into(), - birthday: 1679314966, - has_prefix: true, - has_accent: true, - }, - Vector { - language: Language::Italian, - seed: "caduco midollo copione meninge isotopo illogico riflesso tartaruga fermento \ - olandese normale tristezza episodio voragine forbito achille" - .into(), - entropy: "7ecc57c9b4652d4e31428f62bec91cfd55500600000000000000000000000000".into(), - birthday: 1679316358, - has_prefix: true, - has_accent: false, - }, - Vector { - language: Language::Portuguese, - seed: "caverna custear azedo adeus senador apertada sedoso omitir \ - sujeito aurora videira molho cartaz gesso dentista tapar" - .into(), - entropy: "45473063711376cae38f1b3eba18c874124e1d00000000000000000000000000".into(), - birthday: 1679316657, - has_prefix: true, - has_accent: false, - }, - Vector { - language: Language::Czech, - seed: "usmrtit nora dotaz komunita zavalit funkce mzda sotva akce \ - vesta kabel herna stodola uvolnit ustrnout email" - .into(), - entropy: "7ac8a4efd62d9c3c4c02e350d32326df37821c00000000000000000000000000".into(), - birthday: 1679316898, - has_prefix: true, - has_accent: false, - }, - Vector { - language: Language::Korean, - seed: "전망 선풍기 국제 무궁화 설사 기름 이론적 해안 절망 예선 \ - 지우개 보관 절망 말기 시각 귀신" - .into(), - entropy: "684663fda420298f42ed94b2c512ed38ddf12b00000000000000000000000000".into(), - birthday: 1679317073, - has_prefix: false, - has_accent: false, - }, - Vector { - language: Language::Japanese, - seed: "うちあわせ ちつじょ つごう しはい けんこう とおる てみやげ はんとし たんとう \ - といれ おさない おさえる むかう ぬぐう なふだ せまる" - .into(), - entropy: "94e6665518a6286c6e3ba508a2279eb62b771f00000000000000000000000000".into(), - birthday: 1679318722, - has_prefix: false, - has_accent: false, - }, - Vector { - language: Language::ChineseTraditional, - seed: "亂 挖 斤 柄 代 圈 枝 轄 魯 論 函 開 勘 番 榮 壁".into(), - entropy: "b1594f585987ab0fd5a31da1f0d377dae5283f00000000000000000000000000".into(), - birthday: 1679426433, - has_prefix: false, - has_accent: false, - }, - Vector { - language: Language::ChineseSimplified, - seed: "啊 百 族 府 票 划 伪 仓 叶 虾 借 溜 晨 左 等 鬼".into(), - entropy: "21cdd366f337b89b8d1bc1df9fe73047c22b0300000000000000000000000000".into(), - birthday: 1679426817, - has_prefix: false, - has_accent: false, - }, - // The following seed requires the language specification in order to calculate - // a single valid checksum - Vector { - language: Language::Spanish, - seed: "impo sort usua cabi venu nobl oliv clim \ - cont barr marc auto prod vaca torn fati" - .into(), - entropy: "dbfce25fe09b68a340e01c62417eeef43ad51800000000000000000000000000".into(), - birthday: 1701511650, - has_prefix: true, - has_accent: true, - }, - ]; - - for vector in vectors { - let add_whitespace = |mut seed: String| { - seed.push(' '); - seed - }; - - let seed_without_accents = |seed: &str| { - seed - .split_whitespace() - .map(|w| w.chars().filter(char::is_ascii).collect::()) - .collect::>() - .join(" ") - }; - - let trim_seed = |seed: &str| { - let seed_to_trim = - if vector.has_accent { seed_without_accents(seed) } else { seed.to_string() }; - seed_to_trim - .split_whitespace() - .map(|w| { - let mut ascii = 0; - let mut to_take = w.len(); - for (i, char) in w.chars().enumerate() { - if char.is_ascii() { - ascii += 1; - } - if ascii == PREFIX_LEN { - // +1 to include this character, which put us at the prefix length - to_take = i + 1; - break; - } - } - w.chars().take(to_take).collect::() - }) - .collect::>() - .join(" ") - }; - - // String -> Seed - println!("{}. language: {:?}, seed: {}", line!(), vector.language, vector.seed.clone()); - let seed = Polyseed::from_string(vector.language, Zeroizing::new(vector.seed.clone())).unwrap(); - let trim = trim_seed(&vector.seed); - let add_whitespace = add_whitespace(vector.seed.clone()); - let seed_without_accents = seed_without_accents(&vector.seed); - - // Make sure a version with added whitespace still works - let whitespaced_seed = - Polyseed::from_string(vector.language, Zeroizing::new(add_whitespace)).unwrap(); - assert_eq!(seed, whitespaced_seed); - // Check trimmed versions works - if vector.has_prefix { - let trimmed_seed = Polyseed::from_string(vector.language, Zeroizing::new(trim)).unwrap(); - assert_eq!(seed, trimmed_seed); - } - // Check versions without accents work - if vector.has_accent { - let seed_without_accents = - Polyseed::from_string(vector.language, Zeroizing::new(seed_without_accents)).unwrap(); - assert_eq!(seed, seed_without_accents); - } - - let entropy = Zeroizing::new(hex::decode(vector.entropy).unwrap().try_into().unwrap()); - assert_eq!(*seed.entropy(), entropy); - assert!(seed.birthday().abs_diff(vector.birthday) < TIME_STEP); - - // Entropy -> Seed - let from_entropy = Polyseed::from(vector.language, 0, seed.birthday(), entropy).unwrap(); - assert_eq!(seed.to_string(), from_entropy.to_string()); - - // Check against ourselves - { - let seed = Polyseed::new(&mut OsRng, vector.language); - println!("{}. seed: {}", line!(), *seed.to_string()); - assert_eq!(seed, Polyseed::from_string(vector.language, seed.to_string()).unwrap()); - assert_eq!( - seed, - Polyseed::from(vector.language, 0, seed.birthday(), seed.entropy().clone(),).unwrap() - ); - } - } -} - -#[test] -fn test_invalid_polyseed() { - // This seed includes unsupported features bits and should error on decode - let seed = "include domain claim resemble urban hire lunch bird \ - crucial fire best wife ring warm ignore model" - .into(); - let res = Polyseed::from_string(Language::English, Zeroizing::new(seed)); - assert_eq!(res, Err(PolyseedError::UnsupportedFeatures)); -} diff --git a/networks/monero/wallet/polyseed/src/words/cs.rs b/networks/monero/wallet/polyseed/src/words/cs.rs deleted file mode 100644 index aab4b8d46..000000000 --- a/networks/monero/wallet/polyseed/src/words/cs.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "abdikace", - "abeceda", - "adresa", - "agrese", - "akce", - "aktovka", - "alej", - "alkohol", - "amputace", - "ananas", - "andulka", - "anekdota", - "anketa", - "antika", - "anulovat", - "archa", - "arogance", - "asfalt", - "asistent", - "aspirace", - "astma", - "astronom", - "atlas", - "atletika", - "atol", - "autobus", - "azyl", - "babka", - "bachor", - "bacil", - "baculka", - "badatel", - "bageta", - "bagr", - "bahno", - "bakterie", - "balada", - "baletka", - "balkon", - "balonek", - "balvan", - "balza", - "bambus", - "bankomat", - "barbar", - "baret", - "barman", - "baroko", - "barva", - "baterka", - "batoh", - "bavlna", - "bazalka", - "bazilika", - "bazuka", - "bedna", - "beran", - "beseda", - "bestie", - "beton", - "bezinka", - "bezmoc", - "beztak", - "bicykl", - "bidlo", - "biftek", - "bikiny", - "bilance", - "biograf", - "biolog", - "bitva", - "bizon", - "blahobyt", - "blatouch", - "blecha", - "bledule", - "blesk", - "blikat", - "blizna", - "blokovat", - "bloudit", - "blud", - "bobek", - "bobr", - "bodlina", - "bodnout", - "bohatost", - "bojkot", - "bojovat", - "bokorys", - "bolest", - "borec", - "borovice", - "bota", - "boubel", - "bouchat", - "bouda", - "boule", - "bourat", - "boxer", - "bradavka", - "brambora", - "branka", - "bratr", - "brepta", - "briketa", - "brko", - "brloh", - "bronz", - "broskev", - "brunetka", - "brusinka", - "brzda", - "brzy", - "bublina", - "bubnovat", - "buchta", - "buditel", - "budka", - "budova", - "bufet", - "bujarost", - "bukvice", - "buldok", - "bulva", - "bunda", - "bunkr", - "burza", - "butik", - "buvol", - "buzola", - "bydlet", - "bylina", - "bytovka", - "bzukot", - "capart", - "carevna", - "cedr", - "cedule", - "cejch", - "cejn", - "cela", - "celer", - "celkem", - "celnice", - "cenina", - "cennost", - "cenovka", - "centrum", - "cenzor", - "cestopis", - "cetka", - "chalupa", - "chapadlo", - "charita", - "chata", - "chechtat", - "chemie", - "chichot", - "chirurg", - "chlad", - "chleba", - "chlubit", - "chmel", - "chmura", - "chobot", - "chochol", - "chodba", - "cholera", - "chomout", - "chopit", - "choroba", - "chov", - "chrapot", - "chrlit", - "chrt", - "chrup", - "chtivost", - "chudina", - "chutnat", - "chvat", - "chvilka", - "chvost", - "chyba", - "chystat", - "chytit", - "cibule", - "cigareta", - "cihelna", - "cihla", - "cinkot", - "cirkus", - "cisterna", - "citace", - "citrus", - "cizinec", - "cizost", - "clona", - "cokoliv", - "couvat", - "ctitel", - "ctnost", - "cudnost", - "cuketa", - "cukr", - "cupot", - "cvaknout", - "cval", - "cvik", - "cvrkot", - "cyklista", - "daleko", - "dareba", - "datel", - "datum", - "dcera", - "debata", - "dechovka", - "decibel", - "deficit", - "deflace", - "dekl", - "dekret", - "demokrat", - "deprese", - "derby", - "deska", - "detektiv", - "dikobraz", - "diktovat", - "dioda", - "diplom", - "disk", - "displej", - "divadlo", - "divoch", - "dlaha", - "dlouho", - "dluhopis", - "dnes", - "dobro", - "dobytek", - "docent", - "dochutit", - "dodnes", - "dohled", - "dohoda", - "dohra", - "dojem", - "dojnice", - "doklad", - "dokola", - "doktor", - "dokument", - "dolar", - "doleva", - "dolina", - "doma", - "dominant", - "domluvit", - "domov", - "donutit", - "dopad", - "dopis", - "doplnit", - "doposud", - "doprovod", - "dopustit", - "dorazit", - "dorost", - "dort", - "dosah", - "doslov", - "dostatek", - "dosud", - "dosyta", - "dotaz", - "dotek", - "dotknout", - "doufat", - "doutnat", - "dovozce", - "dozadu", - "doznat", - "dozorce", - "drahota", - "drak", - "dramatik", - "dravec", - "draze", - "drdol", - "drobnost", - "drogerie", - "drozd", - "drsnost", - "drtit", - "drzost", - "duben", - "duchovno", - "dudek", - "duha", - "duhovka", - "dusit", - "dusno", - "dutost", - "dvojice", - "dvorec", - "dynamit", - "ekolog", - "ekonomie", - "elektron", - "elipsa", - "email", - "emise", - "emoce", - "empatie", - "epizoda", - "epocha", - "epopej", - "epos", - "esej", - "esence", - "eskorta", - "eskymo", - "etiketa", - "euforie", - "evoluce", - "exekuce", - "exkurze", - "expedice", - "exploze", - "export", - "extrakt", - "facka", - "fajfka", - "fakulta", - "fanatik", - "fantazie", - "farmacie", - "favorit", - "fazole", - "federace", - "fejeton", - "fenka", - "fialka", - "figurant", - "filozof", - "filtr", - "finance", - "finta", - "fixace", - "fjord", - "flanel", - "flirt", - "flotila", - "fond", - "fosfor", - "fotbal", - "fotka", - "foton", - "frakce", - "freska", - "fronta", - "fukar", - "funkce", - "fyzika", - "galeje", - "garant", - "genetika", - "geolog", - "gilotina", - "glazura", - "glejt", - "golem", - "golfista", - "gotika", - "graf", - "gramofon", - "granule", - "grep", - "gril", - "grog", - "groteska", - "guma", - "hadice", - "hadr", - "hala", - "halenka", - "hanba", - "hanopis", - "harfa", - "harpuna", - "havran", - "hebkost", - "hejkal", - "hejno", - "hejtman", - "hektar", - "helma", - "hematom", - "herec", - "herna", - "heslo", - "hezky", - "historik", - "hladovka", - "hlasivky", - "hlava", - "hledat", - "hlen", - "hlodavec", - "hloh", - "hloupost", - "hltat", - "hlubina", - "hluchota", - "hmat", - "hmota", - "hmyz", - "hnis", - "hnojivo", - "hnout", - "hoblina", - "hoboj", - "hoch", - "hodiny", - "hodlat", - "hodnota", - "hodovat", - "hojnost", - "hokej", - "holinka", - "holka", - "holub", - "homole", - "honitba", - "honorace", - "horal", - "horda", - "horizont", - "horko", - "horlivec", - "hormon", - "hornina", - "horoskop", - "horstvo", - "hospoda", - "hostina", - "hotovost", - "houba", - "houf", - "houpat", - "houska", - "hovor", - "hradba", - "hranice", - "hravost", - "hrazda", - "hrbolek", - "hrdina", - "hrdlo", - "hrdost", - "hrnek", - "hrobka", - "hromada", - "hrot", - "hrouda", - "hrozen", - "hrstka", - "hrubost", - "hryzat", - "hubenost", - "hubnout", - "hudba", - "hukot", - "humr", - "husita", - "hustota", - "hvozd", - "hybnost", - "hydrant", - "hygiena", - "hymna", - "hysterik", - "idylka", - "ihned", - "ikona", - "iluze", - "imunita", - "infekce", - "inflace", - "inkaso", - "inovace", - "inspekce", - "internet", - "invalida", - "investor", - "inzerce", - "ironie", - "jablko", - "jachta", - "jahoda", - "jakmile", - "jakost", - "jalovec", - "jantar", - "jarmark", - "jaro", - "jasan", - "jasno", - "jatka", - "javor", - "jazyk", - "jedinec", - "jedle", - "jednatel", - "jehlan", - "jekot", - "jelen", - "jelito", - "jemnost", - "jenom", - "jepice", - "jeseter", - "jevit", - "jezdec", - "jezero", - "jinak", - "jindy", - "jinoch", - "jiskra", - "jistota", - "jitrnice", - "jizva", - "jmenovat", - "jogurt", - "jurta", - "kabaret", - "kabel", - "kabinet", - "kachna", - "kadet", - "kadidlo", - "kahan", - "kajak", - "kajuta", - "kakao", - "kaktus", - "kalamita", - "kalhoty", - "kalibr", - "kalnost", - "kamera", - "kamkoliv", - "kamna", - "kanibal", - "kanoe", - "kantor", - "kapalina", - "kapela", - "kapitola", - "kapka", - "kaple", - "kapota", - "kapr", - "kapusta", - "kapybara", - "karamel", - "karotka", - "karton", - "kasa", - "katalog", - "katedra", - "kauce", - "kauza", - "kavalec", - "kazajka", - "kazeta", - "kazivost", - "kdekoliv", - "kdesi", - "kedluben", - "kemp", - "keramika", - "kino", - "klacek", - "kladivo", - "klam", - "klapot", - "klasika", - "klaun", - "klec", - "klenba", - "klepat", - "klesnout", - "klid", - "klima", - "klisna", - "klobouk", - "klokan", - "klopa", - "kloub", - "klubovna", - "klusat", - "kluzkost", - "kmen", - "kmitat", - "kmotr", - "kniha", - "knot", - "koalice", - "koberec", - "kobka", - "kobliha", - "kobyla", - "kocour", - "kohout", - "kojenec", - "kokos", - "koktejl", - "kolaps", - "koleda", - "kolize", - "kolo", - "komando", - "kometa", - "komik", - "komnata", - "komora", - "kompas", - "komunita", - "konat", - "koncept", - "kondice", - "konec", - "konfese", - "kongres", - "konina", - "konkurs", - "kontakt", - "konzerva", - "kopanec", - "kopie", - "kopnout", - "koprovka", - "korbel", - "korektor", - "kormidlo", - "koroptev", - "korpus", - "koruna", - "koryto", - "korzet", - "kosatec", - "kostka", - "kotel", - "kotleta", - "kotoul", - "koukat", - "koupelna", - "kousek", - "kouzlo", - "kovboj", - "koza", - "kozoroh", - "krabice", - "krach", - "krajina", - "kralovat", - "krasopis", - "kravata", - "kredit", - "krejcar", - "kresba", - "kreveta", - "kriket", - "kritik", - "krize", - "krkavec", - "krmelec", - "krmivo", - "krocan", - "krok", - "kronika", - "kropit", - "kroupa", - "krovka", - "krtek", - "kruhadlo", - "krupice", - "krutost", - "krvinka", - "krychle", - "krypta", - "krystal", - "kryt", - "kudlanka", - "kufr", - "kujnost", - "kukla", - "kulajda", - "kulich", - "kulka", - "kulomet", - "kultura", - "kuna", - "kupodivu", - "kurt", - "kurzor", - "kutil", - "kvalita", - "kvasinka", - "kvestor", - "kynolog", - "kyselina", - "kytara", - "kytice", - "kytka", - "kytovec", - "kyvadlo", - "labrador", - "lachtan", - "ladnost", - "laik", - "lakomec", - "lamela", - "lampa", - "lanovka", - "lasice", - "laso", - "lastura", - "latinka", - "lavina", - "lebka", - "leckdy", - "leden", - "lednice", - "ledovka", - "ledvina", - "legenda", - "legie", - "legrace", - "lehce", - "lehkost", - "lehnout", - "lektvar", - "lenochod", - "lentilka", - "lepenka", - "lepidlo", - "letadlo", - "letec", - "letmo", - "letokruh", - "levhart", - "levitace", - "levobok", - "libra", - "lichotka", - "lidojed", - "lidskost", - "lihovina", - "lijavec", - "lilek", - "limetka", - "linie", - "linka", - "linoleum", - "listopad", - "litina", - "litovat", - "lobista", - "lodivod", - "logika", - "logoped", - "lokalita", - "loket", - "lomcovat", - "lopata", - "lopuch", - "lord", - "losos", - "lotr", - "loudal", - "louh", - "louka", - "louskat", - "lovec", - "lstivost", - "lucerna", - "lucifer", - "lump", - "lusk", - "lustrace", - "lvice", - "lyra", - "lyrika", - "lysina", - "madam", - "madlo", - "magistr", - "mahagon", - "majetek", - "majitel", - "majorita", - "makak", - "makovice", - "makrela", - "malba", - "malina", - "malovat", - "malvice", - "maminka", - "mandle", - "manko", - "marnost", - "masakr", - "maskot", - "masopust", - "matice", - "matrika", - "maturita", - "mazanec", - "mazivo", - "mazlit", - "mazurka", - "mdloba", - "mechanik", - "meditace", - "medovina", - "melasa", - "meloun", - "mentolka", - "metla", - "metoda", - "metr", - "mezera", - "migrace", - "mihnout", - "mihule", - "mikina", - "mikrofon", - "milenec", - "milimetr", - "milost", - "mimika", - "mincovna", - "minibar", - "minomet", - "minulost", - "miska", - "mistr", - "mixovat", - "mladost", - "mlha", - "mlhovina", - "mlok", - "mlsat", - "mluvit", - "mnich", - "mnohem", - "mobil", - "mocnost", - "modelka", - "modlitba", - "mohyla", - "mokro", - "molekula", - "momentka", - "monarcha", - "monokl", - "monstrum", - "montovat", - "monzun", - "mosaz", - "moskyt", - "most", - "motivace", - "motorka", - "motyka", - "moucha", - "moudrost", - "mozaika", - "mozek", - "mozol", - "mramor", - "mravenec", - "mrkev", - "mrtvola", - "mrzet", - "mrzutost", - "mstitel", - "mudrc", - "muflon", - "mulat", - "mumie", - "munice", - "muset", - "mutace", - "muzeum", - "muzikant", - "myslivec", - "mzda", - "nabourat", - "nachytat", - "nadace", - "nadbytek", - "nadhoz", - "nadobro", - "nadpis", - "nahlas", - "nahnat", - "nahodile", - "nahradit", - "naivita", - "najednou", - "najisto", - "najmout", - "naklonit", - "nakonec", - "nakrmit", - "nalevo", - "namazat", - "namluvit", - "nanometr", - "naoko", - "naopak", - "naostro", - "napadat", - "napevno", - "naplnit", - "napnout", - "naposled", - "naprosto", - "narodit", - "naruby", - "narychlo", - "nasadit", - "nasekat", - "naslepo", - "nastat", - "natolik", - "navenek", - "navrch", - "navzdory", - "nazvat", - "nebe", - "nechat", - "necky", - "nedaleko", - "nedbat", - "neduh", - "negace", - "nehet", - "nehoda", - "nejen", - "nejprve", - "neklid", - "nelibost", - "nemilost", - "nemoc", - "neochota", - "neonka", - "nepokoj", - "nerost", - "nerv", - "nesmysl", - "nesoulad", - "netvor", - "neuron", - "nevina", - "nezvykle", - "nicota", - "nijak", - "nikam", - "nikdy", - "nikl", - "nikterak", - "nitro", - "nocleh", - "nohavice", - "nominace", - "nora", - "norek", - "nositel", - "nosnost", - "nouze", - "noviny", - "novota", - "nozdra", - "nuda", - "nudle", - "nuget", - "nutit", - "nutnost", - "nutrie", - "nymfa", - "obal", - "obarvit", - "obava", - "obdiv", - "obec", - "obehnat", - "obejmout", - "obezita", - "obhajoba", - "obilnice", - "objasnit", - "objekt", - "obklopit", - "oblast", - "oblek", - "obliba", - "obloha", - "obluda", - "obnos", - "obohatit", - "obojek", - "obout", - "obrazec", - "obrna", - "obruba", - "obrys", - "obsah", - "obsluha", - "obstarat", - "obuv", - "obvaz", - "obvinit", - "obvod", - "obvykle", - "obyvatel", - "obzor", - "ocas", - "ocel", - "ocenit", - "ochladit", - "ochota", - "ochrana", - "ocitnout", - "odboj", - "odbyt", - "odchod", - "odcizit", - "odebrat", - "odeslat", - "odevzdat", - "odezva", - "odhadce", - "odhodit", - "odjet", - "odjinud", - "odkaz", - "odkoupit", - "odliv", - "odluka", - "odmlka", - "odolnost", - "odpad", - "odpis", - "odplout", - "odpor", - "odpustit", - "odpykat", - "odrazka", - "odsoudit", - "odstup", - "odsun", - "odtok", - "odtud", - "odvaha", - "odveta", - "odvolat", - "odvracet", - "odznak", - "ofina", - "ofsajd", - "ohlas", - "ohnisko", - "ohrada", - "ohrozit", - "ohryzek", - "okap", - "okenice", - "oklika", - "okno", - "okouzlit", - "okovy", - "okrasa", - "okres", - "okrsek", - "okruh", - "okupant", - "okurka", - "okusit", - "olejnina", - "olizovat", - "omak", - "omeleta", - "omezit", - "omladina", - "omlouvat", - "omluva", - "omyl", - "onehdy", - "opakovat", - "opasek", - "operace", - "opice", - "opilost", - "opisovat", - "opora", - "opozice", - "opravdu", - "oproti", - "orbital", - "orchestr", - "orgie", - "orlice", - "orloj", - "ortel", - "osada", - "oschnout", - "osika", - "osivo", - "oslava", - "oslepit", - "oslnit", - "oslovit", - "osnova", - "osoba", - "osolit", - "ospalec", - "osten", - "ostraha", - "ostuda", - "ostych", - "osvojit", - "oteplit", - "otisk", - "otop", - "otrhat", - "otrlost", - "otrok", - "otruby", - "otvor", - "ovanout", - "ovar", - "oves", - "ovlivnit", - "ovoce", - "oxid", - "ozdoba", - "pachatel", - "pacient", - "padouch", - "pahorek", - "pakt", - "palanda", - "palec", - "palivo", - "paluba", - "pamflet", - "pamlsek", - "panenka", - "panika", - "panna", - "panovat", - "panstvo", - "pantofle", - "paprika", - "parketa", - "parodie", - "parta", - "paruka", - "paryba", - "paseka", - "pasivita", - "pastelka", - "patent", - "patrona", - "pavouk", - "pazneht", - "pazourek", - "pecka", - "pedagog", - "pejsek", - "peklo", - "peloton", - "penalta", - "pendrek", - "penze", - "periskop", - "pero", - "pestrost", - "petarda", - "petice", - "petrolej", - "pevnina", - "pexeso", - "pianista", - "piha", - "pijavice", - "pikle", - "piknik", - "pilina", - "pilnost", - "pilulka", - "pinzeta", - "pipeta", - "pisatel", - "pistole", - "pitevna", - "pivnice", - "pivovar", - "placenta", - "plakat", - "plamen", - "planeta", - "plastika", - "platit", - "plavidlo", - "plaz", - "plech", - "plemeno", - "plenta", - "ples", - "pletivo", - "plevel", - "plivat", - "plnit", - "plno", - "plocha", - "plodina", - "plomba", - "plout", - "pluk", - "plyn", - "pobavit", - "pobyt", - "pochod", - "pocit", - "poctivec", - "podat", - "podcenit", - "podepsat", - "podhled", - "podivit", - "podklad", - "podmanit", - "podnik", - "podoba", - "podpora", - "podraz", - "podstata", - "podvod", - "podzim", - "poezie", - "pohanka", - "pohnutka", - "pohovor", - "pohroma", - "pohyb", - "pointa", - "pojistka", - "pojmout", - "pokazit", - "pokles", - "pokoj", - "pokrok", - "pokuta", - "pokyn", - "poledne", - "polibek", - "polknout", - "poloha", - "polynom", - "pomalu", - "pominout", - "pomlka", - "pomoc", - "pomsta", - "pomyslet", - "ponechat", - "ponorka", - "ponurost", - "popadat", - "popel", - "popisek", - "poplach", - "poprosit", - "popsat", - "popud", - "poradce", - "porce", - "porod", - "porucha", - "poryv", - "posadit", - "posed", - "posila", - "poskok", - "poslanec", - "posoudit", - "pospolu", - "postava", - "posudek", - "posyp", - "potah", - "potkan", - "potlesk", - "potomek", - "potrava", - "potupa", - "potvora", - "poukaz", - "pouto", - "pouzdro", - "povaha", - "povidla", - "povlak", - "povoz", - "povrch", - "povstat", - "povyk", - "povzdech", - "pozdrav", - "pozemek", - "poznatek", - "pozor", - "pozvat", - "pracovat", - "prahory", - "praktika", - "prales", - "praotec", - "praporek", - "prase", - "pravda", - "princip", - "prkno", - "probudit", - "procento", - "prodej", - "profese", - "prohra", - "projekt", - "prolomit", - "promile", - "pronikat", - "propad", - "prorok", - "prosba", - "proton", - "proutek", - "provaz", - "prskavka", - "prsten", - "prudkost", - "prut", - "prvek", - "prvohory", - "psanec", - "psovod", - "pstruh", - "ptactvo", - "puberta", - "puch", - "pudl", - "pukavec", - "puklina", - "pukrle", - "pult", - "pumpa", - "punc", - "pupen", - "pusa", - "pusinka", - "pustina", - "putovat", - "putyka", - "pyramida", - "pysk", - "pytel", - "racek", - "rachot", - "radiace", - "radnice", - "radon", - "raft", - "ragby", - "raketa", - "rakovina", - "rameno", - "rampouch", - "rande", - "rarach", - "rarita", - "rasovna", - "rastr", - "ratolest", - "razance", - "razidlo", - "reagovat", - "reakce", - "recept", - "redaktor", - "referent", - "reflex", - "rejnok", - "reklama", - "rekord", - "rekrut", - "rektor", - "reputace", - "revize", - "revma", - "revolver", - "rezerva", - "riskovat", - "riziko", - "robotika", - "rodokmen", - "rohovka", - "rokle", - "rokoko", - "romaneto", - "ropovod", - "ropucha", - "rorejs", - "rosol", - "rostlina", - "rotmistr", - "rotoped", - "rotunda", - "roubenka", - "roucho", - "roup", - "roura", - "rovina", - "rovnice", - "rozbor", - "rozchod", - "rozdat", - "rozeznat", - "rozhodce", - "rozinka", - "rozjezd", - "rozkaz", - "rozloha", - "rozmar", - "rozpad", - "rozruch", - "rozsah", - "roztok", - "rozum", - "rozvod", - "rubrika", - "ruchadlo", - "rukavice", - "rukopis", - "ryba", - "rybolov", - "rychlost", - "rydlo", - "rypadlo", - "rytina", - "ryzost", - "sadista", - "sahat", - "sako", - "samec", - "samizdat", - "samota", - "sanitka", - "sardinka", - "sasanka", - "satelit", - "sazba", - "sazenice", - "sbor", - "schovat", - "sebranka", - "secese", - "sedadlo", - "sediment", - "sedlo", - "sehnat", - "sejmout", - "sekera", - "sekta", - "sekunda", - "sekvoje", - "semeno", - "seno", - "servis", - "sesadit", - "seshora", - "seskok", - "seslat", - "sestra", - "sesuv", - "sesypat", - "setba", - "setina", - "setkat", - "setnout", - "setrvat", - "sever", - "seznam", - "shoda", - "shrnout", - "sifon", - "silnice", - "sirka", - "sirotek", - "sirup", - "situace", - "skafandr", - "skalisko", - "skanzen", - "skaut", - "skeptik", - "skica", - "skladba", - "sklenice", - "sklo", - "skluz", - "skoba", - "skokan", - "skoro", - "skripta", - "skrz", - "skupina", - "skvost", - "skvrna", - "slabika", - "sladidlo", - "slanina", - "slast", - "slavnost", - "sledovat", - "slepec", - "sleva", - "slezina", - "slib", - "slina", - "sliznice", - "slon", - "sloupek", - "slovo", - "sluch", - "sluha", - "slunce", - "slupka", - "slza", - "smaragd", - "smetana", - "smilstvo", - "smlouva", - "smog", - "smrad", - "smrk", - "smrtka", - "smutek", - "smysl", - "snad", - "snaha", - "snob", - "sobota", - "socha", - "sodovka", - "sokol", - "sopka", - "sotva", - "souboj", - "soucit", - "soudce", - "souhlas", - "soulad", - "soumrak", - "souprava", - "soused", - "soutok", - "souviset", - "spalovna", - "spasitel", - "spis", - "splav", - "spodek", - "spojenec", - "spolu", - "sponzor", - "spornost", - "spousta", - "sprcha", - "spustit", - "sranda", - "sraz", - "srdce", - "srna", - "srnec", - "srovnat", - "srpen", - "srst", - "srub", - "stanice", - "starosta", - "statika", - "stavba", - "stehno", - "stezka", - "stodola", - "stolek", - "stopa", - "storno", - "stoupat", - "strach", - "stres", - "strhnout", - "strom", - "struna", - "studna", - "stupnice", - "stvol", - "styk", - "subjekt", - "subtropy", - "suchar", - "sudost", - "sukno", - "sundat", - "sunout", - "surikata", - "surovina", - "svah", - "svalstvo", - "svatba", - "svazek", - "svetr", - "svisle", - "svitek", - "svoboda", - "svodidlo", - "svorka", - "svrab", - "sykavka", - "sykot", - "synek", - "synovec", - "sypat", - "sypkost", - "syrovost", - "sysel", - "sytost", - "tabletka", - "tabule", - "tahoun", - "tajemno", - "tajfun", - "tajga", - "tajit", - "tajnost", - "taktika", - "tamhle", - "tampon", - "tancovat", - "tanec", - "tanker", - "tapeta", - "tavenina", - "tazatel", - "technika", - "tehdy", - "tekutina", - "telefon", - "temnota", - "tendence", - "tenista", - "tenor", - "teplota", - "tepna", - "teprve", - "terapie", - "termoska", - "textil", - "ticho", - "tiskopis", - "titulek", - "tkadlec", - "tkanina", - "tlapka", - "tleskat", - "tlukot", - "tlupa", - "tmel", - "toaleta", - "topinka", - "topol", - "torzo", - "touha", - "toulec", - "tradice", - "traktor", - "tramp", - "trasa", - "traverza", - "trefit", - "trest", - "trezor", - "trhavina", - "trhlina", - "trochu", - "trojice", - "troska", - "trouba", - "trpce", - "trpitel", - "trpkost", - "trubec", - "truchlit", - "truhlice", - "trus", - "trvat", - "tudy", - "tuhnout", - "tuhost", - "tundra", - "turista", - "turnaj", - "tuzemsko", - "tvaroh", - "tvorba", - "tvrdost", - "tvrz", - "tygr", - "tykev", - "ubohost", - "uboze", - "ubrat", - "ubrousek", - "ubrus", - "ubytovna", - "ucho", - "uctivost", - "udivit", - "uhradit", - "ujednat", - "ujistit", - "ujmout", - "ukazatel", - "uklidnit", - "uklonit", - "ukotvit", - "ukrojit", - "ulice", - "ulita", - "ulovit", - "umyvadlo", - "unavit", - "uniforma", - "uniknout", - "upadnout", - "uplatnit", - "uplynout", - "upoutat", - "upravit", - "uran", - "urazit", - "usednout", - "usilovat", - "usmrtit", - "usnadnit", - "usnout", - "usoudit", - "ustlat", - "ustrnout", - "utahovat", - "utkat", - "utlumit", - "utonout", - "utopenec", - "utrousit", - "uvalit", - "uvolnit", - "uvozovka", - "uzdravit", - "uzel", - "uzenina", - "uzlina", - "uznat", - "vagon", - "valcha", - "valoun", - "vana", - "vandal", - "vanilka", - "varan", - "varhany", - "varovat", - "vcelku", - "vchod", - "vdova", - "vedro", - "vegetace", - "vejce", - "velbloud", - "veletrh", - "velitel", - "velmoc", - "velryba", - "venkov", - "veranda", - "verze", - "veselka", - "veskrze", - "vesnice", - "vespodu", - "vesta", - "veterina", - "veverka", - "vibrace", - "vichr", - "videohra", - "vidina", - "vidle", - "vila", - "vinice", - "viset", - "vitalita", - "vize", - "vizitka", - "vjezd", - "vklad", - "vkus", - "vlajka", - "vlak", - "vlasec", - "vlevo", - "vlhkost", - "vliv", - "vlnovka", - "vloupat", - "vnucovat", - "vnuk", - "voda", - "vodivost", - "vodoznak", - "vodstvo", - "vojensky", - "vojna", - "vojsko", - "volant", - "volba", - "volit", - "volno", - "voskovka", - "vozidlo", - "vozovna", - "vpravo", - "vrabec", - "vracet", - "vrah", - "vrata", - "vrba", - "vrcholek", - "vrhat", - "vrstva", - "vrtule", - "vsadit", - "vstoupit", - "vstup", - "vtip", - "vybavit", - "vybrat", - "vychovat", - "vydat", - "vydra", - "vyfotit", - "vyhledat", - "vyhnout", - "vyhodit", - "vyhradit", - "vyhubit", - "vyjasnit", - "vyjet", - "vyjmout", - "vyklopit", - "vykonat", - "vylekat", - "vymazat", - "vymezit", - "vymizet", - "vymyslet", - "vynechat", - "vynikat", - "vynutit", - "vypadat", - "vyplatit", - "vypravit", - "vypustit", - "vyrazit", - "vyrovnat", - "vyrvat", - "vyslovit", - "vysoko", - "vystavit", - "vysunout", - "vysypat", - "vytasit", - "vytesat", - "vytratit", - "vyvinout", - "vyvolat", - "vyvrhel", - "vyzdobit", - "vyznat", - "vzadu", - "vzbudit", - "vzchopit", - "vzdor", - "vzduch", - "vzdychat", - "vzestup", - "vzhledem", - "vzkaz", - "vzlykat", - "vznik", - "vzorek", - "vzpoura", - "vztah", - "vztek", - "xylofon", - "zabrat", - "zabydlet", - "zachovat", - "zadarmo", - "zadusit", - "zafoukat", - "zahltit", - "zahodit", - "zahrada", - "zahynout", - "zajatec", - "zajet", - "zajistit", - "zaklepat", - "zakoupit", - "zalepit", - "zamezit", - "zamotat", - "zamyslet", - "zanechat", - "zanikat", - "zaplatit", - "zapojit", - "zapsat", - "zarazit", - "zastavit", - "zasunout", - "zatajit", - "zatemnit", - "zatknout", - "zaujmout", - "zavalit", - "zavelet", - "zavinit", - "zavolat", - "zavrtat", - "zazvonit", - "zbavit", - "zbrusu", - "zbudovat", - "zbytek", - "zdaleka", - "zdarma", - "zdatnost", - "zdivo", - "zdobit", - "zdroj", - "zdvih", - "zdymadlo", - "zelenina", - "zeman", - "zemina", - "zeptat", - "zezadu", - "zezdola", - "zhatit", - "zhltnout", - "zhluboka", - "zhotovit", - "zhruba", - "zima", - "zimnice", - "zjemnit", - "zklamat", - "zkoumat", - "zkratka", - "zkumavka", - "zlato", - "zlehka", - "zloba", - "zlom", - "zlost", - "zlozvyk", - "zmapovat", - "zmar", - "zmatek", - "zmije", - "zmizet", - "zmocnit", - "zmodrat", - "zmrzlina", - "zmutovat", - "znak", - "znalost", - "znamenat", - "znovu", - "zobrazit", - "zotavit", - "zoubek", - "zoufale", - "zplodit", - "zpomalit", - "zprava", - "zprostit", - "zprudka", - "zprvu", - "zrada", - "zranit", - "zrcadlo", - "zrnitost", - "zrno", - "zrovna", - "zrychlit", - "zrzavost", - "zticha", - "ztratit", - "zubovina", - "zubr", - "zvednout", - "zvenku", - "zvesela", - "zvon", - "zvrat", - "zvukovod", - "zvyk" -] diff --git a/networks/monero/wallet/polyseed/src/words/en.rs b/networks/monero/wallet/polyseed/src/words/en.rs deleted file mode 100644 index aa90e28d3..000000000 --- a/networks/monero/wallet/polyseed/src/words/en.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "abandon", - "ability", - "able", - "about", - "above", - "absent", - "absorb", - "abstract", - "absurd", - "abuse", - "access", - "accident", - "account", - "accuse", - "achieve", - "acid", - "acoustic", - "acquire", - "across", - "act", - "action", - "actor", - "actress", - "actual", - "adapt", - "add", - "addict", - "address", - "adjust", - "admit", - "adult", - "advance", - "advice", - "aerobic", - "affair", - "afford", - "afraid", - "again", - "age", - "agent", - "agree", - "ahead", - "aim", - "air", - "airport", - "aisle", - "alarm", - "album", - "alcohol", - "alert", - "alien", - "all", - "alley", - "allow", - "almost", - "alone", - "alpha", - "already", - "also", - "alter", - "always", - "amateur", - "amazing", - "among", - "amount", - "amused", - "analyst", - "anchor", - "ancient", - "anger", - "angle", - "angry", - "animal", - "ankle", - "announce", - "annual", - "another", - "answer", - "antenna", - "antique", - "anxiety", - "any", - "apart", - "apology", - "appear", - "apple", - "approve", - "april", - "arch", - "arctic", - "area", - "arena", - "argue", - "arm", - "armed", - "armor", - "army", - "around", - "arrange", - "arrest", - "arrive", - "arrow", - "art", - "artefact", - "artist", - "artwork", - "ask", - "aspect", - "assault", - "asset", - "assist", - "assume", - "asthma", - "athlete", - "atom", - "attack", - "attend", - "attitude", - "attract", - "auction", - "audit", - "august", - "aunt", - "author", - "auto", - "autumn", - "average", - "avocado", - "avoid", - "awake", - "aware", - "away", - "awesome", - "awful", - "awkward", - "axis", - "baby", - "bachelor", - "bacon", - "badge", - "bag", - "balance", - "balcony", - "ball", - "bamboo", - "banana", - "banner", - "bar", - "barely", - "bargain", - "barrel", - "base", - "basic", - "basket", - "battle", - "beach", - "bean", - "beauty", - "because", - "become", - "beef", - "before", - "begin", - "behave", - "behind", - "believe", - "below", - "belt", - "bench", - "benefit", - "best", - "betray", - "better", - "between", - "beyond", - "bicycle", - "bid", - "bike", - "bind", - "biology", - "bird", - "birth", - "bitter", - "black", - "blade", - "blame", - "blanket", - "blast", - "bleak", - "bless", - "blind", - "blood", - "blossom", - "blouse", - "blue", - "blur", - "blush", - "board", - "boat", - "body", - "boil", - "bomb", - "bone", - "bonus", - "book", - "boost", - "border", - "boring", - "borrow", - "boss", - "bottom", - "bounce", - "box", - "boy", - "bracket", - "brain", - "brand", - "brass", - "brave", - "bread", - "breeze", - "brick", - "bridge", - "brief", - "bright", - "bring", - "brisk", - "broccoli", - "broken", - "bronze", - "broom", - "brother", - "brown", - "brush", - "bubble", - "buddy", - "budget", - "buffalo", - "build", - "bulb", - "bulk", - "bullet", - "bundle", - "bunker", - "burden", - "burger", - "burst", - "bus", - "business", - "busy", - "butter", - "buyer", - "buzz", - "cabbage", - "cabin", - "cable", - "cactus", - "cage", - "cake", - "call", - "calm", - "camera", - "camp", - "can", - "canal", - "cancel", - "candy", - "cannon", - "canoe", - "canvas", - "canyon", - "capable", - "capital", - "captain", - "car", - "carbon", - "card", - "cargo", - "carpet", - "carry", - "cart", - "case", - "cash", - "casino", - "castle", - "casual", - "cat", - "catalog", - "catch", - "category", - "cattle", - "caught", - "cause", - "caution", - "cave", - "ceiling", - "celery", - "cement", - "census", - "century", - "cereal", - "certain", - "chair", - "chalk", - "champion", - "change", - "chaos", - "chapter", - "charge", - "chase", - "chat", - "cheap", - "check", - "cheese", - "chef", - "cherry", - "chest", - "chicken", - "chief", - "child", - "chimney", - "choice", - "choose", - "chronic", - "chuckle", - "chunk", - "churn", - "cigar", - "cinnamon", - "circle", - "citizen", - "city", - "civil", - "claim", - "clap", - "clarify", - "claw", - "clay", - "clean", - "clerk", - "clever", - "click", - "client", - "cliff", - "climb", - "clinic", - "clip", - "clock", - "clog", - "close", - "cloth", - "cloud", - "clown", - "club", - "clump", - "cluster", - "clutch", - "coach", - "coast", - "coconut", - "code", - "coffee", - "coil", - "coin", - "collect", - "color", - "column", - "combine", - "come", - "comfort", - "comic", - "common", - "company", - "concert", - "conduct", - "confirm", - "congress", - "connect", - "consider", - "control", - "convince", - "cook", - "cool", - "copper", - "copy", - "coral", - "core", - "corn", - "correct", - "cost", - "cotton", - "couch", - "country", - "couple", - "course", - "cousin", - "cover", - "coyote", - "crack", - "cradle", - "craft", - "cram", - "crane", - "crash", - "crater", - "crawl", - "crazy", - "cream", - "credit", - "creek", - "crew", - "cricket", - "crime", - "crisp", - "critic", - "crop", - "cross", - "crouch", - "crowd", - "crucial", - "cruel", - "cruise", - "crumble", - "crunch", - "crush", - "cry", - "crystal", - "cube", - "culture", - "cup", - "cupboard", - "curious", - "current", - "curtain", - "curve", - "cushion", - "custom", - "cute", - "cycle", - "dad", - "damage", - "damp", - "dance", - "danger", - "daring", - "dash", - "daughter", - "dawn", - "day", - "deal", - "debate", - "debris", - "decade", - "december", - "decide", - "decline", - "decorate", - "decrease", - "deer", - "defense", - "define", - "defy", - "degree", - "delay", - "deliver", - "demand", - "demise", - "denial", - "dentist", - "deny", - "depart", - "depend", - "deposit", - "depth", - "deputy", - "derive", - "describe", - "desert", - "design", - "desk", - "despair", - "destroy", - "detail", - "detect", - "develop", - "device", - "devote", - "diagram", - "dial", - "diamond", - "diary", - "dice", - "diesel", - "diet", - "differ", - "digital", - "dignity", - "dilemma", - "dinner", - "dinosaur", - "direct", - "dirt", - "disagree", - "discover", - "disease", - "dish", - "dismiss", - "disorder", - "display", - "distance", - "divert", - "divide", - "divorce", - "dizzy", - "doctor", - "document", - "dog", - "doll", - "dolphin", - "domain", - "donate", - "donkey", - "donor", - "door", - "dose", - "double", - "dove", - "draft", - "dragon", - "drama", - "drastic", - "draw", - "dream", - "dress", - "drift", - "drill", - "drink", - "drip", - "drive", - "drop", - "drum", - "dry", - "duck", - "dumb", - "dune", - "during", - "dust", - "dutch", - "duty", - "dwarf", - "dynamic", - "eager", - "eagle", - "early", - "earn", - "earth", - "easily", - "east", - "easy", - "echo", - "ecology", - "economy", - "edge", - "edit", - "educate", - "effort", - "egg", - "eight", - "either", - "elbow", - "elder", - "electric", - "elegant", - "element", - "elephant", - "elevator", - "elite", - "else", - "embark", - "embody", - "embrace", - "emerge", - "emotion", - "employ", - "empower", - "empty", - "enable", - "enact", - "end", - "endless", - "endorse", - "enemy", - "energy", - "enforce", - "engage", - "engine", - "enhance", - "enjoy", - "enlist", - "enough", - "enrich", - "enroll", - "ensure", - "enter", - "entire", - "entry", - "envelope", - "episode", - "equal", - "equip", - "era", - "erase", - "erode", - "erosion", - "error", - "erupt", - "escape", - "essay", - "essence", - "estate", - "eternal", - "ethics", - "evidence", - "evil", - "evoke", - "evolve", - "exact", - "example", - "excess", - "exchange", - "excite", - "exclude", - "excuse", - "execute", - "exercise", - "exhaust", - "exhibit", - "exile", - "exist", - "exit", - "exotic", - "expand", - "expect", - "expire", - "explain", - "expose", - "express", - "extend", - "extra", - "eye", - "eyebrow", - "fabric", - "face", - "faculty", - "fade", - "faint", - "faith", - "fall", - "false", - "fame", - "family", - "famous", - "fan", - "fancy", - "fantasy", - "farm", - "fashion", - "fat", - "fatal", - "father", - "fatigue", - "fault", - "favorite", - "feature", - "february", - "federal", - "fee", - "feed", - "feel", - "female", - "fence", - "festival", - "fetch", - "fever", - "few", - "fiber", - "fiction", - "field", - "figure", - "file", - "film", - "filter", - "final", - "find", - "fine", - "finger", - "finish", - "fire", - "firm", - "first", - "fiscal", - "fish", - "fit", - "fitness", - "fix", - "flag", - "flame", - "flash", - "flat", - "flavor", - "flee", - "flight", - "flip", - "float", - "flock", - "floor", - "flower", - "fluid", - "flush", - "fly", - "foam", - "focus", - "fog", - "foil", - "fold", - "follow", - "food", - "foot", - "force", - "forest", - "forget", - "fork", - "fortune", - "forum", - "forward", - "fossil", - "foster", - "found", - "fox", - "fragile", - "frame", - "frequent", - "fresh", - "friend", - "fringe", - "frog", - "front", - "frost", - "frown", - "frozen", - "fruit", - "fuel", - "fun", - "funny", - "furnace", - "fury", - "future", - "gadget", - "gain", - "galaxy", - "gallery", - "game", - "gap", - "garage", - "garbage", - "garden", - "garlic", - "garment", - "gas", - "gasp", - "gate", - "gather", - "gauge", - "gaze", - "general", - "genius", - "genre", - "gentle", - "genuine", - "gesture", - "ghost", - "giant", - "gift", - "giggle", - "ginger", - "giraffe", - "girl", - "give", - "glad", - "glance", - "glare", - "glass", - "glide", - "glimpse", - "globe", - "gloom", - "glory", - "glove", - "glow", - "glue", - "goat", - "goddess", - "gold", - "good", - "goose", - "gorilla", - "gospel", - "gossip", - "govern", - "gown", - "grab", - "grace", - "grain", - "grant", - "grape", - "grass", - "gravity", - "great", - "green", - "grid", - "grief", - "grit", - "grocery", - "group", - "grow", - "grunt", - "guard", - "guess", - "guide", - "guilt", - "guitar", - "gun", - "gym", - "habit", - "hair", - "half", - "hammer", - "hamster", - "hand", - "happy", - "harbor", - "hard", - "harsh", - "harvest", - "hat", - "have", - "hawk", - "hazard", - "head", - "health", - "heart", - "heavy", - "hedgehog", - "height", - "hello", - "helmet", - "help", - "hen", - "hero", - "hidden", - "high", - "hill", - "hint", - "hip", - "hire", - "history", - "hobby", - "hockey", - "hold", - "hole", - "holiday", - "hollow", - "home", - "honey", - "hood", - "hope", - "horn", - "horror", - "horse", - "hospital", - "host", - "hotel", - "hour", - "hover", - "hub", - "huge", - "human", - "humble", - "humor", - "hundred", - "hungry", - "hunt", - "hurdle", - "hurry", - "hurt", - "husband", - "hybrid", - "ice", - "icon", - "idea", - "identify", - "idle", - "ignore", - "ill", - "illegal", - "illness", - "image", - "imitate", - "immense", - "immune", - "impact", - "impose", - "improve", - "impulse", - "inch", - "include", - "income", - "increase", - "index", - "indicate", - "indoor", - "industry", - "infant", - "inflict", - "inform", - "inhale", - "inherit", - "initial", - "inject", - "injury", - "inmate", - "inner", - "innocent", - "input", - "inquiry", - "insane", - "insect", - "inside", - "inspire", - "install", - "intact", - "interest", - "into", - "invest", - "invite", - "involve", - "iron", - "island", - "isolate", - "issue", - "item", - "ivory", - "jacket", - "jaguar", - "jar", - "jazz", - "jealous", - "jeans", - "jelly", - "jewel", - "job", - "join", - "joke", - "journey", - "joy", - "judge", - "juice", - "jump", - "jungle", - "junior", - "junk", - "just", - "kangaroo", - "keen", - "keep", - "ketchup", - "key", - "kick", - "kid", - "kidney", - "kind", - "kingdom", - "kiss", - "kit", - "kitchen", - "kite", - "kitten", - "kiwi", - "knee", - "knife", - "knock", - "know", - "lab", - "label", - "labor", - "ladder", - "lady", - "lake", - "lamp", - "language", - "laptop", - "large", - "later", - "latin", - "laugh", - "laundry", - "lava", - "law", - "lawn", - "lawsuit", - "layer", - "lazy", - "leader", - "leaf", - "learn", - "leave", - "lecture", - "left", - "leg", - "legal", - "legend", - "leisure", - "lemon", - "lend", - "length", - "lens", - "leopard", - "lesson", - "letter", - "level", - "liar", - "liberty", - "library", - "license", - "life", - "lift", - "light", - "like", - "limb", - "limit", - "link", - "lion", - "liquid", - "list", - "little", - "live", - "lizard", - "load", - "loan", - "lobster", - "local", - "lock", - "logic", - "lonely", - "long", - "loop", - "lottery", - "loud", - "lounge", - "love", - "loyal", - "lucky", - "luggage", - "lumber", - "lunar", - "lunch", - "luxury", - "lyrics", - "machine", - "mad", - "magic", - "magnet", - "maid", - "mail", - "main", - "major", - "make", - "mammal", - "man", - "manage", - "mandate", - "mango", - "mansion", - "manual", - "maple", - "marble", - "march", - "margin", - "marine", - "market", - "marriage", - "mask", - "mass", - "master", - "match", - "material", - "math", - "matrix", - "matter", - "maximum", - "maze", - "meadow", - "mean", - "measure", - "meat", - "mechanic", - "medal", - "media", - "melody", - "melt", - "member", - "memory", - "mention", - "menu", - "mercy", - "merge", - "merit", - "merry", - "mesh", - "message", - "metal", - "method", - "middle", - "midnight", - "milk", - "million", - "mimic", - "mind", - "minimum", - "minor", - "minute", - "miracle", - "mirror", - "misery", - "miss", - "mistake", - "mix", - "mixed", - "mixture", - "mobile", - "model", - "modify", - "mom", - "moment", - "monitor", - "monkey", - "monster", - "month", - "moon", - "moral", - "more", - "morning", - "mosquito", - "mother", - "motion", - "motor", - "mountain", - "mouse", - "move", - "movie", - "much", - "muffin", - "mule", - "multiply", - "muscle", - "museum", - "mushroom", - "music", - "must", - "mutual", - "myself", - "mystery", - "myth", - "naive", - "name", - "napkin", - "narrow", - "nasty", - "nation", - "nature", - "near", - "neck", - "need", - "negative", - "neglect", - "neither", - "nephew", - "nerve", - "nest", - "net", - "network", - "neutral", - "never", - "news", - "next", - "nice", - "night", - "noble", - "noise", - "nominee", - "noodle", - "normal", - "north", - "nose", - "notable", - "note", - "nothing", - "notice", - "novel", - "now", - "nuclear", - "number", - "nurse", - "nut", - "oak", - "obey", - "object", - "oblige", - "obscure", - "observe", - "obtain", - "obvious", - "occur", - "ocean", - "october", - "odor", - "off", - "offer", - "office", - "often", - "oil", - "okay", - "old", - "olive", - "olympic", - "omit", - "once", - "one", - "onion", - "online", - "only", - "open", - "opera", - "opinion", - "oppose", - "option", - "orange", - "orbit", - "orchard", - "order", - "ordinary", - "organ", - "orient", - "original", - "orphan", - "ostrich", - "other", - "outdoor", - "outer", - "output", - "outside", - "oval", - "oven", - "over", - "own", - "owner", - "oxygen", - "oyster", - "ozone", - "pact", - "paddle", - "page", - "pair", - "palace", - "palm", - "panda", - "panel", - "panic", - "panther", - "paper", - "parade", - "parent", - "park", - "parrot", - "party", - "pass", - "patch", - "path", - "patient", - "patrol", - "pattern", - "pause", - "pave", - "payment", - "peace", - "peanut", - "pear", - "peasant", - "pelican", - "pen", - "penalty", - "pencil", - "people", - "pepper", - "perfect", - "permit", - "person", - "pet", - "phone", - "photo", - "phrase", - "physical", - "piano", - "picnic", - "picture", - "piece", - "pig", - "pigeon", - "pill", - "pilot", - "pink", - "pioneer", - "pipe", - "pistol", - "pitch", - "pizza", - "place", - "planet", - "plastic", - "plate", - "play", - "please", - "pledge", - "pluck", - "plug", - "plunge", - "poem", - "poet", - "point", - "polar", - "pole", - "police", - "pond", - "pony", - "pool", - "popular", - "portion", - "position", - "possible", - "post", - "potato", - "pottery", - "poverty", - "powder", - "power", - "practice", - "praise", - "predict", - "prefer", - "prepare", - "present", - "pretty", - "prevent", - "price", - "pride", - "primary", - "print", - "priority", - "prison", - "private", - "prize", - "problem", - "process", - "produce", - "profit", - "program", - "project", - "promote", - "proof", - "property", - "prosper", - "protect", - "proud", - "provide", - "public", - "pudding", - "pull", - "pulp", - "pulse", - "pumpkin", - "punch", - "pupil", - "puppy", - "purchase", - "purity", - "purpose", - "purse", - "push", - "put", - "puzzle", - "pyramid", - "quality", - "quantum", - "quarter", - "question", - "quick", - "quit", - "quiz", - "quote", - "rabbit", - "raccoon", - "race", - "rack", - "radar", - "radio", - "rail", - "rain", - "raise", - "rally", - "ramp", - "ranch", - "random", - "range", - "rapid", - "rare", - "rate", - "rather", - "raven", - "raw", - "razor", - "ready", - "real", - "reason", - "rebel", - "rebuild", - "recall", - "receive", - "recipe", - "record", - "recycle", - "reduce", - "reflect", - "reform", - "refuse", - "region", - "regret", - "regular", - "reject", - "relax", - "release", - "relief", - "rely", - "remain", - "remember", - "remind", - "remove", - "render", - "renew", - "rent", - "reopen", - "repair", - "repeat", - "replace", - "report", - "require", - "rescue", - "resemble", - "resist", - "resource", - "response", - "result", - "retire", - "retreat", - "return", - "reunion", - "reveal", - "review", - "reward", - "rhythm", - "rib", - "ribbon", - "rice", - "rich", - "ride", - "ridge", - "rifle", - "right", - "rigid", - "ring", - "riot", - "ripple", - "risk", - "ritual", - "rival", - "river", - "road", - "roast", - "robot", - "robust", - "rocket", - "romance", - "roof", - "rookie", - "room", - "rose", - "rotate", - "rough", - "round", - "route", - "royal", - "rubber", - "rude", - "rug", - "rule", - "run", - "runway", - "rural", - "sad", - "saddle", - "sadness", - "safe", - "sail", - "salad", - "salmon", - "salon", - "salt", - "salute", - "same", - "sample", - "sand", - "satisfy", - "satoshi", - "sauce", - "sausage", - "save", - "say", - "scale", - "scan", - "scare", - "scatter", - "scene", - "scheme", - "school", - "science", - "scissors", - "scorpion", - "scout", - "scrap", - "screen", - "script", - "scrub", - "sea", - "search", - "season", - "seat", - "second", - "secret", - "section", - "security", - "seed", - "seek", - "segment", - "select", - "sell", - "seminar", - "senior", - "sense", - "sentence", - "series", - "service", - "session", - "settle", - "setup", - "seven", - "shadow", - "shaft", - "shallow", - "share", - "shed", - "shell", - "sheriff", - "shield", - "shift", - "shine", - "ship", - "shiver", - "shock", - "shoe", - "shoot", - "shop", - "short", - "shoulder", - "shove", - "shrimp", - "shrug", - "shuffle", - "shy", - "sibling", - "sick", - "side", - "siege", - "sight", - "sign", - "silent", - "silk", - "silly", - "silver", - "similar", - "simple", - "since", - "sing", - "siren", - "sister", - "situate", - "six", - "size", - "skate", - "sketch", - "ski", - "skill", - "skin", - "skirt", - "skull", - "slab", - "slam", - "sleep", - "slender", - "slice", - "slide", - "slight", - "slim", - "slogan", - "slot", - "slow", - "slush", - "small", - "smart", - "smile", - "smoke", - "smooth", - "snack", - "snake", - "snap", - "sniff", - "snow", - "soap", - "soccer", - "social", - "sock", - "soda", - "soft", - "solar", - "soldier", - "solid", - "solution", - "solve", - "someone", - "song", - "soon", - "sorry", - "sort", - "soul", - "sound", - "soup", - "source", - "south", - "space", - "spare", - "spatial", - "spawn", - "speak", - "special", - "speed", - "spell", - "spend", - "sphere", - "spice", - "spider", - "spike", - "spin", - "spirit", - "split", - "spoil", - "sponsor", - "spoon", - "sport", - "spot", - "spray", - "spread", - "spring", - "spy", - "square", - "squeeze", - "squirrel", - "stable", - "stadium", - "staff", - "stage", - "stairs", - "stamp", - "stand", - "start", - "state", - "stay", - "steak", - "steel", - "stem", - "step", - "stereo", - "stick", - "still", - "sting", - "stock", - "stomach", - "stone", - "stool", - "story", - "stove", - "strategy", - "street", - "strike", - "strong", - "struggle", - "student", - "stuff", - "stumble", - "style", - "subject", - "submit", - "subway", - "success", - "such", - "sudden", - "suffer", - "sugar", - "suggest", - "suit", - "summer", - "sun", - "sunny", - "sunset", - "super", - "supply", - "supreme", - "sure", - "surface", - "surge", - "surprise", - "surround", - "survey", - "suspect", - "sustain", - "swallow", - "swamp", - "swap", - "swarm", - "swear", - "sweet", - "swift", - "swim", - "swing", - "switch", - "sword", - "symbol", - "symptom", - "syrup", - "system", - "table", - "tackle", - "tag", - "tail", - "talent", - "talk", - "tank", - "tape", - "target", - "task", - "taste", - "tattoo", - "taxi", - "teach", - "team", - "tell", - "ten", - "tenant", - "tennis", - "tent", - "term", - "test", - "text", - "thank", - "that", - "theme", - "then", - "theory", - "there", - "they", - "thing", - "this", - "thought", - "three", - "thrive", - "throw", - "thumb", - "thunder", - "ticket", - "tide", - "tiger", - "tilt", - "timber", - "time", - "tiny", - "tip", - "tired", - "tissue", - "title", - "toast", - "tobacco", - "today", - "toddler", - "toe", - "together", - "toilet", - "token", - "tomato", - "tomorrow", - "tone", - "tongue", - "tonight", - "tool", - "tooth", - "top", - "topic", - "topple", - "torch", - "tornado", - "tortoise", - "toss", - "total", - "tourist", - "toward", - "tower", - "town", - "toy", - "track", - "trade", - "traffic", - "tragic", - "train", - "transfer", - "trap", - "trash", - "travel", - "tray", - "treat", - "tree", - "trend", - "trial", - "tribe", - "trick", - "trigger", - "trim", - "trip", - "trophy", - "trouble", - "truck", - "true", - "truly", - "trumpet", - "trust", - "truth", - "try", - "tube", - "tuition", - "tumble", - "tuna", - "tunnel", - "turkey", - "turn", - "turtle", - "twelve", - "twenty", - "twice", - "twin", - "twist", - "two", - "type", - "typical", - "ugly", - "umbrella", - "unable", - "unaware", - "uncle", - "uncover", - "under", - "undo", - "unfair", - "unfold", - "unhappy", - "uniform", - "unique", - "unit", - "universe", - "unknown", - "unlock", - "until", - "unusual", - "unveil", - "update", - "upgrade", - "uphold", - "upon", - "upper", - "upset", - "urban", - "urge", - "usage", - "use", - "used", - "useful", - "useless", - "usual", - "utility", - "vacant", - "vacuum", - "vague", - "valid", - "valley", - "valve", - "van", - "vanish", - "vapor", - "various", - "vast", - "vault", - "vehicle", - "velvet", - "vendor", - "venture", - "venue", - "verb", - "verify", - "version", - "very", - "vessel", - "veteran", - "viable", - "vibrant", - "vicious", - "victory", - "video", - "view", - "village", - "vintage", - "violin", - "virtual", - "virus", - "visa", - "visit", - "visual", - "vital", - "vivid", - "vocal", - "voice", - "void", - "volcano", - "volume", - "vote", - "voyage", - "wage", - "wagon", - "wait", - "walk", - "wall", - "walnut", - "want", - "warfare", - "warm", - "warrior", - "wash", - "wasp", - "waste", - "water", - "wave", - "way", - "wealth", - "weapon", - "wear", - "weasel", - "weather", - "web", - "wedding", - "weekend", - "weird", - "welcome", - "west", - "wet", - "whale", - "what", - "wheat", - "wheel", - "when", - "where", - "whip", - "whisper", - "wide", - "width", - "wife", - "wild", - "will", - "win", - "window", - "wine", - "wing", - "wink", - "winner", - "winter", - "wire", - "wisdom", - "wise", - "wish", - "witness", - "wolf", - "woman", - "wonder", - "wood", - "wool", - "word", - "work", - "world", - "worry", - "worth", - "wrap", - "wreck", - "wrestle", - "wrist", - "write", - "wrong", - "yard", - "year", - "yellow", - "you", - "young", - "youth", - "zebra", - "zero", - "zone", - "zoo" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/es.rs b/networks/monero/wallet/polyseed/src/words/es.rs deleted file mode 100644 index 21ab12995..000000000 --- a/networks/monero/wallet/polyseed/src/words/es.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "ábaco", - "abdomen", - "abeja", - "abierto", - "abogado", - "abono", - "aborto", - "abrazo", - "abrir", - "abuelo", - "abuso", - "acabar", - "academia", - "acceso", - "acción", - "aceite", - "acelga", - "acento", - "aceptar", - "ácido", - "aclarar", - "acné", - "acoger", - "acoso", - "activo", - "acto", - "actriz", - "actuar", - "acudir", - "acuerdo", - "acusar", - "adicto", - "admitir", - "adoptar", - "adorno", - "aduana", - "adulto", - "aéreo", - "afectar", - "afición", - "afinar", - "afirmar", - "ágil", - "agitar", - "agonía", - "agosto", - "agotar", - "agregar", - "agrio", - "agua", - "agudo", - "águila", - "aguja", - "ahogo", - "ahorro", - "aire", - "aislar", - "ajedrez", - "ajeno", - "ajuste", - "alacrán", - "alambre", - "alarma", - "alba", - "álbum", - "alcalde", - "aldea", - "alegre", - "alejar", - "alerta", - "aleta", - "alfiler", - "alga", - "algodón", - "aliado", - "aliento", - "alivio", - "alma", - "almeja", - "almíbar", - "altar", - "alteza", - "altivo", - "alto", - "altura", - "alumno", - "alzar", - "amable", - "amante", - "amapola", - "amargo", - "amasar", - "ámbar", - "ámbito", - "ameno", - "amigo", - "amistad", - "amor", - "amparo", - "amplio", - "añadir", - "ancho", - "anciano", - "ancla", - "andar", - "andén", - "añejo", - "anemia", - "ángulo", - "anillo", - "ánimo", - "anís", - "año", - "anotar", - "antena", - "antiguo", - "antojo", - "anual", - "anular", - "anuncio", - "apagar", - "aparato", - "apetito", - "apio", - "aplicar", - "apodo", - "aporte", - "apoyo", - "aprender", - "aprobar", - "apuesta", - "apuro", - "arado", - "araña", - "arar", - "árbitro", - "árbol", - "arbusto", - "archivo", - "arco", - "arder", - "ardilla", - "arduo", - "área", - "árido", - "aries", - "armonía", - "arnés", - "aroma", - "arpa", - "arpón", - "arreglo", - "arroz", - "arruga", - "arte", - "artista", - "asa", - "asado", - "asalto", - "ascenso", - "asegurar", - "aseo", - "asesor", - "asiento", - "asilo", - "asistir", - "asno", - "asombro", - "áspero", - "astilla", - "astro", - "astuto", - "asumir", - "asunto", - "atajo", - "ataque", - "atar", - "atento", - "ateo", - "ático", - "atleta", - "átomo", - "atraer", - "atroz", - "atún", - "audaz", - "audio", - "auge", - "aula", - "aumento", - "ausente", - "autor", - "aval", - "avance", - "avaro", - "ave", - "avellana", - "avena", - "avestruz", - "avión", - "aviso", - "ayer", - "ayuda", - "ayuno", - "azafrán", - "azar", - "azote", - "azúcar", - "azufre", - "azul", - "baba", - "babor", - "bache", - "bahía", - "baile", - "bajar", - "balanza", - "balcón", - "balde", - "bambú", - "banco", - "banda", - "baño", - "barba", - "barco", - "barniz", - "barro", - "báscula", - "bastón", - "basura", - "batalla", - "batería", - "batir", - "batuta", - "baúl", - "bazar", - "bebé", - "bebida", - "bello", - "besar", - "beso", - "bestia", - "bicho", - "bien", - "bingo", - "blanco", - "bloque", - "blusa", - "boa", - "bobina", - "bobo", - "boca", - "bocina", - "boda", - "bodega", - "boina", - "bola", - "bolero", - "bolsa", - "bomba", - "bondad", - "bonito", - "bono", - "bonsái", - "borde", - "borrar", - "bosque", - "bote", - "botín", - "bóveda", - "bozal", - "bravo", - "brazo", - "brecha", - "breve", - "brillo", - "brinco", - "brisa", - "broca", - "broma", - "bronce", - "brote", - "bruja", - "brusco", - "bruto", - "buceo", - "bucle", - "bueno", - "buey", - "bufanda", - "bufón", - "búho", - "buitre", - "bulto", - "burbuja", - "burla", - "burro", - "buscar", - "butaca", - "buzón", - "caballo", - "cabeza", - "cabina", - "cabra", - "cacao", - "cadáver", - "cadena", - "caer", - "café", - "caída", - "caimán", - "caja", - "cajón", - "cal", - "calamar", - "calcio", - "caldo", - "calidad", - "calle", - "calma", - "calor", - "calvo", - "cama", - "cambio", - "camello", - "camino", - "campo", - "caña", - "cáncer", - "candil", - "canela", - "canguro", - "canica", - "cañón", - "canto", - "caoba", - "caos", - "capaz", - "capitán", - "capote", - "captar", - "capucha", - "cara", - "carbón", - "cárcel", - "careta", - "carga", - "cariño", - "carne", - "carpeta", - "carro", - "carta", - "casa", - "casco", - "casero", - "caspa", - "castor", - "catorce", - "catre", - "caudal", - "causa", - "cazo", - "cebolla", - "ceder", - "cedro", - "celda", - "célebre", - "celoso", - "célula", - "cemento", - "ceniza", - "centro", - "cerca", - "cerdo", - "cereza", - "cero", - "cerrar", - "certeza", - "césped", - "cetro", - "chacal", - "chaleco", - "champú", - "chancla", - "chapa", - "charla", - "chico", - "chiste", - "chivo", - "choque", - "choza", - "chuleta", - "chupar", - "ciclón", - "ciego", - "cielo", - "cien", - "cierto", - "cifra", - "cigarro", - "cima", - "cinco", - "cine", - "cinta", - "ciprés", - "circo", - "ciruela", - "cisne", - "cita", - "ciudad", - "clamor", - "clan", - "claro", - "clase", - "clave", - "cliente", - "clima", - "clínica", - "cobre", - "cocción", - "cochino", - "cocina", - "coco", - "código", - "codo", - "cofre", - "coger", - "cohete", - "cojín", - "cojo", - "cola", - "colcha", - "colegio", - "colgar", - "colina", - "collar", - "colmo", - "columna", - "combate", - "comer", - "comida", - "cómodo", - "compra", - "conde", - "conejo", - "conga", - "conocer", - "consejo", - "contar", - "copa", - "copia", - "corazón", - "corbata", - "corcho", - "cordón", - "corona", - "correr", - "coser", - "cosmos", - "costa", - "cráneo", - "cráter", - "crear", - "crecer", - "creído", - "crema", - "cría", - "crimen", - "cripta", - "crisis", - "cromo", - "crónica", - "croqueta", - "crudo", - "cruz", - "cuadro", - "cuarto", - "cuatro", - "cubo", - "cubrir", - "cuchara", - "cuello", - "cuento", - "cuerda", - "cuesta", - "cueva", - "cuidar", - "culebra", - "culpa", - "culto", - "cumbre", - "cumplir", - "cuna", - "cuneta", - "cuota", - "cupón", - "cúpula", - "curar", - "curioso", - "curso", - "curva", - "cutis", - "dama", - "danza", - "dar", - "dardo", - "dátil", - "deber", - "débil", - "década", - "decir", - "dedo", - "defensa", - "definir", - "dejar", - "delfín", - "delgado", - "delito", - "demora", - "denso", - "dental", - "deporte", - "derecho", - "derrota", - "desayuno", - "deseo", - "desfile", - "desnudo", - "destino", - "desvío", - "detalle", - "detener", - "deuda", - "día", - "diablo", - "diadema", - "diamante", - "diana", - "diario", - "dibujo", - "dictar", - "diente", - "dieta", - "diez", - "difícil", - "digno", - "dilema", - "diluir", - "dinero", - "directo", - "dirigir", - "disco", - "diseño", - "disfraz", - "diva", - "divino", - "doble", - "doce", - "dolor", - "domingo", - "don", - "donar", - "dorado", - "dormir", - "dorso", - "dos", - "dosis", - "dragón", - "droga", - "ducha", - "duda", - "duelo", - "dueño", - "dulce", - "dúo", - "duque", - "durar", - "dureza", - "duro", - "ébano", - "ebrio", - "echar", - "eco", - "ecuador", - "edad", - "edición", - "edificio", - "editor", - "educar", - "efecto", - "eficaz", - "eje", - "ejemplo", - "elefante", - "elegir", - "elemento", - "elevar", - "elipse", - "élite", - "elixir", - "elogio", - "eludir", - "embudo", - "emitir", - "emoción", - "empate", - "empeño", - "empleo", - "empresa", - "enano", - "encargo", - "enchufe", - "encía", - "enemigo", - "enero", - "enfado", - "enfermo", - "engaño", - "enigma", - "enlace", - "enorme", - "enredo", - "ensayo", - "enseñar", - "entero", - "entrar", - "envase", - "envío", - "época", - "equipo", - "erizo", - "escala", - "escena", - "escolar", - "escribir", - "escudo", - "esencia", - "esfera", - "esfuerzo", - "espada", - "espejo", - "espía", - "esposa", - "espuma", - "esquí", - "estar", - "este", - "estilo", - "estufa", - "etapa", - "eterno", - "ética", - "etnia", - "evadir", - "evaluar", - "evento", - "evitar", - "exacto", - "examen", - "exceso", - "excusa", - "exento", - "exigir", - "exilio", - "existir", - "éxito", - "experto", - "explicar", - "exponer", - "extremo", - "fábrica", - "fábula", - "fachada", - "fácil", - "factor", - "faena", - "faja", - "falda", - "fallo", - "falso", - "faltar", - "fama", - "familia", - "famoso", - "faraón", - "farmacia", - "farol", - "farsa", - "fase", - "fatiga", - "fauna", - "favor", - "fax", - "febrero", - "fecha", - "feliz", - "feo", - "feria", - "feroz", - "fértil", - "fervor", - "festín", - "fiable", - "fianza", - "fiar", - "fibra", - "ficción", - "ficha", - "fideo", - "fiebre", - "fiel", - "fiera", - "fiesta", - "figura", - "fijar", - "fijo", - "fila", - "filete", - "filial", - "filtro", - "fin", - "finca", - "fingir", - "finito", - "firma", - "flaco", - "flauta", - "flecha", - "flor", - "flota", - "fluir", - "flujo", - "flúor", - "fobia", - "foca", - "fogata", - "fogón", - "folio", - "folleto", - "fondo", - "forma", - "forro", - "fortuna", - "forzar", - "fosa", - "foto", - "fracaso", - "frágil", - "franja", - "frase", - "fraude", - "freír", - "freno", - "fresa", - "frío", - "frito", - "fruta", - "fuego", - "fuente", - "fuerza", - "fuga", - "fumar", - "función", - "funda", - "furgón", - "furia", - "fusil", - "fútbol", - "futuro", - "gacela", - "gafas", - "gaita", - "gajo", - "gala", - "galería", - "gallo", - "gamba", - "ganar", - "gancho", - "ganga", - "ganso", - "garaje", - "garza", - "gasolina", - "gastar", - "gato", - "gavilán", - "gemelo", - "gemir", - "gen", - "género", - "genio", - "gente", - "geranio", - "gerente", - "germen", - "gesto", - "gigante", - "gimnasio", - "girar", - "giro", - "glaciar", - "globo", - "gloria", - "gol", - "golfo", - "goloso", - "golpe", - "goma", - "gordo", - "gorila", - "gorra", - "gota", - "goteo", - "gozar", - "grada", - "gráfico", - "grano", - "grasa", - "gratis", - "grave", - "grieta", - "grillo", - "gripe", - "gris", - "grito", - "grosor", - "grúa", - "grueso", - "grumo", - "grupo", - "guante", - "guapo", - "guardia", - "guerra", - "guía", - "guiño", - "guion", - "guiso", - "guitarra", - "gusano", - "gustar", - "haber", - "hábil", - "hablar", - "hacer", - "hacha", - "hada", - "hallar", - "hamaca", - "harina", - "haz", - "hazaña", - "hebilla", - "hebra", - "hecho", - "helado", - "helio", - "hembra", - "herir", - "hermano", - "héroe", - "hervir", - "hielo", - "hierro", - "hígado", - "higiene", - "hijo", - "himno", - "historia", - "hocico", - "hogar", - "hoguera", - "hoja", - "hombre", - "hongo", - "honor", - "honra", - "hora", - "hormiga", - "horno", - "hostil", - "hoyo", - "hueco", - "huelga", - "huerta", - "hueso", - "huevo", - "huida", - "huir", - "humano", - "húmedo", - "humilde", - "humo", - "hundir", - "huracán", - "hurto", - "icono", - "ideal", - "idioma", - "ídolo", - "iglesia", - "iglú", - "igual", - "ilegal", - "ilusión", - "imagen", - "imán", - "imitar", - "impar", - "imperio", - "imponer", - "impulso", - "incapaz", - "índice", - "inerte", - "infiel", - "informe", - "ingenio", - "inicio", - "inmenso", - "inmune", - "innato", - "insecto", - "instante", - "interés", - "íntimo", - "intuir", - "inútil", - "invierno", - "ira", - "iris", - "ironía", - "isla", - "islote", - "jabalí", - "jabón", - "jamón", - "jarabe", - "jardín", - "jarra", - "jaula", - "jazmín", - "jefe", - "jeringa", - "jinete", - "jornada", - "joroba", - "joven", - "joya", - "juerga", - "jueves", - "juez", - "jugador", - "jugo", - "juguete", - "juicio", - "junco", - "jungla", - "junio", - "juntar", - "júpiter", - "jurar", - "justo", - "juvenil", - "juzgar", - "kilo", - "koala", - "labio", - "lacio", - "lacra", - "lado", - "ladrón", - "lagarto", - "lágrima", - "laguna", - "laico", - "lamer", - "lámina", - "lámpara", - "lana", - "lancha", - "langosta", - "lanza", - "lápiz", - "largo", - "larva", - "lástima", - "lata", - "látex", - "latir", - "laurel", - "lavar", - "lazo", - "leal", - "lección", - "leche", - "lector", - "leer", - "legión", - "legumbre", - "lejano", - "leña", - "lengua", - "lento", - "león", - "leopardo", - "lesión", - "letal", - "letra", - "leve", - "leyenda", - "libertad", - "libro", - "licor", - "líder", - "lidiar", - "lienzo", - "liga", - "ligero", - "lima", - "límite", - "limón", - "limpio", - "lince", - "lindo", - "línea", - "lingote", - "lino", - "linterna", - "líquido", - "liso", - "lista", - "litera", - "litio", - "litro", - "llaga", - "llama", - "llanto", - "llave", - "llegar", - "llenar", - "llevar", - "llorar", - "llover", - "lluvia", - "lobo", - "loción", - "loco", - "locura", - "lógica", - "logro", - "lombriz", - "lomo", - "lonja", - "lote", - "lucha", - "lucir", - "lugar", - "lujo", - "luna", - "lunes", - "lupa", - "lustro", - "luto", - "luz", - "maceta", - "macho", - "madera", - "madre", - "maduro", - "maestro", - "mafia", - "magia", - "mago", - "maíz", - "maldad", - "maleta", - "malla", - "malo", - "mamá", - "mambo", - "mamut", - "mañana", - "manco", - "mando", - "manejar", - "manga", - "maniquí", - "manjar", - "mano", - "manso", - "manta", - "mapa", - "máquina", - "mar", - "marco", - "marea", - "marfil", - "margen", - "marido", - "mármol", - "marrón", - "martes", - "marzo", - "masa", - "máscara", - "masivo", - "matar", - "materia", - "matiz", - "matriz", - "máximo", - "mayor", - "mazorca", - "mecha", - "medalla", - "medio", - "médula", - "mejilla", - "mejor", - "melena", - "melón", - "memoria", - "menor", - "mensaje", - "mente", - "menú", - "mercado", - "merengue", - "mérito", - "mes", - "mesón", - "meta", - "meter", - "método", - "metro", - "mezcla", - "miedo", - "miel", - "miembro", - "miga", - "mil", - "milagro", - "militar", - "millón", - "mimo", - "mina", - "minero", - "mínimo", - "minuto", - "miope", - "mirar", - "misa", - "miseria", - "misil", - "mismo", - "mitad", - "mito", - "mochila", - "moción", - "moda", - "modelo", - "moho", - "mojar", - "molde", - "moler", - "molino", - "momento", - "momia", - "monarca", - "moneda", - "monja", - "moño", - "monto", - "morada", - "morder", - "moreno", - "morir", - "morro", - "morsa", - "mortal", - "mosca", - "mostrar", - "motivo", - "mover", - "móvil", - "mozo", - "mucho", - "mudar", - "mueble", - "muela", - "muerte", - "muestra", - "mugre", - "mujer", - "mula", - "muleta", - "multa", - "mundo", - "muñeca", - "mural", - "muro", - "músculo", - "museo", - "musgo", - "música", - "muslo", - "nácar", - "nación", - "nadar", - "naipe", - "naranja", - "nariz", - "narrar", - "nasal", - "natal", - "nativo", - "natural", - "náusea", - "naval", - "nave", - "navidad", - "necio", - "néctar", - "negar", - "negocio", - "negro", - "neón", - "nervio", - "neto", - "neutro", - "nevar", - "nevera", - "nicho", - "nido", - "niebla", - "nieto", - "niñez", - "niño", - "nítido", - "nivel", - "nobleza", - "noche", - "nómina", - "noria", - "norma", - "norte", - "nota", - "noticia", - "novato", - "novela", - "novio", - "nube", - "nuca", - "núcleo", - "nudillo", - "nudo", - "nuera", - "nueve", - "nuez", - "nulo", - "número", - "nutria", - "oasis", - "obeso", - "obispo", - "objeto", - "obra", - "obrero", - "observar", - "obtener", - "obvio", - "oca", - "ocaso", - "océano", - "ochenta", - "ocho", - "ocio", - "ocre", - "octavo", - "octubre", - "oculto", - "ocupar", - "ocurrir", - "odiar", - "odio", - "odisea", - "oeste", - "ofensa", - "oferta", - "oficio", - "ofrecer", - "ogro", - "oído", - "oír", - "ojo", - "ola", - "oleada", - "olfato", - "olivo", - "olla", - "olmo", - "olor", - "olvido", - "ombligo", - "onda", - "onza", - "opaco", - "opción", - "ópera", - "opinar", - "oponer", - "optar", - "óptica", - "opuesto", - "oración", - "orador", - "oral", - "órbita", - "orca", - "orden", - "oreja", - "órgano", - "orgía", - "orgullo", - "oriente", - "origen", - "orilla", - "oro", - "orquesta", - "oruga", - "osadía", - "oscuro", - "osezno", - "oso", - "ostra", - "otoño", - "otro", - "oveja", - "óvulo", - "óxido", - "oxígeno", - "oyente", - "ozono", - "pacto", - "padre", - "paella", - "página", - "pago", - "país", - "pájaro", - "palabra", - "palco", - "paleta", - "pálido", - "palma", - "paloma", - "palpar", - "pan", - "panal", - "pánico", - "pantera", - "pañuelo", - "papá", - "papel", - "papilla", - "paquete", - "parar", - "parcela", - "pared", - "parir", - "paro", - "párpado", - "parque", - "párrafo", - "parte", - "pasar", - "paseo", - "pasión", - "paso", - "pasta", - "pata", - "patio", - "patria", - "pausa", - "pauta", - "pavo", - "payaso", - "peatón", - "pecado", - "pecera", - "pecho", - "pedal", - "pedir", - "pegar", - "peine", - "pelar", - "peldaño", - "pelea", - "peligro", - "pellejo", - "pelo", - "peluca", - "pena", - "peñón", - "pensar", - "peón", - "peor", - "pepino", - "pequeño", - "pera", - "percha", - "perder", - "pereza", - "perfil", - "perico", - "perla", - "permiso", - "perro", - "persona", - "pesa", - "pesca", - "pésimo", - "pestaña", - "pétalo", - "petróleo", - "pez", - "pezuña", - "picar", - "pichón", - "pie", - "piedra", - "pierna", - "pieza", - "pijama", - "pilar", - "piloto", - "pimienta", - "piña", - "pino", - "pintor", - "pinza", - "piojo", - "pipa", - "pirata", - "pisar", - "piscina", - "piso", - "pista", - "pitón", - "pizca", - "placa", - "plan", - "plata", - "playa", - "plaza", - "pleito", - "pleno", - "plomo", - "pluma", - "plural", - "pobre", - "poco", - "poder", - "podio", - "poema", - "poesía", - "poeta", - "polen", - "policía", - "pollo", - "polvo", - "pomada", - "pomelo", - "pomo", - "pompa", - "poner", - "porción", - "portal", - "posada", - "poseer", - "posible", - "poste", - "potencia", - "potro", - "pozo", - "prado", - "precoz", - "pregunta", - "premio", - "prensa", - "preso", - "previo", - "primo", - "príncipe", - "prisión", - "privar", - "proa", - "probar", - "proceso", - "producto", - "proeza", - "profesor", - "programa", - "prole", - "promesa", - "pronto", - "propio", - "próximo", - "prueba", - "público", - "puchero", - "pudor", - "pueblo", - "puerta", - "puesto", - "pulga", - "pulir", - "pulmón", - "pulpo", - "pulso", - "puma", - "puñal", - "puño", - "punto", - "pupa", - "pupila", - "puré", - "quedar", - "queja", - "quemar", - "querer", - "queso", - "quieto", - "química", - "quince", - "quitar", - "rábano", - "rabia", - "rabo", - "ración", - "radical", - "raíz", - "rama", - "rampa", - "rancho", - "rango", - "rapaz", - "rápido", - "rapto", - "rasgo", - "raspa", - "rato", - "rayo", - "raza", - "razón", - "reacción", - "realidad", - "rebaño", - "rebote", - "recaer", - "receta", - "rechazo", - "recoger", - "recreo", - "recto", - "recurso", - "red", - "redondo", - "reducir", - "reflejo", - "reforma", - "refrán", - "refugio", - "regalo", - "regir", - "regla", - "regreso", - "rehén", - "reino", - "reír", - "reja", - "relato", - "relevo", - "relieve", - "relleno", - "reloj", - "remar", - "remedio", - "remo", - "rencor", - "rendir", - "renta", - "reparto", - "repetir", - "reposo", - "reptil", - "res", - "rescate", - "resina", - "respeto", - "resto", - "resumen", - "retiro", - "retorno", - "retrato", - "reunir", - "revés", - "revista", - "rey", - "rezar", - "rico", - "riego", - "rienda", - "riesgo", - "rifa", - "rígido", - "rigor", - "rincón", - "riñón", - "río", - "riqueza", - "risa", - "ritmo", - "rito", - "rizo", - "roble", - "roce", - "rociar", - "rodar", - "rodeo", - "rodilla", - "roer", - "rojizo", - "rojo", - "romero", - "romper", - "ron", - "ronco", - "ronda", - "ropa", - "ropero", - "rosa", - "rosca", - "rostro", - "rotar", - "rubí", - "rubor", - "rudo", - "rueda", - "rugir", - "ruido", - "ruina", - "ruleta", - "rulo", - "rumbo", - "rumor", - "ruptura", - "ruta", - "rutina", - "sábado", - "saber", - "sabio", - "sable", - "sacar", - "sagaz", - "sagrado", - "sala", - "saldo", - "salero", - "salir", - "salmón", - "salón", - "salsa", - "salto", - "salud", - "salvar", - "samba", - "sanción", - "sandía", - "sanear", - "sangre", - "sanidad", - "sano", - "santo", - "sapo", - "saque", - "sardina", - "sartén", - "sastre", - "satán", - "sauna", - "saxofón", - "sección", - "seco", - "secreto", - "secta", - "sed", - "seguir", - "seis", - "sello", - "selva", - "semana", - "semilla", - "señal", - "senda", - "señor", - "sensor", - "separar", - "sepia", - "sequía", - "ser", - "serie", - "sermón", - "servir", - "sesenta", - "sesión", - "seta", - "setenta", - "severo", - "sexo", - "sexto", - "sidra", - "siesta", - "siete", - "siglo", - "signo", - "sílaba", - "silbar", - "silencio", - "silla", - "símbolo", - "simio", - "sirena", - "sistema", - "sitio", - "situar", - "sobre", - "socio", - "sodio", - "sol", - "solapa", - "soldado", - "soledad", - "sólido", - "soltar", - "solución", - "sombra", - "sondeo", - "sonido", - "sonoro", - "sonrisa", - "sopa", - "soplar", - "soporte", - "sordo", - "sorpresa", - "sorteo", - "sostén", - "sótano", - "suave", - "subir", - "suceso", - "sudor", - "suegra", - "suelo", - "sueño", - "suerte", - "sufrir", - "sujeto", - "sultán", - "sumar", - "superar", - "suplir", - "suponer", - "supremo", - "sur", - "surco", - "sureño", - "surgir", - "susto", - "sutil", - "tabaco", - "tabique", - "tabla", - "tabú", - "taco", - "tacto", - "tajo", - "talar", - "talco", - "talento", - "talla", - "talón", - "tamaño", - "tambor", - "tango", - "tanque", - "tapa", - "tapete", - "tapia", - "tapón", - "taquilla", - "tarde", - "tarea", - "tarifa", - "tarjeta", - "tarot", - "tarro", - "tarta", - "tatuaje", - "tauro", - "taza", - "tazón", - "teatro", - "techo", - "tecla", - "técnica", - "tejado", - "tejer", - "tejido", - "tela", - "teléfono", - "tema", - "temor", - "templo", - "tenaz", - "tender", - "tener", - "tenis", - "tenso", - "teoría", - "terapia", - "terco", - "término", - "ternura", - "terror", - "tesis", - "tesoro", - "testigo", - "tetera", - "texto", - "tez", - "tibio", - "tiburón", - "tiempo", - "tienda", - "tierra", - "tieso", - "tigre", - "tijera", - "tilde", - "timbre", - "tímido", - "timo", - "tinta", - "tío", - "típico", - "tipo", - "tira", - "tirón", - "titán", - "títere", - "título", - "tiza", - "toalla", - "tobillo", - "tocar", - "tocino", - "todo", - "toga", - "toldo", - "tomar", - "tono", - "tonto", - "topar", - "tope", - "toque", - "tórax", - "torero", - "tormenta", - "torneo", - "toro", - "torpedo", - "torre", - "torso", - "tortuga", - "tos", - "tosco", - "toser", - "tóxico", - "trabajo", - "tractor", - "traer", - "tráfico", - "trago", - "traje", - "tramo", - "trance", - "trato", - "trauma", - "trazar", - "trébol", - "tregua", - "treinta", - "tren", - "trepar", - "tres", - "tribu", - "trigo", - "tripa", - "triste", - "triunfo", - "trofeo", - "trompa", - "tronco", - "tropa", - "trote", - "trozo", - "truco", - "trueno", - "trufa", - "tubería", - "tubo", - "tuerto", - "tumba", - "tumor", - "túnel", - "túnica", - "turbina", - "turismo", - "turno", - "tutor", - "ubicar", - "úlcera", - "umbral", - "uña", - "unidad", - "unir", - "universo", - "uno", - "untar", - "urbano", - "urbe", - "urgente", - "urna", - "usar", - "usuario", - "útil", - "utopía", - "uva", - "vaca", - "vacío", - "vacuna", - "vagar", - "vago", - "vaina", - "vajilla", - "vale", - "válido", - "valle", - "valor", - "válvula", - "vampiro", - "vara", - "variar", - "varón", - "vaso", - "vecino", - "vector", - "vehículo", - "veinte", - "vejez", - "vela", - "velero", - "veloz", - "vena", - "vencer", - "venda", - "veneno", - "vengar", - "venir", - "venta", - "venus", - "ver", - "verano", - "verbo", - "verde", - "vereda", - "verja", - "verso", - "verter", - "vía", - "viaje", - "vibrar", - "vicio", - "víctima", - "vida", - "vídeo", - "vidrio", - "viejo", - "viernes", - "vigor", - "vil", - "villa", - "vinagre", - "viñedo", - "vino", - "violín", - "viral", - "virgo", - "virtud", - "visor", - "víspera", - "vista", - "vitamina", - "viudo", - "vivaz", - "vivero", - "vivir", - "vivo", - "volcán", - "volumen", - "volver", - "voraz", - "votar", - "voto", - "voz", - "vuelo", - "vulgar", - "yacer", - "yate", - "yegua", - "yema", - "yerno", - "yeso", - "yodo", - "yoga", - "yogur", - "zafiro", - "zanja", - "zapato", - "zarza", - "zona", - "zorro", - "zumo", - "zurdo" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/fr.rs b/networks/monero/wallet/polyseed/src/words/fr.rs deleted file mode 100644 index 5b3303e9f..000000000 --- a/networks/monero/wallet/polyseed/src/words/fr.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "abaisser", - "abandon", - "abdiquer", - "abeille", - "abolir", - "aborder", - "aboutir", - "aboyer", - "abrasif", - "abreuver", - "abriter", - "abroger", - "abrupt", - "absence", - "absolu", - "absurde", - "abusif", - "abyssal", - "académie", - "acajou", - "acarien", - "accabler", - "accepter", - "acclamer", - "accolade", - "accroche", - "accuser", - "acerbe", - "achat", - "acheter", - "aciduler", - "acier", - "acompte", - "acquérir", - "acronyme", - "acteur", - "actif", - "actuel", - "adepte", - "adéquat", - "adhésif", - "adjectif", - "adjuger", - "admettre", - "admirer", - "adopter", - "adorer", - "adoucir", - "adresse", - "adroit", - "adulte", - "adverbe", - "aérer", - "aéronef", - "affaire", - "affecter", - "affiche", - "affreux", - "affubler", - "agacer", - "agencer", - "agile", - "agiter", - "agrafer", - "agréable", - "agrume", - "aider", - "aiguille", - "ailier", - "aimable", - "aisance", - "ajouter", - "ajuster", - "alarmer", - "alchimie", - "alerte", - "algèbre", - "algue", - "aliéner", - "aliment", - "alléger", - "alliage", - "allouer", - "allumer", - "alourdir", - "alpaga", - "altesse", - "alvéole", - "amateur", - "ambigu", - "ambre", - "aménager", - "amertume", - "amidon", - "amiral", - "amorcer", - "amour", - "amovible", - "amphibie", - "ampleur", - "amusant", - "analyse", - "anaphore", - "anarchie", - "anatomie", - "ancien", - "anéantir", - "angle", - "angoisse", - "anguleux", - "animal", - "annexer", - "annonce", - "annuel", - "anodin", - "anomalie", - "anonyme", - "anormal", - "antenne", - "antidote", - "anxieux", - "apaiser", - "apéritif", - "aplanir", - "apologie", - "appareil", - "appeler", - "apporter", - "appuyer", - "aquarium", - "aqueduc", - "arbitre", - "arbuste", - "ardeur", - "ardoise", - "argent", - "arlequin", - "armature", - "armement", - "armoire", - "armure", - "arpenter", - "arracher", - "arriver", - "arroser", - "arsenic", - "artériel", - "article", - "aspect", - "asphalte", - "aspirer", - "assaut", - "asservir", - "assiette", - "associer", - "assurer", - "asticot", - "astre", - "astuce", - "atelier", - "atome", - "atrium", - "atroce", - "attaque", - "attentif", - "attirer", - "attraper", - "aubaine", - "auberge", - "audace", - "audible", - "augurer", - "aurore", - "automne", - "autruche", - "avaler", - "avancer", - "avarice", - "avenir", - "averse", - "aveugle", - "aviateur", - "avide", - "avion", - "aviser", - "avoine", - "avouer", - "avril", - "axial", - "axiome", - "badge", - "bafouer", - "bagage", - "baguette", - "baignade", - "balancer", - "balcon", - "baleine", - "balisage", - "bambin", - "bancaire", - "bandage", - "banlieue", - "bannière", - "banquier", - "barbier", - "baril", - "baron", - "barque", - "barrage", - "bassin", - "bastion", - "bataille", - "bateau", - "batterie", - "baudrier", - "bavarder", - "belette", - "bélier", - "belote", - "bénéfice", - "berceau", - "berger", - "berline", - "bermuda", - "besace", - "besogne", - "bétail", - "beurre", - "biberon", - "bicycle", - "bidule", - "bijou", - "bilan", - "bilingue", - "billard", - "binaire", - "biologie", - "biopsie", - "biotype", - "biscuit", - "bison", - "bistouri", - "bitume", - "bizarre", - "blafard", - "blague", - "blanchir", - "blessant", - "blinder", - "blond", - "bloquer", - "blouson", - "bobard", - "bobine", - "boire", - "boiser", - "bolide", - "bonbon", - "bondir", - "bonheur", - "bonifier", - "bonus", - "bordure", - "borne", - "botte", - "boucle", - "boueux", - "bougie", - "boulon", - "bouquin", - "bourse", - "boussole", - "boutique", - "boxeur", - "branche", - "brasier", - "brave", - "brebis", - "brèche", - "breuvage", - "bricoler", - "brigade", - "brillant", - "brioche", - "brique", - "brochure", - "broder", - "bronzer", - "brousse", - "broyeur", - "brume", - "brusque", - "brutal", - "bruyant", - "buffle", - "buisson", - "bulletin", - "bureau", - "burin", - "bustier", - "butiner", - "butoir", - "buvable", - "buvette", - "cabanon", - "cabine", - "cachette", - "cadeau", - "cadre", - "caféine", - "caillou", - "caisson", - "calculer", - "calepin", - "calibre", - "calmer", - "calomnie", - "calvaire", - "camarade", - "caméra", - "camion", - "campagne", - "canal", - "caneton", - "canon", - "cantine", - "canular", - "capable", - "caporal", - "caprice", - "capsule", - "capter", - "capuche", - "carabine", - "carbone", - "caresser", - "caribou", - "carnage", - "carotte", - "carreau", - "carton", - "cascade", - "casier", - "casque", - "cassure", - "causer", - "caution", - "cavalier", - "caverne", - "caviar", - "cédille", - "ceinture", - "céleste", - "cellule", - "cendrier", - "censurer", - "central", - "cercle", - "cérébral", - "cerise", - "cerner", - "cerveau", - "cesser", - "chagrin", - "chaise", - "chaleur", - "chambre", - "chance", - "chapitre", - "charbon", - "chasseur", - "chaton", - "chausson", - "chavirer", - "chemise", - "chenille", - "chéquier", - "chercher", - "cheval", - "chien", - "chiffre", - "chignon", - "chimère", - "chiot", - "chlorure", - "chocolat", - "choisir", - "chose", - "chouette", - "chrome", - "chute", - "cigare", - "cigogne", - "cimenter", - "cinéma", - "cintrer", - "circuler", - "cirer", - "cirque", - "citerne", - "citoyen", - "citron", - "civil", - "clairon", - "clameur", - "claquer", - "classe", - "clavier", - "client", - "cligner", - "climat", - "clivage", - "cloche", - "clonage", - "cloporte", - "cobalt", - "cobra", - "cocasse", - "cocotier", - "coder", - "codifier", - "coffre", - "cogner", - "cohésion", - "coiffer", - "coincer", - "colère", - "colibri", - "colline", - "colmater", - "colonel", - "combat", - "comédie", - "commande", - "compact", - "concert", - "conduire", - "confier", - "congeler", - "connoter", - "consonne", - "contact", - "convexe", - "copain", - "copie", - "corail", - "corbeau", - "cordage", - "corniche", - "corpus", - "correct", - "cortège", - "cosmique", - "costume", - "coton", - "coude", - "coupure", - "courage", - "couteau", - "couvrir", - "coyote", - "crabe", - "crainte", - "cravate", - "crayon", - "créature", - "créditer", - "crémeux", - "creuser", - "crevette", - "cribler", - "crier", - "cristal", - "critère", - "croire", - "croquer", - "crotale", - "crucial", - "cruel", - "crypter", - "cubique", - "cueillir", - "cuillère", - "cuisine", - "cuivre", - "culminer", - "cultiver", - "cumuler", - "cupide", - "curatif", - "curseur", - "cyanure", - "cycle", - "cylindre", - "cynique", - "daigner", - "damier", - "danger", - "danseur", - "dauphin", - "débattre", - "débiter", - "déborder", - "débrider", - "débutant", - "décaler", - "décembre", - "déchirer", - "décider", - "déclarer", - "décorer", - "décrire", - "décupler", - "dédale", - "déductif", - "déesse", - "défensif", - "défiler", - "défrayer", - "dégager", - "dégivrer", - "déglutir", - "dégrafer", - "déjeuner", - "délice", - "déloger", - "demander", - "demeurer", - "démolir", - "dénicher", - "dénouer", - "dentelle", - "dénuder", - "départ", - "dépenser", - "déphaser", - "déplacer", - "déposer", - "déranger", - "dérober", - "désastre", - "descente", - "désert", - "désigner", - "désobéir", - "dessiner", - "destrier", - "détacher", - "détester", - "détourer", - "détresse", - "devancer", - "devenir", - "deviner", - "devoir", - "diable", - "dialogue", - "diamant", - "dicter", - "différer", - "digérer", - "digital", - "digne", - "diluer", - "dimanche", - "diminuer", - "dioxyde", - "directif", - "diriger", - "discuter", - "disposer", - "dissiper", - "distance", - "divertir", - "diviser", - "docile", - "docteur", - "dogme", - "doigt", - "domaine", - "domicile", - "dompter", - "donateur", - "donjon", - "donner", - "dopamine", - "dortoir", - "dorure", - "dosage", - "doseur", - "dossier", - "dotation", - "douanier", - "double", - "douceur", - "douter", - "doyen", - "dragon", - "draper", - "dresser", - "dribbler", - "droiture", - "duperie", - "duplexe", - "durable", - "durcir", - "dynastie", - "éblouir", - "écarter", - "écharpe", - "échelle", - "éclairer", - "éclipse", - "éclore", - "écluse", - "école", - "économie", - "écorce", - "écouter", - "écraser", - "écrémer", - "écrivain", - "écrou", - "écume", - "écureuil", - "édifier", - "éduquer", - "effacer", - "effectif", - "effigie", - "effort", - "effrayer", - "effusion", - "égaliser", - "égarer", - "éjecter", - "élaborer", - "élargir", - "électron", - "élégant", - "éléphant", - "élève", - "éligible", - "élitisme", - "éloge", - "élucider", - "éluder", - "emballer", - "embellir", - "embryon", - "émeraude", - "émission", - "emmener", - "émotion", - "émouvoir", - "empereur", - "employer", - "emporter", - "emprise", - "émulsion", - "encadrer", - "enchère", - "enclave", - "encoche", - "endiguer", - "endosser", - "endroit", - "enduire", - "énergie", - "enfance", - "enfermer", - "enfouir", - "engager", - "engin", - "englober", - "énigme", - "enjamber", - "enjeu", - "enlever", - "ennemi", - "ennuyeux", - "enrichir", - "enrobage", - "enseigne", - "entasser", - "entendre", - "entier", - "entourer", - "entraver", - "énumérer", - "envahir", - "enviable", - "envoyer", - "enzyme", - "éolien", - "épaissir", - "épargne", - "épatant", - "épaule", - "épicerie", - "épidémie", - "épier", - "épilogue", - "épine", - "épisode", - "épitaphe", - "époque", - "épreuve", - "éprouver", - "épuisant", - "équerre", - "équipe", - "ériger", - "érosion", - "erreur", - "éruption", - "escalier", - "espadon", - "espèce", - "espiègle", - "espoir", - "esprit", - "esquiver", - "essayer", - "essence", - "essieu", - "essorer", - "estime", - "estomac", - "estrade", - "étagère", - "étaler", - "étanche", - "étatique", - "éteindre", - "étendoir", - "éternel", - "éthanol", - "éthique", - "ethnie", - "étirer", - "étoffer", - "étoile", - "étonnant", - "étourdir", - "étrange", - "étroit", - "étude", - "euphorie", - "évaluer", - "évasion", - "éventail", - "évidence", - "éviter", - "évolutif", - "évoquer", - "exact", - "exagérer", - "exaucer", - "exceller", - "excitant", - "exclusif", - "excuse", - "exécuter", - "exemple", - "exercer", - "exhaler", - "exhorter", - "exigence", - "exiler", - "exister", - "exotique", - "expédier", - "explorer", - "exposer", - "exprimer", - "exquis", - "extensif", - "extraire", - "exulter", - "fable", - "fabuleux", - "facette", - "facile", - "facture", - "faiblir", - "falaise", - "fameux", - "famille", - "farceur", - "farfelu", - "farine", - "farouche", - "fasciner", - "fatal", - "fatigue", - "faucon", - "fautif", - "faveur", - "favori", - "fébrile", - "féconder", - "fédérer", - "félin", - "femme", - "fémur", - "fendoir", - "féodal", - "fermer", - "féroce", - "ferveur", - "festival", - "feuille", - "feutre", - "février", - "fiasco", - "ficeler", - "fictif", - "fidèle", - "figure", - "filature", - "filetage", - "filière", - "filleul", - "filmer", - "filou", - "filtrer", - "financer", - "finir", - "fiole", - "firme", - "fissure", - "fixer", - "flairer", - "flamme", - "flasque", - "flatteur", - "fléau", - "flèche", - "fleur", - "flexion", - "flocon", - "flore", - "fluctuer", - "fluide", - "fluvial", - "folie", - "fonderie", - "fongible", - "fontaine", - "forcer", - "forgeron", - "formuler", - "fortune", - "fossile", - "foudre", - "fougère", - "fouiller", - "foulure", - "fourmi", - "fragile", - "fraise", - "franchir", - "frapper", - "frayeur", - "frégate", - "freiner", - "frelon", - "frémir", - "frénésie", - "frère", - "friable", - "friction", - "frisson", - "frivole", - "froid", - "fromage", - "frontal", - "frotter", - "fruit", - "fugitif", - "fuite", - "fureur", - "furieux", - "furtif", - "fusion", - "futur", - "gagner", - "galaxie", - "galerie", - "gambader", - "garantir", - "gardien", - "garnir", - "garrigue", - "gazelle", - "gazon", - "géant", - "gélatine", - "gélule", - "gendarme", - "général", - "génie", - "genou", - "gentil", - "géologie", - "géomètre", - "géranium", - "germe", - "gestuel", - "geyser", - "gibier", - "gicler", - "girafe", - "givre", - "glace", - "glaive", - "glisser", - "globe", - "gloire", - "glorieux", - "golfeur", - "gomme", - "gonfler", - "gorge", - "gorille", - "goudron", - "gouffre", - "goulot", - "goupille", - "gourmand", - "goutte", - "graduel", - "graffiti", - "graine", - "grand", - "grappin", - "gratuit", - "gravir", - "grenat", - "griffure", - "griller", - "grimper", - "grogner", - "gronder", - "grotte", - "groupe", - "gruger", - "grutier", - "gruyère", - "guépard", - "guerrier", - "guide", - "guimauve", - "guitare", - "gustatif", - "gymnaste", - "gyrostat", - "habitude", - "hachoir", - "halte", - "hameau", - "hangar", - "hanneton", - "haricot", - "harmonie", - "harpon", - "hasard", - "hélium", - "hématome", - "herbe", - "hérisson", - "hermine", - "héron", - "hésiter", - "heureux", - "hiberner", - "hibou", - "hilarant", - "histoire", - "hiver", - "homard", - "hommage", - "homogène", - "honneur", - "honorer", - "honteux", - "horde", - "horizon", - "horloge", - "hormone", - "horrible", - "houleux", - "housse", - "hublot", - "huileux", - "humain", - "humble", - "humide", - "humour", - "hurler", - "hydromel", - "hygiène", - "hymne", - "hypnose", - "idylle", - "ignorer", - "iguane", - "illicite", - "illusion", - "image", - "imbiber", - "imiter", - "immense", - "immobile", - "immuable", - "impact", - "impérial", - "implorer", - "imposer", - "imprimer", - "imputer", - "incarner", - "incendie", - "incident", - "incliner", - "incolore", - "indexer", - "indice", - "inductif", - "inédit", - "ineptie", - "inexact", - "infini", - "infliger", - "informer", - "infusion", - "ingérer", - "inhaler", - "inhiber", - "injecter", - "injure", - "innocent", - "inoculer", - "inonder", - "inscrire", - "insecte", - "insigne", - "insolite", - "inspirer", - "instinct", - "insulter", - "intact", - "intense", - "intime", - "intrigue", - "intuitif", - "inutile", - "invasion", - "inventer", - "inviter", - "invoquer", - "ironique", - "irradier", - "irréel", - "irriter", - "isoler", - "ivoire", - "ivresse", - "jaguar", - "jaillir", - "jambe", - "janvier", - "jardin", - "jauger", - "jaune", - "javelot", - "jetable", - "jeton", - "jeudi", - "jeunesse", - "joindre", - "joncher", - "jongler", - "joueur", - "jouissif", - "journal", - "jovial", - "joyau", - "joyeux", - "jubiler", - "jugement", - "junior", - "jupon", - "juriste", - "justice", - "juteux", - "juvénile", - "kayak", - "kimono", - "kiosque", - "label", - "labial", - "labourer", - "lacérer", - "lactose", - "lagune", - "laine", - "laisser", - "laitier", - "lambeau", - "lamelle", - "lampe", - "lanceur", - "langage", - "lanterne", - "lapin", - "largeur", - "larme", - "laurier", - "lavabo", - "lavoir", - "lecture", - "légal", - "léger", - "légume", - "lessive", - "lettre", - "levier", - "lexique", - "lézard", - "liasse", - "libérer", - "libre", - "licence", - "licorne", - "liège", - "lièvre", - "ligature", - "ligoter", - "ligue", - "limer", - "limite", - "limonade", - "limpide", - "linéaire", - "lingot", - "lionceau", - "liquide", - "lisière", - "lister", - "lithium", - "litige", - "littoral", - "livreur", - "logique", - "lointain", - "loisir", - "lombric", - "loterie", - "louer", - "lourd", - "loutre", - "louve", - "loyal", - "lubie", - "lucide", - "lucratif", - "lueur", - "lugubre", - "luisant", - "lumière", - "lunaire", - "lundi", - "luron", - "lutter", - "luxueux", - "machine", - "magasin", - "magenta", - "magique", - "maigre", - "maillon", - "maintien", - "mairie", - "maison", - "majorer", - "malaxer", - "maléfice", - "malheur", - "malice", - "mallette", - "mammouth", - "mandater", - "maniable", - "manquant", - "manteau", - "manuel", - "marathon", - "marbre", - "marchand", - "mardi", - "maritime", - "marqueur", - "marron", - "marteler", - "mascotte", - "massif", - "matériel", - "matière", - "matraque", - "maudire", - "maussade", - "mauve", - "maximal", - "méchant", - "méconnu", - "médaille", - "médecin", - "méditer", - "méduse", - "meilleur", - "mélange", - "mélodie", - "membre", - "mémoire", - "menacer", - "mener", - "menhir", - "mensonge", - "mentor", - "mercredi", - "mérite", - "merle", - "messager", - "mesure", - "métal", - "météore", - "méthode", - "métier", - "meuble", - "miauler", - "microbe", - "miette", - "mignon", - "migrer", - "milieu", - "million", - "mimique", - "mince", - "minéral", - "minimal", - "minorer", - "minute", - "miracle", - "miroiter", - "missile", - "mixte", - "mobile", - "moderne", - "moelleux", - "mondial", - "moniteur", - "monnaie", - "monotone", - "monstre", - "montagne", - "monument", - "moqueur", - "morceau", - "morsure", - "mortier", - "moteur", - "motif", - "mouche", - "moufle", - "moulin", - "mousson", - "mouton", - "mouvant", - "multiple", - "munition", - "muraille", - "murène", - "murmure", - "muscle", - "muséum", - "musicien", - "mutation", - "muter", - "mutuel", - "myriade", - "myrtille", - "mystère", - "mythique", - "nageur", - "nappe", - "narquois", - "narrer", - "natation", - "nation", - "nature", - "naufrage", - "nautique", - "navire", - "nébuleux", - "nectar", - "néfaste", - "négation", - "négliger", - "négocier", - "neige", - "nerveux", - "nettoyer", - "neurone", - "neutron", - "neveu", - "niche", - "nickel", - "nitrate", - "niveau", - "noble", - "nocif", - "nocturne", - "noirceur", - "noisette", - "nomade", - "nombreux", - "nommer", - "normatif", - "notable", - "notifier", - "notoire", - "nourrir", - "nouveau", - "novateur", - "novembre", - "novice", - "nuage", - "nuancer", - "nuire", - "nuisible", - "numéro", - "nuptial", - "nuque", - "nutritif", - "obéir", - "objectif", - "obliger", - "obscur", - "observer", - "obstacle", - "obtenir", - "obturer", - "occasion", - "occuper", - "océan", - "octobre", - "octroyer", - "octupler", - "oculaire", - "odeur", - "odorant", - "offenser", - "officier", - "offrir", - "ogive", - "oiseau", - "oisillon", - "olfactif", - "olivier", - "ombrage", - "omettre", - "onctueux", - "onduler", - "onéreux", - "onirique", - "opale", - "opaque", - "opérer", - "opinion", - "opportun", - "opprimer", - "opter", - "optique", - "orageux", - "orange", - "orbite", - "ordonner", - "oreille", - "organe", - "orgueil", - "orifice", - "ornement", - "orque", - "ortie", - "osciller", - "osmose", - "ossature", - "otarie", - "ouragan", - "ourson", - "outil", - "outrager", - "ouvrage", - "ovation", - "oxyde", - "oxygène", - "ozone", - "paisible", - "palace", - "palmarès", - "palourde", - "palper", - "panache", - "panda", - "pangolin", - "paniquer", - "panneau", - "panorama", - "pantalon", - "papaye", - "papier", - "papoter", - "papyrus", - "paradoxe", - "parcelle", - "paresse", - "parfumer", - "parler", - "parole", - "parrain", - "parsemer", - "partager", - "parure", - "parvenir", - "passion", - "pastèque", - "paternel", - "patience", - "patron", - "pavillon", - "pavoiser", - "payer", - "paysage", - "peigne", - "peintre", - "pelage", - "pélican", - "pelle", - "pelouse", - "peluche", - "pendule", - "pénétrer", - "pénible", - "pensif", - "pénurie", - "pépite", - "péplum", - "perdrix", - "perforer", - "période", - "permuter", - "perplexe", - "persil", - "perte", - "peser", - "pétale", - "petit", - "pétrir", - "peuple", - "pharaon", - "phobie", - "phoque", - "photon", - "phrase", - "physique", - "piano", - "pictural", - "pièce", - "pierre", - "pieuvre", - "pilote", - "pinceau", - "pipette", - "piquer", - "pirogue", - "piscine", - "piston", - "pivoter", - "pixel", - "pizza", - "placard", - "plafond", - "plaisir", - "planer", - "plaque", - "plastron", - "plateau", - "pleurer", - "plexus", - "pliage", - "plomb", - "plonger", - "pluie", - "plumage", - "pochette", - "poésie", - "poète", - "pointe", - "poirier", - "poisson", - "poivre", - "polaire", - "policier", - "pollen", - "polygone", - "pommade", - "pompier", - "ponctuel", - "pondérer", - "poney", - "portique", - "position", - "posséder", - "posture", - "potager", - "poteau", - "potion", - "pouce", - "poulain", - "poumon", - "pourpre", - "poussin", - "pouvoir", - "prairie", - "pratique", - "précieux", - "prédire", - "préfixe", - "prélude", - "prénom", - "présence", - "prétexte", - "prévoir", - "primitif", - "prince", - "prison", - "priver", - "problème", - "procéder", - "prodige", - "profond", - "progrès", - "proie", - "projeter", - "prologue", - "promener", - "propre", - "prospère", - "protéger", - "prouesse", - "proverbe", - "prudence", - "pruneau", - "psychose", - "public", - "puceron", - "puiser", - "pulpe", - "pulsar", - "punaise", - "punitif", - "pupitre", - "purifier", - "puzzle", - "pyramide", - "quasar", - "querelle", - "question", - "quiétude", - "quitter", - "quotient", - "racine", - "raconter", - "radieux", - "ragondin", - "raideur", - "raisin", - "ralentir", - "rallonge", - "ramasser", - "rapide", - "rasage", - "ratisser", - "ravager", - "ravin", - "rayonner", - "réactif", - "réagir", - "réaliser", - "réanimer", - "recevoir", - "réciter", - "réclamer", - "récolter", - "recruter", - "reculer", - "recycler", - "rédiger", - "redouter", - "refaire", - "réflexe", - "réformer", - "refrain", - "refuge", - "régalien", - "région", - "réglage", - "régulier", - "réitérer", - "rejeter", - "rejouer", - "relatif", - "relever", - "relief", - "remarque", - "remède", - "remise", - "remonter", - "remplir", - "remuer", - "renard", - "renfort", - "renifler", - "renoncer", - "rentrer", - "renvoi", - "replier", - "reporter", - "reprise", - "reptile", - "requin", - "réserve", - "résineux", - "résoudre", - "respect", - "rester", - "résultat", - "rétablir", - "retenir", - "réticule", - "retomber", - "retracer", - "réunion", - "réussir", - "revanche", - "revivre", - "révolte", - "révulsif", - "richesse", - "rideau", - "rieur", - "rigide", - "rigoler", - "rincer", - "riposter", - "risible", - "risque", - "rituel", - "rival", - "rivière", - "rocheux", - "romance", - "rompre", - "ronce", - "rondin", - "roseau", - "rosier", - "rotatif", - "rotor", - "rotule", - "rouge", - "rouille", - "rouleau", - "routine", - "royaume", - "ruban", - "rubis", - "ruche", - "ruelle", - "rugueux", - "ruiner", - "ruisseau", - "ruser", - "rustique", - "rythme", - "sabler", - "saboter", - "sabre", - "sacoche", - "safari", - "sagesse", - "saisir", - "salade", - "salive", - "salon", - "saluer", - "samedi", - "sanction", - "sanglier", - "sarcasme", - "sardine", - "saturer", - "saugrenu", - "saumon", - "sauter", - "sauvage", - "savant", - "savonner", - "scalpel", - "scandale", - "scélérat", - "scénario", - "sceptre", - "schéma", - "science", - "scinder", - "score", - "scrutin", - "sculpter", - "séance", - "sécable", - "sécher", - "secouer", - "sécréter", - "sédatif", - "séduire", - "seigneur", - "séjour", - "sélectif", - "semaine", - "sembler", - "semence", - "séminal", - "sénateur", - "sensible", - "sentence", - "séparer", - "séquence", - "serein", - "sergent", - "sérieux", - "serrure", - "sérum", - "service", - "sésame", - "sévir", - "sevrage", - "sextuple", - "sidéral", - "siècle", - "siéger", - "siffler", - "sigle", - "signal", - "silence", - "silicium", - "simple", - "sincère", - "sinistre", - "siphon", - "sirop", - "sismique", - "situer", - "skier", - "social", - "socle", - "sodium", - "soigneux", - "soldat", - "soleil", - "solitude", - "soluble", - "sombre", - "sommeil", - "somnoler", - "sonde", - "songeur", - "sonnette", - "sonore", - "sorcier", - "sortir", - "sosie", - "sottise", - "soucieux", - "soudure", - "souffle", - "soulever", - "soupape", - "source", - "soutirer", - "souvenir", - "spacieux", - "spatial", - "spécial", - "sphère", - "spiral", - "stable", - "station", - "sternum", - "stimulus", - "stipuler", - "strict", - "studieux", - "stupeur", - "styliste", - "sublime", - "substrat", - "subtil", - "subvenir", - "succès", - "sucre", - "suffixe", - "suggérer", - "suiveur", - "sulfate", - "superbe", - "supplier", - "surface", - "suricate", - "surmener", - "surprise", - "sursaut", - "survie", - "suspect", - "syllabe", - "symbole", - "symétrie", - "synapse", - "syntaxe", - "système", - "tabac", - "tablier", - "tactile", - "tailler", - "talent", - "talisman", - "talonner", - "tambour", - "tamiser", - "tangible", - "tapis", - "taquiner", - "tarder", - "tarif", - "tartine", - "tasse", - "tatami", - "tatouage", - "taupe", - "taureau", - "taxer", - "témoin", - "temporel", - "tenaille", - "tendre", - "teneur", - "tenir", - "tension", - "terminer", - "terne", - "terrible", - "tétine", - "texte", - "thème", - "théorie", - "thérapie", - "thorax", - "tibia", - "tiède", - "timide", - "tirelire", - "tiroir", - "tissu", - "titane", - "titre", - "tituber", - "toboggan", - "tolérant", - "tomate", - "tonique", - "tonneau", - "toponyme", - "torche", - "tordre", - "tornade", - "torpille", - "torrent", - "torse", - "tortue", - "totem", - "toucher", - "tournage", - "tousser", - "toxine", - "traction", - "trafic", - "tragique", - "trahir", - "train", - "trancher", - "travail", - "trèfle", - "tremper", - "trésor", - "treuil", - "triage", - "tribunal", - "tricoter", - "trilogie", - "triomphe", - "tripler", - "triturer", - "trivial", - "trombone", - "tronc", - "tropical", - "troupeau", - "tuile", - "tulipe", - "tumulte", - "tunnel", - "turbine", - "tuteur", - "tutoyer", - "tuyau", - "tympan", - "typhon", - "typique", - "tyran", - "ubuesque", - "ultime", - "ultrason", - "unanime", - "unifier", - "union", - "unique", - "unitaire", - "univers", - "uranium", - "urbain", - "urticant", - "usage", - "usine", - "usuel", - "usure", - "utile", - "utopie", - "vacarme", - "vaccin", - "vagabond", - "vague", - "vaillant", - "vaincre", - "vaisseau", - "valable", - "valise", - "vallon", - "valve", - "vampire", - "vanille", - "vapeur", - "varier", - "vaseux", - "vassal", - "vaste", - "vecteur", - "vedette", - "végétal", - "véhicule", - "veinard", - "véloce", - "vendredi", - "vénérer", - "venger", - "venimeux", - "ventouse", - "verdure", - "vérin", - "vernir", - "verrou", - "verser", - "vertu", - "veston", - "vétéran", - "vétuste", - "vexant", - "vexer", - "viaduc", - "viande", - "victoire", - "vidange", - "vidéo", - "vignette", - "vigueur", - "vilain", - "village", - "vinaigre", - "violon", - "vipère", - "virement", - "virtuose", - "virus", - "visage", - "viseur", - "vision", - "visqueux", - "visuel", - "vital", - "vitesse", - "viticole", - "vitrine", - "vivace", - "vivipare", - "vocation", - "voguer", - "voile", - "voisin", - "voiture", - "volaille", - "volcan", - "voltiger", - "volume", - "vorace", - "vortex", - "voter", - "vouloir", - "voyage", - "voyelle", - "wagon", - "xénon", - "yacht", - "zèbre", - "zénith", - "zeste", - "zoologie" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/it.rs b/networks/monero/wallet/polyseed/src/words/it.rs deleted file mode 100644 index 6d0e43821..000000000 --- a/networks/monero/wallet/polyseed/src/words/it.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "abaco", - "abbaglio", - "abbinato", - "abete", - "abisso", - "abolire", - "abrasivo", - "abrogato", - "accadere", - "accenno", - "accusato", - "acetone", - "achille", - "acido", - "acqua", - "acre", - "acrilico", - "acrobata", - "acuto", - "adagio", - "addebito", - "addome", - "adeguato", - "aderire", - "adipe", - "adottare", - "adulare", - "affabile", - "affetto", - "affisso", - "affranto", - "aforisma", - "afoso", - "africano", - "agave", - "agente", - "agevole", - "aggancio", - "agire", - "agitare", - "agonismo", - "agricolo", - "agrumeto", - "aguzzo", - "alabarda", - "alato", - "albatro", - "alberato", - "albo", - "albume", - "alce", - "alcolico", - "alettone", - "alfa", - "algebra", - "aliante", - "alibi", - "alimento", - "allagato", - "allegro", - "allievo", - "allodola", - "allusivo", - "almeno", - "alogeno", - "alpaca", - "alpestre", - "altalena", - "alterno", - "alticcio", - "altrove", - "alunno", - "alveolo", - "alzare", - "amalgama", - "amanita", - "amarena", - "ambito", - "ambrato", - "ameba", - "america", - "ametista", - "amico", - "ammasso", - "ammenda", - "ammirare", - "ammonito", - "amore", - "ampio", - "ampliare", - "amuleto", - "anacardo", - "anagrafe", - "analista", - "anarchia", - "anatra", - "anca", - "ancella", - "ancora", - "andare", - "andrea", - "anello", - "angelo", - "angolare", - "angusto", - "anima", - "annegare", - "annidato", - "anno", - "annuncio", - "anonimo", - "anticipo", - "anzi", - "apatico", - "apertura", - "apode", - "apparire", - "appetito", - "appoggio", - "approdo", - "appunto", - "aprile", - "arabica", - "arachide", - "aragosta", - "araldica", - "arancio", - "aratura", - "arazzo", - "arbitro", - "archivio", - "ardito", - "arenile", - "argento", - "argine", - "arguto", - "aria", - "armonia", - "arnese", - "arredato", - "arringa", - "arrosto", - "arsenico", - "arso", - "artefice", - "arzillo", - "asciutto", - "ascolto", - "asepsi", - "asettico", - "asfalto", - "asino", - "asola", - "aspirato", - "aspro", - "assaggio", - "asse", - "assoluto", - "assurdo", - "asta", - "astenuto", - "astice", - "astratto", - "atavico", - "ateismo", - "atomico", - "atono", - "attesa", - "attivare", - "attorno", - "attrito", - "attuale", - "ausilio", - "austria", - "autista", - "autonomo", - "autunno", - "avanzato", - "avere", - "avvenire", - "avviso", - "avvolgere", - "azione", - "azoto", - "azzimo", - "azzurro", - "babele", - "baccano", - "bacino", - "baco", - "badessa", - "badilata", - "bagnato", - "baita", - "balcone", - "baldo", - "balena", - "ballata", - "balzano", - "bambino", - "bandire", - "baraonda", - "barbaro", - "barca", - "baritono", - "barlume", - "barocco", - "basilico", - "basso", - "batosta", - "battuto", - "baule", - "bava", - "bavosa", - "becco", - "beffa", - "belgio", - "belva", - "benda", - "benevole", - "benigno", - "benzina", - "bere", - "berlina", - "beta", - "bibita", - "bici", - "bidone", - "bifido", - "biga", - "bilancia", - "bimbo", - "binocolo", - "biologo", - "bipede", - "bipolare", - "birbante", - "birra", - "biscotto", - "bisesto", - "bisnonno", - "bisonte", - "bisturi", - "bizzarro", - "blando", - "blatta", - "bollito", - "bonifico", - "bordo", - "bosco", - "botanico", - "bottino", - "bozzolo", - "braccio", - "bradipo", - "brama", - "branca", - "bravura", - "bretella", - "brevetto", - "brezza", - "briglia", - "brillante", - "brindare", - "broccolo", - "brodo", - "bronzina", - "brullo", - "bruno", - "bubbone", - "buca", - "budino", - "buffone", - "buio", - "bulbo", - "buono", - "burlone", - "burrasca", - "bussola", - "busta", - "cadetto", - "caduco", - "calamaro", - "calcolo", - "calesse", - "calibro", - "calmo", - "caloria", - "cambusa", - "camerata", - "camicia", - "cammino", - "camola", - "campale", - "canapa", - "candela", - "cane", - "canino", - "canotto", - "cantina", - "capace", - "capello", - "capitolo", - "capogiro", - "cappero", - "capra", - "capsula", - "carapace", - "carcassa", - "cardo", - "carisma", - "carovana", - "carretto", - "cartolina", - "casaccio", - "cascata", - "caserma", - "caso", - "cassone", - "castello", - "casuale", - "catasta", - "catena", - "catrame", - "cauto", - "cavillo", - "cedibile", - "cedrata", - "cefalo", - "celebre", - "cellulare", - "cena", - "cenone", - "centesimo", - "ceramica", - "cercare", - "certo", - "cerume", - "cervello", - "cesoia", - "cespo", - "ceto", - "chela", - "chiaro", - "chicca", - "chiedere", - "chimera", - "china", - "chirurgo", - "chitarra", - "ciao", - "ciclismo", - "cifrare", - "cigno", - "cilindro", - "ciottolo", - "circa", - "cirrosi", - "citrico", - "cittadino", - "ciuffo", - "civetta", - "civile", - "classico", - "clinica", - "cloro", - "cocco", - "codardo", - "codice", - "coerente", - "cognome", - "collare", - "colmato", - "colore", - "colposo", - "coltivato", - "colza", - "coma", - "cometa", - "commando", - "comodo", - "computer", - "comune", - "conciso", - "condurre", - "conferma", - "congelare", - "coniuge", - "connesso", - "conoscere", - "consumo", - "continuo", - "convegno", - "coperto", - "copione", - "coppia", - "copricapo", - "corazza", - "cordata", - "coricato", - "cornice", - "corolla", - "corpo", - "corredo", - "corsia", - "cortese", - "cosmico", - "costante", - "cottura", - "covato", - "cratere", - "cravatta", - "creato", - "credere", - "cremoso", - "crescita", - "creta", - "criceto", - "crinale", - "crisi", - "critico", - "croce", - "cronaca", - "crostata", - "cruciale", - "crusca", - "cucire", - "cuculo", - "cugino", - "cullato", - "cupola", - "curatore", - "cursore", - "curvo", - "cuscino", - "custode", - "dado", - "daino", - "dalmata", - "damerino", - "daniela", - "dannoso", - "danzare", - "datato", - "davanti", - "davvero", - "debutto", - "decennio", - "deciso", - "declino", - "decollo", - "decreto", - "dedicato", - "definito", - "deforme", - "degno", - "delegare", - "delfino", - "delirio", - "delta", - "demenza", - "denotato", - "dentro", - "deposito", - "derapata", - "derivare", - "deroga", - "descritto", - "deserto", - "desiderio", - "desumere", - "detersivo", - "devoto", - "diametro", - "dicembre", - "diedro", - "difeso", - "diffuso", - "digerire", - "digitale", - "diluvio", - "dinamico", - "dinnanzi", - "dipinto", - "diploma", - "dipolo", - "diradare", - "dire", - "dirotto", - "dirupo", - "disagio", - "discreto", - "disfare", - "disgelo", - "disposto", - "distanza", - "disumano", - "dito", - "divano", - "divelto", - "dividere", - "divorato", - "doblone", - "docente", - "doganale", - "dogma", - "dolce", - "domato", - "domenica", - "dominare", - "dondolo", - "dono", - "dormire", - "dote", - "dottore", - "dovuto", - "dozzina", - "drago", - "druido", - "dubbio", - "dubitare", - "ducale", - "duna", - "duomo", - "duplice", - "duraturo", - "ebano", - "eccesso", - "ecco", - "eclissi", - "economia", - "edera", - "edicola", - "edile", - "editoria", - "educare", - "egemonia", - "egli", - "egoismo", - "egregio", - "elaborato", - "elargire", - "elegante", - "elencato", - "eletto", - "elevare", - "elfico", - "elica", - "elmo", - "elsa", - "eluso", - "emanato", - "emblema", - "emesso", - "emiro", - "emotivo", - "emozione", - "empirico", - "emulo", - "endemico", - "enduro", - "energia", - "enfasi", - "enoteca", - "entrare", - "enzima", - "epatite", - "epilogo", - "episodio", - "epocale", - "eppure", - "equatore", - "erario", - "erba", - "erboso", - "erede", - "eremita", - "erigere", - "ermetico", - "eroe", - "erosivo", - "errante", - "esagono", - "esame", - "esanime", - "esaudire", - "esca", - "esempio", - "esercito", - "esibito", - "esigente", - "esistere", - "esito", - "esofago", - "esortato", - "esoso", - "espanso", - "espresso", - "essenza", - "esso", - "esteso", - "estimare", - "estonia", - "estroso", - "esultare", - "etilico", - "etnico", - "etrusco", - "etto", - "euclideo", - "europa", - "evaso", - "evidenza", - "evitato", - "evoluto", - "evviva", - "fabbrica", - "faccenda", - "fachiro", - "falco", - "famiglia", - "fanale", - "fanfara", - "fango", - "fantasma", - "fare", - "farfalla", - "farinoso", - "farmaco", - "fascia", - "fastoso", - "fasullo", - "faticare", - "fato", - "favoloso", - "febbre", - "fecola", - "fede", - "fegato", - "felpa", - "feltro", - "femmina", - "fendere", - "fenomeno", - "fermento", - "ferro", - "fertile", - "fessura", - "festivo", - "fetta", - "feudo", - "fiaba", - "fiducia", - "fifa", - "figurato", - "filo", - "finanza", - "finestra", - "finire", - "fiore", - "fiscale", - "fisico", - "fiume", - "flacone", - "flamenco", - "flebo", - "flemma", - "florido", - "fluente", - "fluoro", - "fobico", - "focaccia", - "focoso", - "foderato", - "foglio", - "folata", - "folclore", - "folgore", - "fondente", - "fonetico", - "fonia", - "fontana", - "forbito", - "forchetta", - "foresta", - "formica", - "fornaio", - "foro", - "fortezza", - "forzare", - "fosfato", - "fosso", - "fracasso", - "frana", - "frassino", - "fratello", - "freccetta", - "frenata", - "fresco", - "frigo", - "frollino", - "fronde", - "frugale", - "frutta", - "fucilata", - "fucsia", - "fuggente", - "fulmine", - "fulvo", - "fumante", - "fumetto", - "fumoso", - "fune", - "funzione", - "fuoco", - "furbo", - "furgone", - "furore", - "fuso", - "futile", - "gabbiano", - "gaffe", - "galateo", - "gallina", - "galoppo", - "gambero", - "gamma", - "garanzia", - "garbo", - "garofano", - "garzone", - "gasdotto", - "gasolio", - "gastrico", - "gatto", - "gaudio", - "gazebo", - "gazzella", - "geco", - "gelatina", - "gelso", - "gemello", - "gemmato", - "gene", - "genitore", - "gennaio", - "genotipo", - "gergo", - "ghepardo", - "ghiaccio", - "ghisa", - "giallo", - "gilda", - "ginepro", - "giocare", - "gioiello", - "giorno", - "giove", - "girato", - "girone", - "gittata", - "giudizio", - "giurato", - "giusto", - "globulo", - "glutine", - "gnomo", - "gobba", - "golf", - "gomito", - "gommone", - "gonfio", - "gonna", - "governo", - "gracile", - "grado", - "grafico", - "grammo", - "grande", - "grattare", - "gravoso", - "grazia", - "greca", - "gregge", - "grifone", - "grigio", - "grinza", - "grotta", - "gruppo", - "guadagno", - "guaio", - "guanto", - "guardare", - "gufo", - "guidare", - "ibernato", - "icona", - "identico", - "idillio", - "idolo", - "idra", - "idrico", - "idrogeno", - "igiene", - "ignaro", - "ignorato", - "ilare", - "illeso", - "illogico", - "illudere", - "imballo", - "imbevuto", - "imbocco", - "imbuto", - "immane", - "immerso", - "immolato", - "impacco", - "impeto", - "impiego", - "importo", - "impronta", - "inalare", - "inarcare", - "inattivo", - "incanto", - "incendio", - "inchino", - "incisivo", - "incluso", - "incontro", - "incrocio", - "incubo", - "indagine", - "india", - "indole", - "inedito", - "infatti", - "infilare", - "inflitto", - "ingaggio", - "ingegno", - "inglese", - "ingordo", - "ingrosso", - "innesco", - "inodore", - "inoltrare", - "inondato", - "insano", - "insetto", - "insieme", - "insonnia", - "insulina", - "intasato", - "intero", - "intonaco", - "intuito", - "inumidire", - "invalido", - "invece", - "invito", - "iperbole", - "ipnotico", - "ipotesi", - "ippica", - "iride", - "irlanda", - "ironico", - "irrigato", - "irrorare", - "isolato", - "isotopo", - "isterico", - "istituto", - "istrice", - "italia", - "iterare", - "labbro", - "labirinto", - "lacca", - "lacerato", - "lacrima", - "lacuna", - "laddove", - "lago", - "lampo", - "lancetta", - "lanterna", - "lardoso", - "larga", - "laringe", - "lastra", - "latenza", - "latino", - "lattuga", - "lavagna", - "lavoro", - "legale", - "leggero", - "lembo", - "lentezza", - "lenza", - "leone", - "lepre", - "lesivo", - "lessato", - "lesto", - "letterale", - "leva", - "levigato", - "libero", - "lido", - "lievito", - "lilla", - "limatura", - "limitare", - "limpido", - "lineare", - "lingua", - "liquido", - "lira", - "lirica", - "lisca", - "lite", - "litigio", - "livrea", - "locanda", - "lode", - "logica", - "lombare", - "londra", - "longevo", - "loquace", - "lorenzo", - "loto", - "lotteria", - "luce", - "lucidato", - "lumaca", - "luminoso", - "lungo", - "lupo", - "luppolo", - "lusinga", - "lusso", - "lutto", - "macabro", - "macchina", - "macero", - "macinato", - "madama", - "magico", - "maglia", - "magnete", - "magro", - "maiolica", - "malafede", - "malgrado", - "malinteso", - "malsano", - "malto", - "malumore", - "mana", - "mancia", - "mandorla", - "mangiare", - "manifesto", - "mannaro", - "manovra", - "mansarda", - "mantide", - "manubrio", - "mappa", - "maratona", - "marcire", - "maretta", - "marmo", - "marsupio", - "maschera", - "massaia", - "mastino", - "materasso", - "matricola", - "mattone", - "maturo", - "mazurca", - "meandro", - "meccanico", - "mecenate", - "medesimo", - "meditare", - "mega", - "melassa", - "melis", - "melodia", - "meninge", - "meno", - "mensola", - "mercurio", - "merenda", - "merlo", - "meschino", - "mese", - "messere", - "mestolo", - "metallo", - "metodo", - "mettere", - "miagolare", - "mica", - "micelio", - "michele", - "microbo", - "midollo", - "miele", - "migliore", - "milano", - "milite", - "mimosa", - "minerale", - "mini", - "minore", - "mirino", - "mirtillo", - "miscela", - "missiva", - "misto", - "misurare", - "mitezza", - "mitigare", - "mitra", - "mittente", - "mnemonico", - "modello", - "modifica", - "modulo", - "mogano", - "mogio", - "mole", - "molosso", - "monastero", - "monco", - "mondina", - "monetario", - "monile", - "monotono", - "monsone", - "montato", - "monviso", - "mora", - "mordere", - "morsicato", - "mostro", - "motivato", - "motosega", - "motto", - "movenza", - "movimento", - "mozzo", - "mucca", - "mucosa", - "muffa", - "mughetto", - "mugnaio", - "mulatto", - "mulinello", - "multiplo", - "mummia", - "munto", - "muovere", - "murale", - "musa", - "muscolo", - "musica", - "mutevole", - "muto", - "nababbo", - "nafta", - "nanometro", - "narciso", - "narice", - "narrato", - "nascere", - "nastrare", - "naturale", - "nautica", - "naviglio", - "nebulosa", - "necrosi", - "negativo", - "negozio", - "nemmeno", - "neofita", - "neretto", - "nervo", - "nessuno", - "nettuno", - "neutrale", - "neve", - "nevrotico", - "nicchia", - "ninfa", - "nitido", - "nobile", - "nocivo", - "nodo", - "nome", - "nomina", - "nordico", - "normale", - "norvegese", - "nostrano", - "notare", - "notizia", - "notturno", - "novella", - "nucleo", - "nulla", - "numero", - "nuovo", - "nutrire", - "nuvola", - "nuziale", - "oasi", - "obbedire", - "obbligo", - "obelisco", - "oblio", - "obolo", - "obsoleto", - "occasione", - "occhio", - "occidente", - "occorrere", - "occultare", - "ocra", - "oculato", - "odierno", - "odorare", - "offerta", - "offrire", - "offuscato", - "oggetto", - "oggi", - "ognuno", - "olandese", - "olfatto", - "oliato", - "oliva", - "ologramma", - "oltre", - "omaggio", - "ombelico", - "ombra", - "omega", - "omissione", - "ondoso", - "onere", - "onice", - "onnivoro", - "onorevole", - "onta", - "operato", - "opinione", - "opposto", - "oracolo", - "orafo", - "ordine", - "orecchino", - "orefice", - "orfano", - "organico", - "origine", - "orizzonte", - "orma", - "ormeggio", - "ornativo", - "orologio", - "orrendo", - "orribile", - "ortensia", - "ortica", - "orzata", - "orzo", - "osare", - "oscurare", - "osmosi", - "ospedale", - "ospite", - "ossa", - "ossidare", - "ostacolo", - "oste", - "otite", - "otre", - "ottagono", - "ottimo", - "ottobre", - "ovale", - "ovest", - "ovino", - "oviparo", - "ovocito", - "ovunque", - "ovviare", - "ozio", - "pacchetto", - "pace", - "pacifico", - "padella", - "padrone", - "paese", - "paga", - "pagina", - "palazzina", - "palesare", - "pallido", - "palo", - "palude", - "pandoro", - "pannello", - "paolo", - "paonazzo", - "paprica", - "parabola", - "parcella", - "parere", - "pargolo", - "pari", - "parlato", - "parola", - "partire", - "parvenza", - "parziale", - "passivo", - "pasticca", - "patacca", - "patologia", - "pattume", - "pavone", - "peccato", - "pedalare", - "pedonale", - "peggio", - "peloso", - "penare", - "pendice", - "penisola", - "pennuto", - "penombra", - "pensare", - "pentola", - "pepe", - "pepita", - "perbene", - "percorso", - "perdonato", - "perforare", - "pergamena", - "periodo", - "permesso", - "perno", - "perplesso", - "persuaso", - "pertugio", - "pervaso", - "pesatore", - "pesista", - "peso", - "pestifero", - "petalo", - "pettine", - "petulante", - "pezzo", - "piacere", - "pianta", - "piattino", - "piccino", - "picozza", - "piega", - "pietra", - "piffero", - "pigiama", - "pigolio", - "pigro", - "pila", - "pilifero", - "pillola", - "pilota", - "pimpante", - "pineta", - "pinna", - "pinolo", - "pioggia", - "piombo", - "piramide", - "piretico", - "pirite", - "pirolisi", - "pitone", - "pizzico", - "placebo", - "planare", - "plasma", - "platano", - "plenario", - "pochezza", - "poderoso", - "podismo", - "poesia", - "poggiare", - "polenta", - "poligono", - "pollice", - "polmonite", - "polpetta", - "polso", - "poltrona", - "polvere", - "pomice", - "pomodoro", - "ponte", - "popoloso", - "porfido", - "poroso", - "porpora", - "porre", - "portata", - "posa", - "positivo", - "possesso", - "postulato", - "potassio", - "potere", - "pranzo", - "prassi", - "pratica", - "precluso", - "predica", - "prefisso", - "pregiato", - "prelievo", - "premere", - "prenotare", - "preparato", - "presenza", - "pretesto", - "prevalso", - "prima", - "principe", - "privato", - "problema", - "procura", - "produrre", - "profumo", - "progetto", - "prolunga", - "promessa", - "pronome", - "proposta", - "proroga", - "proteso", - "prova", - "prudente", - "prugna", - "prurito", - "psiche", - "pubblico", - "pudica", - "pugilato", - "pugno", - "pulce", - "pulito", - "pulsante", - "puntare", - "pupazzo", - "pupilla", - "puro", - "quadro", - "qualcosa", - "quasi", - "querela", - "quota", - "raccolto", - "raddoppio", - "radicale", - "radunato", - "raffica", - "ragazzo", - "ragione", - "ragno", - "ramarro", - "ramingo", - "ramo", - "randagio", - "rantolare", - "rapato", - "rapina", - "rappreso", - "rasatura", - "raschiato", - "rasente", - "rassegna", - "rastrello", - "rata", - "ravveduto", - "reale", - "recepire", - "recinto", - "recluta", - "recondito", - "recupero", - "reddito", - "redimere", - "regalato", - "registro", - "regola", - "regresso", - "relazione", - "remare", - "remoto", - "renna", - "replica", - "reprimere", - "reputare", - "resa", - "residente", - "responso", - "restauro", - "rete", - "retina", - "retorica", - "rettifica", - "revocato", - "riassunto", - "ribadire", - "ribelle", - "ribrezzo", - "ricarica", - "ricco", - "ricevere", - "riciclato", - "ricordo", - "ricreduto", - "ridicolo", - "ridurre", - "rifasare", - "riflesso", - "riforma", - "rifugio", - "rigare", - "rigettato", - "righello", - "rilassato", - "rilevato", - "rimanere", - "rimbalzo", - "rimedio", - "rimorchio", - "rinascita", - "rincaro", - "rinforzo", - "rinnovo", - "rinomato", - "rinsavito", - "rintocco", - "rinuncia", - "rinvenire", - "riparato", - "ripetuto", - "ripieno", - "riportare", - "ripresa", - "ripulire", - "risata", - "rischio", - "riserva", - "risibile", - "riso", - "rispetto", - "ristoro", - "risultato", - "risvolto", - "ritardo", - "ritegno", - "ritmico", - "ritrovo", - "riunione", - "riva", - "riverso", - "rivincita", - "rivolto", - "rizoma", - "roba", - "robotico", - "robusto", - "roccia", - "roco", - "rodaggio", - "rodere", - "roditore", - "rogito", - "rollio", - "romantico", - "rompere", - "ronzio", - "rosolare", - "rospo", - "rotante", - "rotondo", - "rotula", - "rovescio", - "rubizzo", - "rubrica", - "ruga", - "rullino", - "rumine", - "rumoroso", - "ruolo", - "rupe", - "russare", - "rustico", - "sabato", - "sabbiare", - "sabotato", - "sagoma", - "salasso", - "saldatura", - "salgemma", - "salivare", - "salmone", - "salone", - "saltare", - "saluto", - "salvo", - "sapere", - "sapido", - "saporito", - "saraceno", - "sarcasmo", - "sarto", - "sassoso", - "satellite", - "satira", - "satollo", - "saturno", - "savana", - "savio", - "saziato", - "sbadiglio", - "sbalzo", - "sbancato", - "sbarra", - "sbattere", - "sbavare", - "sbendare", - "sbirciare", - "sbloccato", - "sbocciato", - "sbrinare", - "sbruffone", - "sbuffare", - "scabroso", - "scadenza", - "scala", - "scambiare", - "scandalo", - "scapola", - "scarso", - "scatenare", - "scavato", - "scelto", - "scenico", - "scettro", - "scheda", - "schiena", - "sciarpa", - "scienza", - "scindere", - "scippo", - "sciroppo", - "scivolo", - "sclerare", - "scodella", - "scolpito", - "scomparto", - "sconforto", - "scoprire", - "scorta", - "scossone", - "scozzese", - "scriba", - "scrollare", - "scrutinio", - "scuderia", - "scultore", - "scuola", - "scuro", - "scusare", - "sdebitare", - "sdoganare", - "seccatura", - "secondo", - "sedano", - "seggiola", - "segnalato", - "segregato", - "seguito", - "selciato", - "selettivo", - "sella", - "selvaggio", - "semaforo", - "sembrare", - "seme", - "seminato", - "sempre", - "senso", - "sentire", - "sepolto", - "sequenza", - "serata", - "serbato", - "sereno", - "serio", - "serpente", - "serraglio", - "servire", - "sestina", - "setola", - "settimana", - "sfacelo", - "sfaldare", - "sfamato", - "sfarzoso", - "sfaticato", - "sfera", - "sfida", - "sfilato", - "sfinge", - "sfocato", - "sfoderare", - "sfogo", - "sfoltire", - "sforzato", - "sfratto", - "sfruttato", - "sfuggito", - "sfumare", - "sfuso", - "sgabello", - "sgarbato", - "sgonfiare", - "sgorbio", - "sgrassato", - "sguardo", - "sibilo", - "siccome", - "sierra", - "sigla", - "signore", - "silenzio", - "sillaba", - "simbolo", - "simpatico", - "simulato", - "sinfonia", - "singolo", - "sinistro", - "sino", - "sintesi", - "sinusoide", - "sipario", - "sisma", - "sistole", - "situato", - "slitta", - "slogatura", - "sloveno", - "smarrito", - "smemorato", - "smentito", - "smeraldo", - "smilzo", - "smontare", - "smottato", - "smussato", - "snellire", - "snervato", - "snodo", - "sobbalzo", - "sobrio", - "soccorso", - "sociale", - "sodale", - "soffitto", - "sogno", - "soldato", - "solenne", - "solido", - "sollazzo", - "solo", - "solubile", - "solvente", - "somatico", - "somma", - "sonda", - "sonetto", - "sonnifero", - "sopire", - "soppeso", - "sopra", - "sorgere", - "sorpasso", - "sorriso", - "sorso", - "sorteggio", - "sorvolato", - "sospiro", - "sosta", - "sottile", - "spada", - "spalla", - "spargere", - "spatola", - "spavento", - "spazzola", - "specie", - "spedire", - "spegnere", - "spelatura", - "speranza", - "spessore", - "spettrale", - "spezzato", - "spia", - "spigoloso", - "spillato", - "spinoso", - "spirale", - "splendido", - "sportivo", - "sposo", - "spranga", - "sprecare", - "spronato", - "spruzzo", - "spuntino", - "squillo", - "sradicare", - "srotolato", - "stabile", - "stacco", - "staffa", - "stagnare", - "stampato", - "stantio", - "starnuto", - "stasera", - "statuto", - "stelo", - "steppa", - "sterzo", - "stiletto", - "stima", - "stirpe", - "stivale", - "stizzoso", - "stonato", - "storico", - "strappo", - "stregato", - "stridulo", - "strozzare", - "strutto", - "stuccare", - "stufo", - "stupendo", - "subentro", - "succoso", - "sudore", - "suggerito", - "sugo", - "sultano", - "suonare", - "superbo", - "supporto", - "surgelato", - "surrogato", - "sussurro", - "sutura", - "svagare", - "svedese", - "sveglio", - "svelare", - "svenuto", - "svezia", - "sviluppo", - "svista", - "svizzera", - "svolta", - "svuotare", - "tabacco", - "tabulato", - "tacciare", - "taciturno", - "tale", - "talismano", - "tampone", - "tannino", - "tara", - "tardivo", - "targato", - "tariffa", - "tarpare", - "tartaruga", - "tasto", - "tattico", - "taverna", - "tavolata", - "tazza", - "teca", - "tecnico", - "telefono", - "temerario", - "tempo", - "temuto", - "tendone", - "tenero", - "tensione", - "tentacolo", - "teorema", - "terme", - "terrazzo", - "terzetto", - "tesi", - "tesserato", - "testato", - "tetro", - "tettoia", - "tifare", - "tigella", - "timbro", - "tinto", - "tipico", - "tipografo", - "tiraggio", - "tiro", - "titanio", - "titolo", - "titubante", - "tizio", - "tizzone", - "toccare", - "tollerare", - "tolto", - "tombola", - "tomo", - "tonfo", - "tonsilla", - "topazio", - "topologia", - "toppa", - "torba", - "tornare", - "torrone", - "tortora", - "toscano", - "tossire", - "tostatura", - "totano", - "trabocco", - "trachea", - "trafila", - "tragedia", - "tralcio", - "tramonto", - "transito", - "trapano", - "trarre", - "trasloco", - "trattato", - "trave", - "treccia", - "tremolio", - "trespolo", - "tributo", - "tricheco", - "trifoglio", - "trillo", - "trincea", - "trio", - "tristezza", - "triturato", - "trivella", - "tromba", - "trono", - "troppo", - "trottola", - "trovare", - "truccato", - "tubatura", - "tuffato", - "tulipano", - "tumulto", - "tunisia", - "turbare", - "turchino", - "tuta", - "tutela", - "ubicato", - "uccello", - "uccisore", - "udire", - "uditivo", - "uffa", - "ufficio", - "uguale", - "ulisse", - "ultimato", - "umano", - "umile", - "umorismo", - "uncinetto", - "ungere", - "ungherese", - "unicorno", - "unificato", - "unisono", - "unitario", - "unte", - "uovo", - "upupa", - "uragano", - "urgenza", - "urlo", - "usanza", - "usato", - "uscito", - "usignolo", - "usuraio", - "utensile", - "utilizzo", - "utopia", - "vacante", - "vaccinato", - "vagabondo", - "vagliato", - "valanga", - "valgo", - "valico", - "valletta", - "valoroso", - "valutare", - "valvola", - "vampata", - "vangare", - "vanitoso", - "vano", - "vantaggio", - "vanvera", - "vapore", - "varano", - "varcato", - "variante", - "vasca", - "vedetta", - "vedova", - "veduto", - "vegetale", - "veicolo", - "velcro", - "velina", - "velluto", - "veloce", - "venato", - "vendemmia", - "vento", - "verace", - "verbale", - "vergogna", - "verifica", - "vero", - "verruca", - "verticale", - "vescica", - "vessillo", - "vestale", - "veterano", - "vetrina", - "vetusto", - "viandante", - "vibrante", - "vicenda", - "vichingo", - "vicinanza", - "vidimare", - "vigilia", - "vigneto", - "vigore", - "vile", - "villano", - "vimini", - "vincitore", - "viola", - "vipera", - "virgola", - "virologo", - "virulento", - "viscoso", - "visione", - "vispo", - "vissuto", - "visura", - "vita", - "vitello", - "vittima", - "vivanda", - "vivido", - "viziare", - "voce", - "voga", - "volatile", - "volere", - "volpe", - "voragine", - "vulcano", - "zampogna", - "zanna", - "zappato", - "zattera", - "zavorra", - "zefiro", - "zelante", - "zelo", - "zenzero", - "zerbino", - "zibetto", - "zinco", - "zircone", - "zitto", - "zolla", - "zotico", - "zucchero", - "zufolo", - "zulu", - "zuppa" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/ja.rs b/networks/monero/wallet/polyseed/src/words/ja.rs deleted file mode 100644 index 3c94572ac..000000000 --- a/networks/monero/wallet/polyseed/src/words/ja.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "あいこくしん", - "あいさつ", - "あいだ", - "あおぞら", - "あかちゃん", - "あきる", - "あけがた", - "あける", - "あこがれる", - "あさい", - "あさひ", - "あしあと", - "あじわう", - "あずかる", - "あずき", - "あそぶ", - "あたえる", - "あたためる", - "あたりまえ", - "あたる", - "あっしゅく", - "あつい", - "あつかう", - "あつまり", - "あつめる", - "あてな", - "あてはまる", - "あひる", - "あふれる", - "あぶら", - "あぶる", - "あまい", - "あまど", - "あまやかす", - "あまり", - "あみもの", - "あめりか", - "あやまる", - "あゆむ", - "あらいぐま", - "あらし", - "あらすじ", - "あらためる", - "あらゆる", - "あらわす", - "ありがとう", - "あわせる", - "あわてる", - "あんい", - "あんがい", - "あんこ", - "あんぜん", - "あんてい", - "あんない", - "あんまり", - "いいだす", - "いおん", - "いがい", - "いがく", - "いきおい", - "いきなり", - "いきもの", - "いきる", - "いくじ", - "いくぶん", - "いけばな", - "いけん", - "いこう", - "いこく", - "いこつ", - "いさましい", - "いさん", - "いしき", - "いじゅう", - "いじょう", - "いじわる", - "いずみ", - "いずれ", - "いせい", - "いせえび", - "いせかい", - "いせき", - "いぜん", - "いそうろう", - "いそがしい", - "いたずら", - "いたみ", - "いたりあ", - "いだい", - "いだく", - "いちおう", - "いちじ", - "いちど", - "いちば", - "いちぶ", - "いちりゅう", - "いっしゅん", - "いっせい", - "いっそう", - "いったん", - "いっち", - "いってい", - "いっぽう", - "いつか", - "いてざ", - "いてん", - "いとこ", - "いどう", - "いない", - "いなか", - "いねむり", - "いのち", - "いのる", - "いはつ", - "いはん", - "いばる", - "いひん", - "いびき", - "いふく", - "いへん", - "いほう", - "いみん", - "いもうと", - "いもたれ", - "いもり", - "いやがる", - "いやす", - "いよかん", - "いよく", - "いらい", - "いらすと", - "いりぐち", - "いりょう", - "いれい", - "いれもの", - "いれる", - "いろえんぴつ", - "いわい", - "いわう", - "いわかん", - "いわば", - "いわゆる", - "いんげんまめ", - "いんさつ", - "いんしょう", - "いんよう", - "うえき", - "うえる", - "うおざ", - "うかぶ", - "うかべる", - "うがい", - "うきわ", - "うくらいな", - "うくれれ", - "うけたまわる", - "うけつけ", - "うけとる", - "うけもつ", - "うける", - "うこん", - "うごかす", - "うごく", - "うさぎ", - "うしなう", - "うしろがみ", - "うすい", - "うすぎ", - "うすぐらい", - "うすめる", - "うせつ", - "うちあわせ", - "うちがわ", - "うちき", - "うちゅう", - "うっかり", - "うったえる", - "うつくしい", - "うつる", - "うどん", - "うなぎ", - "うなじ", - "うなずく", - "うなる", - "うねる", - "うのう", - "うぶげ", - "うぶごえ", - "うまれる", - "うめる", - "うもう", - "うやまう", - "うよく", - "うらがえす", - "うらぐち", - "うらない", - "うりあげ", - "うりきれ", - "うるさい", - "うれしい", - "うれゆき", - "うれる", - "うろこ", - "うわき", - "うわさ", - "うんこう", - "うんちん", - "うんてん", - "うんどう", - "えいえん", - "えいが", - "えいきょう", - "えいご", - "えいせい", - "えいぶん", - "えいよう", - "えいわ", - "えおり", - "えがお", - "えがく", - "えきたい", - "えくせる", - "えしゃく", - "えすて", - "えつらん", - "えのぐ", - "えほうまき", - "えほん", - "えまき", - "えもじ", - "えもの", - "えらい", - "えらぶ", - "えりあ", - "えんえん", - "えんかい", - "えんぎ", - "えんげき", - "えんしゅう", - "えんぜつ", - "えんそく", - "えんちょう", - "えんとつ", - "おいかける", - "おいこす", - "おいしい", - "おいつく", - "おうえん", - "おうさま", - "おうじ", - "おうせつ", - "おうたい", - "おうふく", - "おうべい", - "おうよう", - "おえる", - "おおい", - "おおう", - "おおどおり", - "おおや", - "おおよそ", - "おかえり", - "おかず", - "おかわり", - "おがむ", - "おきる", - "おぎなう", - "おくさま", - "おくじょう", - "おくりがな", - "おくる", - "おくれる", - "おこす", - "おこなう", - "おこる", - "おさえる", - "おさない", - "おさめる", - "おしいれ", - "おしえる", - "おしゃれ", - "おじぎ", - "おじさん", - "おそらく", - "おそわる", - "おたがい", - "おたく", - "おだやか", - "おちつく", - "おっと", - "おつり", - "おでかけ", - "おとしもの", - "おとなしい", - "おどり", - "おどろかす", - "おばさん", - "おまいり", - "おめでとう", - "おもいで", - "おもう", - "おもたい", - "おもちゃ", - "おやつ", - "おやゆび", - "およぼす", - "おらんだ", - "おろす", - "おんがく", - "おんけい", - "おんしゃ", - "おんせん", - "おんだん", - "おんちゅう", - "おんどけい", - "かあつ", - "かいが", - "かいさつ", - "かいしゃ", - "かいすいよく", - "かいぜん", - "かいぞうど", - "かいつう", - "かいてん", - "かいとう", - "かいふく", - "かいほう", - "かいよう", - "かいわ", - "かえる", - "かおり", - "かかえる", - "かがく", - "かがし", - "かがみ", - "かくご", - "かくとく", - "かざる", - "かたい", - "かたち", - "かなざわし", - "かのう", - "かぶか", - "かほう", - "かほご", - "かまう", - "かまぼこ", - "かめれおん", - "かゆい", - "かようび", - "からい", - "かるい", - "かろう", - "かわく", - "かわら", - "かんけい", - "かんこう", - "かんしゃ", - "かんそう", - "かんたん", - "かんち", - "がいき", - "がいけん", - "がいこう", - "がいへき", - "がいらい", - "がぞう", - "がちょう", - "がっきゅう", - "がっこう", - "がっさん", - "がっしょう", - "がはく", - "がんか", - "がんばる", - "きあい", - "きあつ", - "きいろ", - "きうい", - "きうん", - "きえる", - "きおう", - "きおく", - "きおち", - "きおん", - "きかい", - "きかく", - "きかんしゃ", - "ききて", - "きくばり", - "きくらげ", - "きけんせい", - "きこう", - "きこえる", - "きこく", - "きさい", - "きさく", - "きさま", - "きさらぎ", - "きすう", - "きせい", - "きせき", - "きせつ", - "きそう", - "きぞく", - "きぞん", - "きたえる", - "きちょう", - "きつえん", - "きつつき", - "きつね", - "きてい", - "きどう", - "きどく", - "きない", - "きなが", - "きなこ", - "きぬごし", - "きねん", - "きのう", - "きのした", - "きはく", - "きひん", - "きびしい", - "きふく", - "きぶん", - "きほん", - "きぼう", - "きまる", - "きみつ", - "きむずかしい", - "きめる", - "きもだめし", - "きもち", - "きもの", - "きゃく", - "きやく", - "きょうりゅう", - "きよう", - "きらい", - "きらく", - "きりん", - "きれい", - "きれつ", - "きろく", - "きわめる", - "きんかくじ", - "きんじょ", - "きんようび", - "ぎいん", - "ぎしき", - "ぎじかがく", - "ぎじたいけん", - "ぎじにってい", - "ぎじゅつしゃ", - "ぎっちり", - "ぎゅうにく", - "ぎろん", - "ぎんいろ", - "くいず", - "くうかん", - "くうき", - "くうぐん", - "くうこう", - "くうそう", - "くうふく", - "くうぼ", - "くかん", - "くきょう", - "くげん", - "くさい", - "くさき", - "くさばな", - "くさる", - "くしゃみ", - "くしょう", - "くすのき", - "くすりゆび", - "くせげ", - "くせん", - "くたびれる", - "くださる", - "くちこみ", - "くちさき", - "くつした", - "くつろぐ", - "くとうてん", - "くどく", - "くなん", - "くねくね", - "くのう", - "くふう", - "くみあわせ", - "くみたてる", - "くめる", - "くやくしょ", - "くらす", - "くらべる", - "くるま", - "くれる", - "くろう", - "くわしい", - "ぐあい", - "ぐうせい", - "ぐうたら", - "ぐこう", - "ぐたいてき", - "ぐっすり", - "ぐんかん", - "ぐんしょく", - "ぐんたい", - "ぐんて", - "けあな", - "けいかく", - "けいけん", - "けいこ", - "けいさつ", - "けいたい", - "けいれき", - "けいろ", - "けおとす", - "けおりもの", - "けさき", - "けしき", - "けしごむ", - "けしょう", - "けたば", - "けちゃっぷ", - "けちらす", - "けっこん", - "けっせき", - "けってい", - "けつあつ", - "けつい", - "けつえき", - "けつじょ", - "けつまつ", - "けつろん", - "けとばす", - "けとる", - "けなげ", - "けなす", - "けなみ", - "けぬき", - "けねん", - "けはい", - "けぶかい", - "けまり", - "けみかる", - "けむし", - "けむり", - "けもの", - "けらい", - "けろけろ", - "けわしい", - "けんい", - "けんえつ", - "けんお", - "けんか", - "けんげん", - "けんこう", - "けんさく", - "けんしゅう", - "けんすう", - "けんちく", - "けんてい", - "けんとう", - "けんない", - "けんにん", - "けんま", - "けんみん", - "けんめい", - "けんらん", - "けんり", - "げいじゅつ", - "げいのうじん", - "げきか", - "げきげん", - "げきだん", - "げきちん", - "げきとつ", - "げきは", - "げきやく", - "げこう", - "げこくじょう", - "げざい", - "げざん", - "げすと", - "げつようび", - "げつれい", - "げどく", - "げねつ", - "げひん", - "げぼく", - "げんき", - "げんそう", - "げんぶつ", - "こあくま", - "こいぬ", - "こいびと", - "こうえん", - "こうおん", - "こうかん", - "こうこう", - "こうさい", - "こうじ", - "こうすい", - "こうそく", - "こうたい", - "こうちゃ", - "こうつう", - "こうてい", - "こうどう", - "こうない", - "こうはい", - "こうもく", - "こうりつ", - "こえる", - "こおり", - "こくご", - "こくさい", - "こくとう", - "こくない", - "こくはく", - "こぐま", - "こけい", - "こける", - "ここのか", - "こころ", - "こさめ", - "こしつ", - "こすう", - "こせい", - "こせき", - "こぜん", - "こそだて", - "こたい", - "こたえる", - "こたつ", - "こちょう", - "こっか", - "こつこつ", - "こつばん", - "こつぶ", - "こてい", - "こてん", - "ことがら", - "ことし", - "ことば", - "ことり", - "こなごな", - "こねこね", - "このまま", - "このみ", - "このよ", - "こひつじ", - "こふう", - "こふん", - "こぼれる", - "こまかい", - "こまつな", - "こまる", - "こむぎこ", - "こもじ", - "こもち", - "こもの", - "こもん", - "こやく", - "こやま", - "こゆう", - "こゆび", - "こよい", - "こよう", - "こりる", - "これくしょん", - "ころっけ", - "こわもて", - "こわれる", - "こんいん", - "こんかい", - "こんき", - "こんしゅう", - "こんすい", - "こんだて", - "こんとん", - "こんなん", - "こんびに", - "こんぽん", - "こんまけ", - "こんや", - "こんれい", - "こんわく", - "ごうい", - "ごうきゅう", - "ごうけい", - "ごうせい", - "ごうほう", - "ごうまん", - "ごかい", - "ごかん", - "ごがつ", - "ごはん", - "ごまあぶら", - "ごますり", - "さいかい", - "さいきん", - "さいしょ", - "さいせい", - "さいてき", - "さうな", - "さかいし", - "さかな", - "さかみち", - "さがす", - "さがる", - "さぎょう", - "さくし", - "さくひん", - "さくら", - "さこく", - "さこつ", - "さずかる", - "さたん", - "さっきょく", - "さつえい", - "さつじん", - "さつたば", - "さつまいも", - "さてい", - "さといも", - "さとう", - "さとおや", - "さとし", - "さとる", - "さのう", - "さばく", - "さびしい", - "さべつ", - "さほう", - "さほど", - "さます", - "さみしい", - "さみだれ", - "さむけ", - "さめる", - "さやえんどう", - "さゆう", - "さよう", - "さよく", - "さらだ", - "さわやか", - "さわる", - "さんいん", - "さんか", - "さんきゃく", - "さんこう", - "さんさい", - "さんすう", - "さんせい", - "さんそ", - "さんち", - "さんま", - "さんみ", - "さんらん", - "ざいえき", - "ざいげん", - "ざいこ", - "ざいたく", - "ざいちゅう", - "ざいりょう", - "ざせき", - "ざっか", - "ざっし", - "ざっそう", - "ざつおん", - "ざつがく", - "ざるそば", - "ざんしょ", - "しあい", - "しあげ", - "しあさって", - "しあわせ", - "しいく", - "しいん", - "しうち", - "しえい", - "しおけ", - "しかい", - "しかく", - "しごと", - "しすう", - "したうけ", - "したぎ", - "したて", - "したみ", - "しちょう", - "しちりん", - "しっかり", - "しつじ", - "しつもん", - "してい", - "してき", - "してつ", - "しなぎれ", - "しなもの", - "しなん", - "しねま", - "しねん", - "しのぐ", - "しのぶ", - "しはい", - "しはつ", - "しはらい", - "しはん", - "しばかり", - "しひょう", - "しふく", - "しへい", - "しほう", - "しほん", - "しまう", - "しまる", - "しみん", - "しむける", - "しめい", - "しめる", - "しもん", - "しゃいん", - "しゃうん", - "しゃおん", - "しゃくほう", - "しゃけん", - "しゃこ", - "しゃざい", - "しゃしん", - "しゃせん", - "しゃそう", - "しゃたい", - "しゃちょう", - "しゃっきん", - "しゃりん", - "しゃれい", - "しやくしょ", - "しゅくはく", - "しゅっせき", - "しゅみ", - "しゅらば", - "しょうかい", - "しょくたく", - "しょっけん", - "しょどう", - "しょもつ", - "しらせる", - "しらべる", - "しんか", - "しんこう", - "しんせいじ", - "しんちく", - "しんりん", - "じかん", - "じだい", - "じてん", - "じどう", - "じぶん", - "じむしょ", - "じゃがいも", - "じゃま", - "じゅうしょ", - "じゅしん", - "じゅんばん", - "じゆう", - "じんじゃ", - "すあげ", - "すあし", - "すあな", - "すいえい", - "すいか", - "すいとう", - "すいようび", - "すうがく", - "すうじつ", - "すうせん", - "すおどり", - "すきま", - "すくう", - "すくない", - "すける", - "すこし", - "すごい", - "すすむ", - "すすめる", - "すずしい", - "すっかり", - "すてき", - "すてる", - "すねる", - "すのこ", - "すはだ", - "すばらしい", - "すふれ", - "すぶり", - "すべて", - "すべる", - "すぼん", - "すまい", - "すめし", - "すもう", - "すやき", - "すらすら", - "するめ", - "すれちがう", - "すろっと", - "すわる", - "すんぜん", - "すんぽう", - "ずあん", - "ずいぶん", - "ずさん", - "ずっしり", - "ずっと", - "ずひょう", - "ずぶぬれ", - "ずほう", - "せあぶら", - "せいかつ", - "せいげん", - "せいじ", - "せいよう", - "せおう", - "せかいかん", - "せきにん", - "せきむ", - "せきゆ", - "せきらんうん", - "せけん", - "せこう", - "せすじ", - "せたい", - "せたけ", - "せっかく", - "せっきゃく", - "せっけん", - "せっこつ", - "せっさたくま", - "せっぱん", - "せつぞく", - "せつだん", - "せつでん", - "せつび", - "せつぶん", - "せつめい", - "せつりつ", - "せなか", - "せのび", - "せはば", - "せびろ", - "せぼね", - "せまい", - "せまる", - "せめる", - "せもたれ", - "せりふ", - "せんい", - "せんえい", - "せんか", - "せんきょ", - "せんく", - "せんげん", - "せんさい", - "せんしゅ", - "せんすい", - "せんせい", - "せんぞ", - "せんたく", - "せんちょう", - "せんてい", - "せんとう", - "せんぬき", - "せんねん", - "せんぱい", - "せんむ", - "せんめんじょ", - "せんもん", - "せんやく", - "せんゆう", - "せんよう", - "せんれい", - "せんろ", - "ぜっく", - "ぜんあく", - "ぜんご", - "ぜんぶ", - "ぜんぽう", - "ぜんら", - "ぜんりゃく", - "そあく", - "そいとげる", - "そいね", - "そうがんきょう", - "そうき", - "そうご", - "そうしん", - "そうだん", - "そうなん", - "そうび", - "そうめん", - "そうり", - "そえもの", - "そえん", - "そがい", - "そげき", - "そこう", - "そこそこ", - "そざい", - "そしな", - "そせい", - "そせん", - "そそぐ", - "そだてる", - "そっかん", - "そっけつ", - "そっこう", - "そっせん", - "そっと", - "そつう", - "そつえん", - "そつぎょう", - "そとがわ", - "そとづら", - "そなえる", - "そなた", - "そふぼ", - "そぼく", - "そぼろ", - "そまつ", - "そまる", - "そむく", - "そむりえ", - "そめる", - "そもそも", - "そよかぜ", - "そらまめ", - "そろう", - "そんかい", - "そんけい", - "そんざい", - "そんしつ", - "そんぞく", - "そんちょう", - "そんみん", - "ぞんび", - "ぞんぶん", - "たあい", - "たいいん", - "たいうん", - "たいえき", - "たいおう", - "たいき", - "たいぐう", - "たいけん", - "たいこ", - "たいざい", - "たいせつ", - "たいそう", - "たいちょう", - "たいてい", - "たいない", - "たいねつ", - "たいのう", - "たいはん", - "たいふう", - "たいへん", - "たいほ", - "たいまつばな", - "たいみんぐ", - "たいむ", - "たいめん", - "たいやき", - "たいよう", - "たいら", - "たいりょく", - "たいる", - "たいわん", - "たうえ", - "たえる", - "たおす", - "たおる", - "たおれる", - "たかい", - "たかね", - "たきび", - "たくさん", - "たこく", - "たこやき", - "たさい", - "たしざん", - "たすける", - "たずさわる", - "たそがれ", - "たたかう", - "たたく", - "たたみ", - "ただしい", - "たちばな", - "たてる", - "たとえる", - "たなばた", - "たにん", - "たぬき", - "たのしみ", - "たはつ", - "たぶん", - "たべる", - "たぼう", - "たまご", - "たまる", - "ためいき", - "ためす", - "ためる", - "たもつ", - "たやすい", - "たよる", - "たらす", - "たりきほんがん", - "たりょう", - "たりる", - "たると", - "たれる", - "たれんと", - "たろっと", - "たわむれる", - "たんい", - "たんおん", - "たんか", - "たんき", - "たんけん", - "たんご", - "たんさん", - "たんじょうび", - "たんそく", - "たんたい", - "たんてい", - "たんとう", - "たんにん", - "たんのう", - "たんぴん", - "たんまつ", - "たんめい", - "だいがく", - "だいじょうぶ", - "だいすき", - "だいたい", - "だいどころ", - "だいひょう", - "だじゃれ", - "だっかい", - "だっきゃく", - "だっこ", - "だっしゅつ", - "だったい", - "だむる", - "だんあつ", - "だんせい", - "だんち", - "だんな", - "だんねつ", - "だんぼう", - "だんれつ", - "だんろ", - "だんわ", - "ちあい", - "ちあん", - "ちいき", - "ちいさい", - "ちえん", - "ちかい", - "ちから", - "ちきゅう", - "ちきん", - "ちけいず", - "ちけん", - "ちこく", - "ちさい", - "ちしき", - "ちしりょう", - "ちせい", - "ちそう", - "ちたい", - "ちたん", - "ちちおや", - "ちつじょ", - "ちてき", - "ちてん", - "ちぬき", - "ちぬり", - "ちのう", - "ちひょう", - "ちへいせん", - "ちほう", - "ちまた", - "ちみつ", - "ちみどろ", - "ちめいど", - "ちゃんこなべ", - "ちゅうい", - "ちゆりょく", - "ちょうし", - "ちょさくけん", - "ちらし", - "ちらみ", - "ちりがみ", - "ちりょう", - "ちるど", - "ちわわ", - "ちんたい", - "ちんもく", - "ついか", - "ついたち", - "つうか", - "つうじょう", - "つうはん", - "つうわ", - "つかう", - "つかれる", - "つくね", - "つくる", - "つけね", - "つける", - "つごう", - "つたえる", - "つつじ", - "つつむ", - "つづく", - "つとめる", - "つながる", - "つなみ", - "つねづね", - "つのる", - "つぶす", - "つまらない", - "つまる", - "つみき", - "つめたい", - "つもり", - "つもる", - "つよい", - "つるぼ", - "つるみく", - "つわもの", - "つわり", - "てあし", - "てあて", - "てあみ", - "ていおん", - "ていか", - "ていき", - "ていけい", - "ていこく", - "ていさつ", - "ていし", - "ていせい", - "ていたい", - "ていど", - "ていねい", - "ていひょう", - "ていへん", - "ていぼう", - "てうち", - "ておくれ", - "てきとう", - "てくび", - "てさぎょう", - "てさげ", - "てすり", - "てそう", - "てちがい", - "てちょう", - "てつがく", - "てつづき", - "てつぼう", - "てつや", - "てぬき", - "てぬぐい", - "てのひら", - "てはい", - "てふだ", - "てぶくろ", - "てほどき", - "てほん", - "てまえ", - "てまきずし", - "てみじか", - "てみやげ", - "てらす", - "てれび", - "てわけ", - "てわたし", - "てんいん", - "てんかい", - "てんき", - "てんぐ", - "てんけん", - "てんごく", - "てんさい", - "てんし", - "てんすう", - "てんてき", - "てんとう", - "てんない", - "てんぷら", - "てんぼうだい", - "てんめつ", - "てんらんかい", - "でこぼこ", - "でっぱ", - "でぬかえ", - "でんあつ", - "でんち", - "でんりょく", - "でんわ", - "といれ", - "とうきゅう", - "とうし", - "とうむぎ", - "とおい", - "とおか", - "とおく", - "とおす", - "とおる", - "とかい", - "とかす", - "ときおり", - "ときどき", - "とくい", - "とくしゅう", - "とくてん", - "とくに", - "とくべつ", - "とけい", - "とける", - "とこや", - "とさか", - "としょかん", - "とそう", - "とたん", - "とちゅう", - "とっきゅう", - "とっくん", - "とつぜん", - "とつにゅう", - "ととのえる", - "とどける", - "とない", - "となえる", - "となり", - "とのさま", - "とばす", - "とほう", - "とまる", - "とめる", - "ともだち", - "ともる", - "とらえる", - "とんかつ", - "どあい", - "どうかん", - "どうぐ", - "どぶがわ", - "どようび", - "どんぶり", - "ないかく", - "ないこう", - "ないしょ", - "ないす", - "ないせん", - "ないそう", - "なおす", - "ながい", - "なくす", - "なげる", - "なこうど", - "なさけ", - "なたでここ", - "なっとう", - "なつやすみ", - "ななおし", - "なにごと", - "なにもの", - "なにわ", - "なのか", - "なふだ", - "なまいき", - "なまえ", - "なまみ", - "なみだ", - "なめらか", - "なめる", - "なやむ", - "ならう", - "ならび", - "ならぶ", - "なれる", - "なわとび", - "なわばり", - "にあう", - "にいがた", - "にうけ", - "におい", - "にかい", - "にがて", - "にきび", - "にくしみ", - "にくまん", - "にげる", - "にさんかたんそ", - "にしき", - "にせもの", - "にちじょう", - "にちようび", - "にっか", - "にっき", - "にっけい", - "にっこう", - "にっさん", - "にっしょく", - "にっすう", - "にっせき", - "にってい", - "になう", - "にほん", - "にまめ", - "にもつ", - "にやり", - "にゅういん", - "にりんしゃ", - "にわとり", - "にんい", - "にんか", - "にんき", - "にんげん", - "にんしき", - "にんずう", - "にんそう", - "にんたい", - "にんち", - "にんてい", - "にんにく", - "にんぷ", - "にんまり", - "にんむ", - "にんめい", - "にんよう", - "ぬいくぎ", - "ぬかす", - "ぬくもり", - "ぬぐいとる", - "ぬぐう", - "ぬすむ", - "ぬまえび", - "ぬめり", - "ぬらす", - "ぬんちゃく", - "ねあげ", - "ねいき", - "ねいる", - "ねいろ", - "ねくたい", - "ねくら", - "ねぐせ", - "ねこぜ", - "ねこむ", - "ねさげ", - "ねすごす", - "ねそべる", - "ねだん", - "ねっしん", - "ねったいぎょ", - "ねつい", - "ねつぞう", - "ねふだ", - "ねぶそく", - "ねほりはほり", - "ねぼう", - "ねまき", - "ねまわし", - "ねみみ", - "ねむい", - "ねむたい", - "ねもと", - "ねらう", - "ねわざ", - "ねんいり", - "ねんおし", - "ねんかん", - "ねんきん", - "ねんぐ", - "ねんざ", - "ねんし", - "ねんちゃく", - "ねんど", - "ねんぴ", - "ねんぶつ", - "ねんまつ", - "ねんりょう", - "ねんれい", - "のいず", - "のおづま", - "のがす", - "のきなみ", - "のこぎり", - "のこす", - "のこる", - "のせる", - "のぞく", - "のぞむ", - "のたまう", - "のちほど", - "のっく", - "のはら", - "のばす", - "のべる", - "のぼる", - "のみもの", - "のやま", - "のらいぬ", - "のらねこ", - "のりもの", - "のりゆき", - "のれん", - "のんき", - "はあく", - "はいけん", - "はいご", - "はいしん", - "はいすい", - "はいせん", - "はいそう", - "はいち", - "はいれつ", - "はえる", - "はおる", - "はかい", - "はかる", - "はくしゅ", - "はけん", - "はこぶ", - "はさみ", - "はさん", - "はしご", - "はしる", - "はせる", - "はそん", - "はたん", - "はちみつ", - "はっかく", - "はっきり", - "はっくつ", - "はっけん", - "はっこう", - "はっさん", - "はっしん", - "はったつ", - "はっちゅう", - "はってん", - "はっぴょう", - "はっぽう", - "はつおん", - "はづき", - "はなす", - "はなび", - "はにかむ", - "はぶらし", - "はみがき", - "はむかう", - "はめつ", - "はやい", - "はやし", - "はらう", - "はろうぃん", - "はわい", - "はんい", - "はんえい", - "はんおん", - "はんかく", - "はんきょう", - "はんこ", - "はんしゃ", - "はんすう", - "はんだん", - "はんてい", - "はんとし", - "はんのう", - "はんぱ", - "はんぶん", - "はんぺん", - "はんぼうき", - "はんめい", - "はんらん", - "はんろん", - "ばあい", - "ばあさん", - "ばいか", - "ばいく", - "ばいばい", - "ばかり", - "ばしょ", - "ばんぐみ", - "ぱそこん", - "ぱんち", - "ぱんつ", - "ひいき", - "ひうん", - "ひえる", - "ひかく", - "ひかり", - "ひかる", - "ひかん", - "ひくい", - "ひけつ", - "ひこうき", - "ひこく", - "ひさい", - "ひさしぶり", - "ひさん", - "ひしょ", - "ひそか", - "ひそむ", - "ひたむき", - "ひたる", - "ひだり", - "ひっこし", - "ひっし", - "ひっす", - "ひつぎ", - "ひつじゅひん", - "ひつぜん", - "ひつよう", - "ひてい", - "ひとごみ", - "ひなまつり", - "ひなん", - "ひねる", - "ひはん", - "ひひょう", - "ひびく", - "ひほう", - "ひまわり", - "ひまん", - "ひみつ", - "ひめい", - "ひめじし", - "ひやけ", - "ひやす", - "ひよう", - "ひらがな", - "ひらく", - "ひりつ", - "ひりょう", - "ひるま", - "ひるやすみ", - "ひれい", - "ひろい", - "ひろう", - "ひろき", - "ひろゆき", - "ひんかく", - "ひんけつ", - "ひんこん", - "ひんしゅ", - "ひんそう", - "ひんぱん", - "びじゅつかん", - "びょうき", - "びんぼう", - "ぴったり", - "ぴっちり", - "ぴんち", - "ふあん", - "ふいうち", - "ふうけい", - "ふうせん", - "ふうとう", - "ふうふ", - "ふえる", - "ふおん", - "ふかい", - "ふきん", - "ふくざつ", - "ふくぶくろ", - "ふこう", - "ふさい", - "ふしぎ", - "ふじみ", - "ふすま", - "ふせい", - "ふせぐ", - "ふそく", - "ふたん", - "ふちょう", - "ふっかつ", - "ふっき", - "ふっこく", - "ふつう", - "ふつか", - "ふとる", - "ふとん", - "ふのう", - "ふはい", - "ふひょう", - "ふへん", - "ふまん", - "ふみん", - "ふめつ", - "ふめん", - "ふよう", - "ふりこ", - "ふりる", - "ふるい", - "ふんいき", - "ふんしつ", - "ふんそう", - "ぶたにく", - "ぶどう", - "ぶんがく", - "ぶんぐ", - "ぶんせき", - "ぶんぽう", - "ぷうたろう", - "へいあん", - "へいおん", - "へいがい", - "へいき", - "へいげん", - "へいこう", - "へいさ", - "へいしゃ", - "へいせつ", - "へいそ", - "へいたく", - "へいてん", - "へいねつ", - "へいわ", - "へきが", - "へこむ", - "へらす", - "へんかん", - "へんさい", - "へんたい", - "べにいろ", - "べにしょうが", - "べんきょう", - "べんごし", - "べんり", - "ほあん", - "ほいく", - "ほうこく", - "ほうそう", - "ほうほう", - "ほうもん", - "ほうりつ", - "ほえる", - "ほおん", - "ほかん", - "ほきょう", - "ほくろ", - "ほけつ", - "ほけん", - "ほこう", - "ほこる", - "ほしい", - "ほしつ", - "ほしゅ", - "ほしょう", - "ほせい", - "ほそい", - "ほそく", - "ほたて", - "ほたる", - "ほっきょく", - "ほっさ", - "ほったん", - "ほとんど", - "ほめる", - "ほんい", - "ほんき", - "ほんけ", - "ほんしつ", - "ほんやく", - "ぼうぎょ", - "ぼきん", - "ぽちぶくろ", - "まいにち", - "まかい", - "まかせる", - "まがる", - "まける", - "まこと", - "まさつ", - "まじめ", - "ますく", - "まぜる", - "まつり", - "まとめ", - "まなぶ", - "まぬけ", - "まねく", - "まほう", - "まもる", - "まゆげ", - "まよう", - "まろやか", - "まわす", - "まわり", - "まわる", - "まんが", - "まんきつ", - "まんぞく", - "まんなか", - "みいら", - "みうち", - "みえる", - "みかた", - "みかん", - "みがく", - "みけん", - "みこん", - "みじかい", - "みすい", - "みすえる", - "みせる", - "みっか", - "みつかる", - "みつける", - "みてい", - "みとめる", - "みなと", - "みなみかさい", - "みねらる", - "みのう", - "みのがす", - "みほん", - "みもと", - "みやげ", - "みらい", - "みりょく", - "みわく", - "みんか", - "みんぞく", - "むいか", - "むえき", - "むえん", - "むかい", - "むかう", - "むかえ", - "むかし", - "むぎちゃ", - "むける", - "むげん", - "むさぼる", - "むしあつい", - "むしば", - "むしろ", - "むじゅん", - "むすう", - "むすこ", - "むすぶ", - "むすめ", - "むせる", - "むせん", - "むちゅう", - "むなしい", - "むのう", - "むやみ", - "むよう", - "むらさき", - "むりょう", - "むろん", - "めいあん", - "めいうん", - "めいえん", - "めいかく", - "めいきょく", - "めいさい", - "めいし", - "めいそう", - "めいぶつ", - "めいれい", - "めいわく", - "めぐまれる", - "めざす", - "めした", - "めずらしい", - "めだつ", - "めまい", - "めやす", - "めんきょ", - "めんせき", - "めんどう", - "もうしあげる", - "もうどうけん", - "もえる", - "もくし", - "もくてき", - "もくようび", - "もちろん", - "もどる", - "もらう", - "もんく", - "もんだい", - "やおや", - "やける", - "やさい", - "やさしい", - "やすい", - "やすたろう", - "やすみ", - "やせる", - "やそう", - "やたい", - "やちん", - "やっと", - "やっぱり", - "やぶる", - "やめる", - "ややこしい", - "やよい", - "やわらかい", - "ゆうき", - "ゆうびんきょく", - "ゆうべ", - "ゆうめい", - "ゆけつ", - "ゆしゅつ", - "ゆせん", - "ゆそう", - "ゆたか", - "ゆちゃく", - "ゆでる", - "ゆにゅう", - "ゆびわ", - "ゆらい", - "ゆれる", - "ようい", - "ようか", - "ようきゅう", - "ようじ", - "ようす", - "ようちえん", - "よかぜ", - "よかん", - "よきん", - "よくせい", - "よくぼう", - "よけい", - "よごれる", - "よさん", - "よしゅう", - "よそう", - "よそく", - "よっか", - "よてい", - "よどがわく", - "よねつ", - "よやく", - "よゆう", - "よろこぶ", - "よろしい", - "らいう", - "らくがき", - "らくご", - "らくさつ", - "らくだ", - "らしんばん", - "らせん", - "らぞく", - "らたい", - "らっか", - "られつ", - "りえき", - "りかい", - "りきさく", - "りきせつ", - "りくぐん", - "りくつ", - "りけん", - "りこう", - "りせい", - "りそう", - "りそく", - "りてん", - "りねん", - "りゅうがく", - "りゆう", - "りょうり", - "りょかん", - "りょくちゃ", - "りょこう", - "りよう", - "りりく", - "りれき", - "りろん", - "りんご", - "るいけい", - "るいさい", - "るいじ", - "るいせき", - "るすばん", - "るりがわら", - "れいかん", - "れいぎ", - "れいせい", - "れいぞうこ", - "れいとう", - "れいぼう", - "れきし", - "れきだい", - "れんあい", - "れんけい", - "れんこん", - "れんさい", - "れんしゅう", - "れんぞく", - "れんらく", - "ろうか", - "ろうご", - "ろうじん", - "ろうそく", - "ろくが", - "ろこつ", - "ろしゅつ", - "ろじうら", - "ろせん", - "ろてん", - "ろめん", - "ろれつ", - "ろんぎ", - "ろんぱ", - "ろんぶん", - "ろんり", - "わかす", - "わかめ", - "わかやま", - "わかれる", - "わしつ", - "わじまし", - "わすれもの", - "わらう", - "われる" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/ko.rs b/networks/monero/wallet/polyseed/src/words/ko.rs deleted file mode 100644 index a41902f5b..000000000 --- a/networks/monero/wallet/polyseed/src/words/ko.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "가격", - "가끔", - "가난", - "가능", - "가득", - "가르침", - "가뭄", - "가방", - "가상", - "가슴", - "가운데", - "가을", - "가이드", - "가입", - "가장", - "가정", - "가족", - "가죽", - "각오", - "각자", - "간격", - "간부", - "간섭", - "간장", - "간접", - "간판", - "갈등", - "갈비", - "갈색", - "갈증", - "감각", - "감기", - "감소", - "감수성", - "감자", - "감정", - "갑자기", - "강남", - "강당", - "강도", - "강력히", - "강변", - "강북", - "강사", - "강수량", - "강아지", - "강원도", - "강의", - "강제", - "강조", - "같이", - "개구리", - "개나리", - "개방", - "개별", - "개선", - "개성", - "개인", - "객관적", - "거실", - "거액", - "거울", - "거짓", - "거품", - "걱정", - "건강", - "건물", - "건설", - "건조", - "건축", - "걸음", - "검사", - "검토", - "게시판", - "게임", - "겨울", - "견해", - "결과", - "결국", - "결론", - "결석", - "결승", - "결심", - "결정", - "결혼", - "경계", - "경고", - "경기", - "경력", - "경복궁", - "경비", - "경상도", - "경영", - "경우", - "경쟁", - "경제", - "경주", - "경찰", - "경치", - "경향", - "경험", - "계곡", - "계단", - "계란", - "계산", - "계속", - "계약", - "계절", - "계층", - "계획", - "고객", - "고구려", - "고궁", - "고급", - "고등학생", - "고무신", - "고민", - "고양이", - "고장", - "고전", - "고집", - "고춧가루", - "고통", - "고향", - "곡식", - "골목", - "골짜기", - "골프", - "공간", - "공개", - "공격", - "공군", - "공급", - "공기", - "공동", - "공무원", - "공부", - "공사", - "공식", - "공업", - "공연", - "공원", - "공장", - "공짜", - "공책", - "공통", - "공포", - "공항", - "공휴일", - "과목", - "과일", - "과장", - "과정", - "과학", - "관객", - "관계", - "관광", - "관념", - "관람", - "관련", - "관리", - "관습", - "관심", - "관점", - "관찰", - "광경", - "광고", - "광장", - "광주", - "괴로움", - "굉장히", - "교과서", - "교문", - "교복", - "교실", - "교양", - "교육", - "교장", - "교직", - "교통", - "교환", - "교훈", - "구경", - "구름", - "구멍", - "구별", - "구분", - "구석", - "구성", - "구속", - "구역", - "구입", - "구청", - "구체적", - "국가", - "국기", - "국내", - "국립", - "국물", - "국민", - "국수", - "국어", - "국왕", - "국적", - "국제", - "국회", - "군대", - "군사", - "군인", - "궁극적", - "권리", - "권위", - "권투", - "귀국", - "귀신", - "규정", - "규칙", - "균형", - "그날", - "그냥", - "그늘", - "그러나", - "그룹", - "그릇", - "그림", - "그제서야", - "그토록", - "극복", - "극히", - "근거", - "근교", - "근래", - "근로", - "근무", - "근본", - "근원", - "근육", - "근처", - "글씨", - "글자", - "금강산", - "금고", - "금년", - "금메달", - "금액", - "금연", - "금요일", - "금지", - "긍정적", - "기간", - "기관", - "기념", - "기능", - "기독교", - "기둥", - "기록", - "기름", - "기법", - "기본", - "기분", - "기쁨", - "기숙사", - "기술", - "기억", - "기업", - "기온", - "기운", - "기원", - "기적", - "기준", - "기침", - "기혼", - "기획", - "긴급", - "긴장", - "길이", - "김밥", - "김치", - "김포공항", - "깍두기", - "깜빡", - "깨달음", - "깨소금", - "껍질", - "꼭대기", - "꽃잎", - "나들이", - "나란히", - "나머지", - "나물", - "나침반", - "나흘", - "낙엽", - "난방", - "날개", - "날씨", - "날짜", - "남녀", - "남대문", - "남매", - "남산", - "남자", - "남편", - "남학생", - "낭비", - "낱말", - "내년", - "내용", - "내일", - "냄비", - "냄새", - "냇물", - "냉동", - "냉면", - "냉방", - "냉장고", - "넥타이", - "넷째", - "노동", - "노란색", - "노력", - "노인", - "녹음", - "녹차", - "녹화", - "논리", - "논문", - "논쟁", - "놀이", - "농구", - "농담", - "농민", - "농부", - "농업", - "농장", - "농촌", - "높이", - "눈동자", - "눈물", - "눈썹", - "뉴욕", - "느낌", - "늑대", - "능동적", - "능력", - "다방", - "다양성", - "다음", - "다이어트", - "다행", - "단계", - "단골", - "단독", - "단맛", - "단순", - "단어", - "단위", - "단점", - "단체", - "단추", - "단편", - "단풍", - "달걀", - "달러", - "달력", - "달리", - "닭고기", - "담당", - "담배", - "담요", - "담임", - "답변", - "답장", - "당근", - "당분간", - "당연히", - "당장", - "대규모", - "대낮", - "대단히", - "대답", - "대도시", - "대략", - "대량", - "대륙", - "대문", - "대부분", - "대신", - "대응", - "대장", - "대전", - "대접", - "대중", - "대책", - "대출", - "대충", - "대통령", - "대학", - "대한민국", - "대합실", - "대형", - "덩어리", - "데이트", - "도대체", - "도덕", - "도둑", - "도망", - "도서관", - "도심", - "도움", - "도입", - "도자기", - "도저히", - "도전", - "도중", - "도착", - "독감", - "독립", - "독서", - "독일", - "독창적", - "동화책", - "뒷모습", - "뒷산", - "딸아이", - "마누라", - "마늘", - "마당", - "마라톤", - "마련", - "마무리", - "마사지", - "마약", - "마요네즈", - "마을", - "마음", - "마이크", - "마중", - "마지막", - "마찬가지", - "마찰", - "마흔", - "막걸리", - "막내", - "막상", - "만남", - "만두", - "만세", - "만약", - "만일", - "만점", - "만족", - "만화", - "많이", - "말기", - "말씀", - "말투", - "맘대로", - "망원경", - "매년", - "매달", - "매력", - "매번", - "매스컴", - "매일", - "매장", - "맥주", - "먹이", - "먼저", - "먼지", - "멀리", - "메일", - "며느리", - "며칠", - "면담", - "멸치", - "명단", - "명령", - "명예", - "명의", - "명절", - "명칭", - "명함", - "모금", - "모니터", - "모델", - "모든", - "모범", - "모습", - "모양", - "모임", - "모조리", - "모집", - "모퉁이", - "목걸이", - "목록", - "목사", - "목소리", - "목숨", - "목적", - "목표", - "몰래", - "몸매", - "몸무게", - "몸살", - "몸속", - "몸짓", - "몸통", - "몹시", - "무관심", - "무궁화", - "무더위", - "무덤", - "무릎", - "무슨", - "무엇", - "무역", - "무용", - "무조건", - "무지개", - "무척", - "문구", - "문득", - "문법", - "문서", - "문제", - "문학", - "문화", - "물가", - "물건", - "물결", - "물고기", - "물론", - "물리학", - "물음", - "물질", - "물체", - "미국", - "미디어", - "미사일", - "미술", - "미역", - "미용실", - "미움", - "미인", - "미팅", - "미혼", - "민간", - "민족", - "민주", - "믿음", - "밀가루", - "밀리미터", - "밑바닥", - "바가지", - "바구니", - "바나나", - "바늘", - "바닥", - "바닷가", - "바람", - "바이러스", - "바탕", - "박물관", - "박사", - "박수", - "반대", - "반드시", - "반말", - "반발", - "반성", - "반응", - "반장", - "반죽", - "반지", - "반찬", - "받침", - "발가락", - "발걸음", - "발견", - "발달", - "발레", - "발목", - "발바닥", - "발생", - "발음", - "발자국", - "발전", - "발톱", - "발표", - "밤하늘", - "밥그릇", - "밥맛", - "밥상", - "밥솥", - "방금", - "방면", - "방문", - "방바닥", - "방법", - "방송", - "방식", - "방안", - "방울", - "방지", - "방학", - "방해", - "방향", - "배경", - "배꼽", - "배달", - "배드민턴", - "백두산", - "백색", - "백성", - "백인", - "백제", - "백화점", - "버릇", - "버섯", - "버튼", - "번개", - "번역", - "번지", - "번호", - "벌금", - "벌레", - "벌써", - "범위", - "범인", - "범죄", - "법률", - "법원", - "법적", - "법칙", - "베이징", - "벨트", - "변경", - "변동", - "변명", - "변신", - "변호사", - "변화", - "별도", - "별명", - "별일", - "병실", - "병아리", - "병원", - "보관", - "보너스", - "보라색", - "보람", - "보름", - "보상", - "보안", - "보자기", - "보장", - "보전", - "보존", - "보통", - "보편적", - "보험", - "복도", - "복사", - "복숭아", - "복습", - "볶음", - "본격적", - "본래", - "본부", - "본사", - "본성", - "본인", - "본질", - "볼펜", - "봉사", - "봉지", - "봉투", - "부근", - "부끄러움", - "부담", - "부동산", - "부문", - "부분", - "부산", - "부상", - "부엌", - "부인", - "부작용", - "부장", - "부정", - "부족", - "부지런히", - "부친", - "부탁", - "부품", - "부회장", - "북부", - "북한", - "분노", - "분량", - "분리", - "분명", - "분석", - "분야", - "분위기", - "분필", - "분홍색", - "불고기", - "불과", - "불교", - "불꽃", - "불만", - "불법", - "불빛", - "불안", - "불이익", - "불행", - "브랜드", - "비극", - "비난", - "비닐", - "비둘기", - "비디오", - "비로소", - "비만", - "비명", - "비밀", - "비바람", - "비빔밥", - "비상", - "비용", - "비율", - "비중", - "비타민", - "비판", - "빌딩", - "빗물", - "빗방울", - "빗줄기", - "빛깔", - "빨간색", - "빨래", - "빨리", - "사건", - "사계절", - "사나이", - "사냥", - "사람", - "사랑", - "사립", - "사모님", - "사물", - "사방", - "사상", - "사생활", - "사설", - "사슴", - "사실", - "사업", - "사용", - "사월", - "사장", - "사전", - "사진", - "사촌", - "사춘기", - "사탕", - "사투리", - "사흘", - "산길", - "산부인과", - "산업", - "산책", - "살림", - "살인", - "살짝", - "삼계탕", - "삼국", - "삼십", - "삼월", - "삼촌", - "상관", - "상금", - "상대", - "상류", - "상반기", - "상상", - "상식", - "상업", - "상인", - "상자", - "상점", - "상처", - "상추", - "상태", - "상표", - "상품", - "상황", - "새벽", - "색깔", - "색연필", - "생각", - "생명", - "생물", - "생방송", - "생산", - "생선", - "생신", - "생일", - "생활", - "서랍", - "서른", - "서명", - "서민", - "서비스", - "서양", - "서울", - "서적", - "서점", - "서쪽", - "서클", - "석사", - "석유", - "선거", - "선물", - "선배", - "선생", - "선수", - "선원", - "선장", - "선전", - "선택", - "선풍기", - "설거지", - "설날", - "설렁탕", - "설명", - "설문", - "설사", - "설악산", - "설치", - "설탕", - "섭씨", - "성공", - "성당", - "성명", - "성별", - "성인", - "성장", - "성적", - "성질", - "성함", - "세금", - "세미나", - "세상", - "세월", - "세종대왕", - "세탁", - "센터", - "센티미터", - "셋째", - "소규모", - "소극적", - "소금", - "소나기", - "소년", - "소득", - "소망", - "소문", - "소설", - "소속", - "소아과", - "소용", - "소원", - "소음", - "소중히", - "소지품", - "소질", - "소풍", - "소형", - "속담", - "속도", - "속옷", - "손가락", - "손길", - "손녀", - "손님", - "손등", - "손목", - "손뼉", - "손실", - "손질", - "손톱", - "손해", - "솔직히", - "솜씨", - "송아지", - "송이", - "송편", - "쇠고기", - "쇼핑", - "수건", - "수년", - "수단", - "수돗물", - "수동적", - "수면", - "수명", - "수박", - "수상", - "수석", - "수술", - "수시로", - "수업", - "수염", - "수영", - "수입", - "수준", - "수집", - "수출", - "수컷", - "수필", - "수학", - "수험생", - "수화기", - "숙녀", - "숙소", - "숙제", - "순간", - "순서", - "순수", - "순식간", - "순위", - "숟가락", - "술병", - "술집", - "숫자", - "스님", - "스물", - "스스로", - "스승", - "스웨터", - "스위치", - "스케이트", - "스튜디오", - "스트레스", - "스포츠", - "슬쩍", - "슬픔", - "습관", - "습기", - "승객", - "승리", - "승부", - "승용차", - "승진", - "시각", - "시간", - "시골", - "시금치", - "시나리오", - "시댁", - "시리즈", - "시멘트", - "시민", - "시부모", - "시선", - "시설", - "시스템", - "시아버지", - "시어머니", - "시월", - "시인", - "시일", - "시작", - "시장", - "시절", - "시점", - "시중", - "시즌", - "시집", - "시청", - "시합", - "시험", - "식구", - "식기", - "식당", - "식량", - "식료품", - "식물", - "식빵", - "식사", - "식생활", - "식초", - "식탁", - "식품", - "신고", - "신규", - "신념", - "신문", - "신발", - "신비", - "신사", - "신세", - "신용", - "신제품", - "신청", - "신체", - "신화", - "실감", - "실내", - "실력", - "실례", - "실망", - "실수", - "실습", - "실시", - "실장", - "실정", - "실질적", - "실천", - "실체", - "실컷", - "실태", - "실패", - "실험", - "실현", - "심리", - "심부름", - "심사", - "심장", - "심정", - "심판", - "쌍둥이", - "씨름", - "씨앗", - "아가씨", - "아나운서", - "아드님", - "아들", - "아쉬움", - "아스팔트", - "아시아", - "아울러", - "아저씨", - "아줌마", - "아직", - "아침", - "아파트", - "아프리카", - "아픔", - "아홉", - "아흔", - "악기", - "악몽", - "악수", - "안개", - "안경", - "안과", - "안내", - "안녕", - "안동", - "안방", - "안부", - "안주", - "알루미늄", - "알코올", - "암시", - "암컷", - "압력", - "앞날", - "앞문", - "애인", - "애정", - "액수", - "앨범", - "야간", - "야단", - "야옹", - "약간", - "약국", - "약속", - "약수", - "약점", - "약품", - "약혼녀", - "양념", - "양력", - "양말", - "양배추", - "양주", - "양파", - "어둠", - "어려움", - "어른", - "어젯밤", - "어쨌든", - "어쩌다가", - "어쩐지", - "언니", - "언덕", - "언론", - "언어", - "얼굴", - "얼른", - "얼음", - "얼핏", - "엄마", - "업무", - "업종", - "업체", - "엉덩이", - "엉망", - "엉터리", - "엊그제", - "에너지", - "에어컨", - "엔진", - "여건", - "여고생", - "여관", - "여군", - "여권", - "여대생", - "여덟", - "여동생", - "여든", - "여론", - "여름", - "여섯", - "여성", - "여왕", - "여인", - "여전히", - "여직원", - "여학생", - "여행", - "역사", - "역시", - "역할", - "연결", - "연구", - "연극", - "연기", - "연락", - "연설", - "연세", - "연속", - "연습", - "연애", - "연예인", - "연인", - "연장", - "연주", - "연출", - "연필", - "연합", - "연휴", - "열기", - "열매", - "열쇠", - "열심히", - "열정", - "열차", - "열흘", - "염려", - "엽서", - "영국", - "영남", - "영상", - "영양", - "영역", - "영웅", - "영원히", - "영하", - "영향", - "영혼", - "영화", - "옆구리", - "옆방", - "옆집", - "예감", - "예금", - "예방", - "예산", - "예상", - "예선", - "예술", - "예습", - "예식장", - "예약", - "예전", - "예절", - "예정", - "예컨대", - "옛날", - "오늘", - "오락", - "오랫동안", - "오렌지", - "오로지", - "오른발", - "오븐", - "오십", - "오염", - "오월", - "오전", - "오직", - "오징어", - "오페라", - "오피스텔", - "오히려", - "옥상", - "옥수수", - "온갖", - "온라인", - "온몸", - "온종일", - "온통", - "올가을", - "올림픽", - "올해", - "옷차림", - "와이셔츠", - "와인", - "완성", - "완전", - "왕비", - "왕자", - "왜냐하면", - "왠지", - "외갓집", - "외국", - "외로움", - "외삼촌", - "외출", - "외침", - "외할머니", - "왼발", - "왼손", - "왼쪽", - "요금", - "요일", - "요즘", - "요청", - "용기", - "용서", - "용어", - "우산", - "우선", - "우승", - "우연히", - "우정", - "우체국", - "우편", - "운동", - "운명", - "운반", - "운전", - "운행", - "울산", - "울음", - "움직임", - "웃어른", - "웃음", - "워낙", - "원고", - "원래", - "원서", - "원숭이", - "원인", - "원장", - "원피스", - "월급", - "월드컵", - "월세", - "월요일", - "웨이터", - "위반", - "위법", - "위성", - "위원", - "위험", - "위협", - "윗사람", - "유난히", - "유럽", - "유명", - "유물", - "유산", - "유적", - "유치원", - "유학", - "유행", - "유형", - "육군", - "육상", - "육십", - "육체", - "은행", - "음력", - "음료", - "음반", - "음성", - "음식", - "음악", - "음주", - "의견", - "의논", - "의문", - "의복", - "의식", - "의심", - "의외로", - "의욕", - "의원", - "의학", - "이것", - "이곳", - "이념", - "이놈", - "이달", - "이대로", - "이동", - "이렇게", - "이력서", - "이론적", - "이름", - "이민", - "이발소", - "이별", - "이불", - "이빨", - "이상", - "이성", - "이슬", - "이야기", - "이용", - "이웃", - "이월", - "이윽고", - "이익", - "이전", - "이중", - "이튿날", - "이틀", - "이혼", - "인간", - "인격", - "인공", - "인구", - "인근", - "인기", - "인도", - "인류", - "인물", - "인생", - "인쇄", - "인연", - "인원", - "인재", - "인종", - "인천", - "인체", - "인터넷", - "인하", - "인형", - "일곱", - "일기", - "일단", - "일대", - "일등", - "일반", - "일본", - "일부", - "일상", - "일생", - "일손", - "일요일", - "일월", - "일정", - "일종", - "일주일", - "일찍", - "일체", - "일치", - "일행", - "일회용", - "임금", - "임무", - "입대", - "입력", - "입맛", - "입사", - "입술", - "입시", - "입원", - "입장", - "입학", - "자가용", - "자격", - "자극", - "자동", - "자랑", - "자부심", - "자식", - "자신", - "자연", - "자원", - "자율", - "자전거", - "자정", - "자존심", - "자판", - "작가", - "작년", - "작성", - "작업", - "작용", - "작은딸", - "작품", - "잔디", - "잔뜩", - "잔치", - "잘못", - "잠깐", - "잠수함", - "잠시", - "잠옷", - "잠자리", - "잡지", - "장관", - "장군", - "장기간", - "장래", - "장례", - "장르", - "장마", - "장면", - "장모", - "장미", - "장비", - "장사", - "장소", - "장식", - "장애인", - "장인", - "장점", - "장차", - "장학금", - "재능", - "재빨리", - "재산", - "재생", - "재작년", - "재정", - "재채기", - "재판", - "재학", - "재활용", - "저것", - "저고리", - "저곳", - "저녁", - "저런", - "저렇게", - "저번", - "저울", - "저절로", - "저축", - "적극", - "적당히", - "적성", - "적용", - "적응", - "전개", - "전공", - "전기", - "전달", - "전라도", - "전망", - "전문", - "전반", - "전부", - "전세", - "전시", - "전용", - "전자", - "전쟁", - "전주", - "전철", - "전체", - "전통", - "전혀", - "전후", - "절대", - "절망", - "절반", - "절약", - "절차", - "점검", - "점수", - "점심", - "점원", - "점점", - "점차", - "접근", - "접시", - "접촉", - "젓가락", - "정거장", - "정도", - "정류장", - "정리", - "정말", - "정면", - "정문", - "정반대", - "정보", - "정부", - "정비", - "정상", - "정성", - "정오", - "정원", - "정장", - "정지", - "정치", - "정확히", - "제공", - "제과점", - "제대로", - "제목", - "제발", - "제법", - "제삿날", - "제안", - "제일", - "제작", - "제주도", - "제출", - "제품", - "제한", - "조각", - "조건", - "조금", - "조깅", - "조명", - "조미료", - "조상", - "조선", - "조용히", - "조절", - "조정", - "조직", - "존댓말", - "존재", - "졸업", - "졸음", - "종교", - "종로", - "종류", - "종소리", - "종업원", - "종종", - "종합", - "좌석", - "죄인", - "주관적", - "주름", - "주말", - "주머니", - "주먹", - "주문", - "주민", - "주방", - "주변", - "주식", - "주인", - "주일", - "주장", - "주전자", - "주택", - "준비", - "줄거리", - "줄기", - "줄무늬", - "중간", - "중계방송", - "중국", - "중년", - "중단", - "중독", - "중반", - "중부", - "중세", - "중소기업", - "중순", - "중앙", - "중요", - "중학교", - "즉석", - "즉시", - "즐거움", - "증가", - "증거", - "증권", - "증상", - "증세", - "지각", - "지갑", - "지경", - "지극히", - "지금", - "지급", - "지능", - "지름길", - "지리산", - "지방", - "지붕", - "지식", - "지역", - "지우개", - "지원", - "지적", - "지점", - "지진", - "지출", - "직선", - "직업", - "직원", - "직장", - "진급", - "진동", - "진로", - "진료", - "진리", - "진짜", - "진찰", - "진출", - "진통", - "진행", - "질문", - "질병", - "질서", - "짐작", - "집단", - "집안", - "집중", - "짜증", - "찌꺼기", - "차남", - "차라리", - "차량", - "차림", - "차별", - "차선", - "차츰", - "착각", - "찬물", - "찬성", - "참가", - "참기름", - "참새", - "참석", - "참여", - "참외", - "참조", - "찻잔", - "창가", - "창고", - "창구", - "창문", - "창밖", - "창작", - "창조", - "채널", - "채점", - "책가방", - "책방", - "책상", - "책임", - "챔피언", - "처벌", - "처음", - "천국", - "천둥", - "천장", - "천재", - "천천히", - "철도", - "철저히", - "철학", - "첫날", - "첫째", - "청년", - "청바지", - "청소", - "청춘", - "체계", - "체력", - "체온", - "체육", - "체중", - "체험", - "초등학생", - "초반", - "초밥", - "초상화", - "초순", - "초여름", - "초원", - "초저녁", - "초점", - "초청", - "초콜릿", - "촛불", - "총각", - "총리", - "총장", - "촬영", - "최근", - "최상", - "최선", - "최신", - "최악", - "최종", - "추석", - "추억", - "추진", - "추천", - "추측", - "축구", - "축소", - "축제", - "축하", - "출근", - "출발", - "출산", - "출신", - "출연", - "출입", - "출장", - "출판", - "충격", - "충고", - "충돌", - "충분히", - "충청도", - "취업", - "취직", - "취향", - "치약", - "친구", - "친척", - "칠십", - "칠월", - "칠판", - "침대", - "침묵", - "침실", - "칫솔", - "칭찬", - "카메라", - "카운터", - "칼국수", - "캐릭터", - "캠퍼스", - "캠페인", - "커튼", - "컨디션", - "컬러", - "컴퓨터", - "코끼리", - "코미디", - "콘서트", - "콜라", - "콤플렉스", - "콩나물", - "쾌감", - "쿠데타", - "크림", - "큰길", - "큰딸", - "큰소리", - "큰아들", - "큰어머니", - "큰일", - "큰절", - "클래식", - "클럽", - "킬로", - "타입", - "타자기", - "탁구", - "탁자", - "탄생", - "태권도", - "태양", - "태풍", - "택시", - "탤런트", - "터널", - "터미널", - "테니스", - "테스트", - "테이블", - "텔레비전", - "토론", - "토마토", - "토요일", - "통계", - "통과", - "통로", - "통신", - "통역", - "통일", - "통장", - "통제", - "통증", - "통합", - "통화", - "퇴근", - "퇴원", - "퇴직금", - "튀김", - "트럭", - "특급", - "특별", - "특성", - "특수", - "특징", - "특히", - "튼튼히", - "티셔츠", - "파란색", - "파일", - "파출소", - "판결", - "판단", - "판매", - "판사", - "팔십", - "팔월", - "팝송", - "패션", - "팩스", - "팩시밀리", - "팬티", - "퍼센트", - "페인트", - "편견", - "편의", - "편지", - "편히", - "평가", - "평균", - "평생", - "평소", - "평양", - "평일", - "평화", - "포스터", - "포인트", - "포장", - "포함", - "표면", - "표정", - "표준", - "표현", - "품목", - "품질", - "풍경", - "풍속", - "풍습", - "프랑스", - "프린터", - "플라스틱", - "피곤", - "피망", - "피아노", - "필름", - "필수", - "필요", - "필자", - "필통", - "핑계", - "하느님", - "하늘", - "하드웨어", - "하룻밤", - "하반기", - "하숙집", - "하순", - "하여튼", - "하지만", - "하천", - "하품", - "하필", - "학과", - "학교", - "학급", - "학기", - "학년", - "학력", - "학번", - "학부모", - "학비", - "학생", - "학술", - "학습", - "학용품", - "학원", - "학위", - "학자", - "학점", - "한계", - "한글", - "한꺼번에", - "한낮", - "한눈", - "한동안", - "한때", - "한라산", - "한마디", - "한문", - "한번", - "한복", - "한식", - "한여름", - "한쪽", - "할머니", - "할아버지", - "할인", - "함께", - "함부로", - "합격", - "합리적", - "항공", - "항구", - "항상", - "항의", - "해결", - "해군", - "해답", - "해당", - "해물", - "해석", - "해설", - "해수욕장", - "해안", - "핵심", - "핸드백", - "햄버거", - "햇볕", - "햇살", - "행동", - "행복", - "행사", - "행운", - "행위", - "향기", - "향상", - "향수", - "허락", - "허용", - "헬기", - "현관", - "현금", - "현대", - "현상", - "현실", - "현장", - "현재", - "현지", - "혈액", - "협력", - "형부", - "형사", - "형수", - "형식", - "형제", - "형태", - "형편", - "혜택", - "호기심", - "호남", - "호랑이", - "호박", - "호텔", - "호흡", - "혹시", - "홀로", - "홈페이지", - "홍보", - "홍수", - "홍차", - "화면", - "화분", - "화살", - "화요일", - "화장", - "화학", - "확보", - "확인", - "확장", - "확정", - "환갑", - "환경", - "환영", - "환율", - "환자", - "활기", - "활동", - "활발히", - "활용", - "활짝", - "회견", - "회관", - "회복", - "회색", - "회원", - "회장", - "회전", - "횟수", - "횡단보도", - "효율적", - "후반", - "후춧가루", - "훈련", - "훨씬", - "휴식", - "휴일", - "흉내", - "흐름", - "흑백", - "흑인", - "흔적", - "흔히", - "흥미", - "흥분", - "희곡", - "희망", - "희생", - "흰색", - "힘껏" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/pt.rs b/networks/monero/wallet/polyseed/src/words/pt.rs deleted file mode 100644 index 38b9ff4c5..000000000 --- a/networks/monero/wallet/polyseed/src/words/pt.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "abacate", - "abaixo", - "abalar", - "abater", - "abduzir", - "abelha", - "aberto", - "abismo", - "abotoar", - "abranger", - "abreviar", - "abrigar", - "abrupto", - "absinto", - "absoluto", - "absurdo", - "abutre", - "acabado", - "acalmar", - "acampar", - "acanhar", - "acaso", - "aceitar", - "acelerar", - "acenar", - "acervo", - "acessar", - "acetona", - "achatar", - "acidez", - "acima", - "acionado", - "acirrar", - "aclamar", - "aclive", - "acolhida", - "acomodar", - "acoplar", - "acordar", - "acumular", - "acusador", - "adaptar", - "adega", - "adentro", - "adepto", - "adequar", - "aderente", - "adesivo", - "adeus", - "adiante", - "aditivo", - "adjetivo", - "adjunto", - "admirar", - "adorar", - "adquirir", - "adubo", - "adverso", - "advogado", - "aeronave", - "afastar", - "aferir", - "afetivo", - "afinador", - "afivelar", - "aflito", - "afluente", - "afrontar", - "agachar", - "agarrar", - "agasalho", - "agenciar", - "agilizar", - "agiota", - "agitado", - "agora", - "agradar", - "agreste", - "agrupar", - "aguardar", - "agulha", - "ajoelhar", - "ajudar", - "ajustar", - "alameda", - "alarme", - "alastrar", - "alavanca", - "albergue", - "albino", - "alcatra", - "aldeia", - "alecrim", - "alegria", - "alertar", - "alface", - "alfinete", - "algum", - "alheio", - "aliar", - "alicate", - "alienar", - "alinhar", - "aliviar", - "almofada", - "alocar", - "alpiste", - "alterar", - "altitude", - "alucinar", - "alugar", - "aluno", - "alusivo", - "alvo", - "amaciar", - "amador", - "amarelo", - "amassar", - "ambas", - "ambiente", - "ameixa", - "amenizar", - "amido", - "amistoso", - "amizade", - "amolador", - "amontoar", - "amoroso", - "amostra", - "amparar", - "ampliar", - "ampola", - "anagrama", - "analisar", - "anarquia", - "anatomia", - "andaime", - "anel", - "anexo", - "angular", - "animar", - "anjo", - "anomalia", - "anotado", - "ansioso", - "anterior", - "anuidade", - "anunciar", - "anzol", - "apagador", - "apalpar", - "apanhado", - "apego", - "apelido", - "apertada", - "apesar", - "apetite", - "apito", - "aplauso", - "aplicada", - "apoio", - "apontar", - "aposta", - "aprendiz", - "aprovar", - "aquecer", - "arame", - "aranha", - "arara", - "arcada", - "ardente", - "areia", - "arejar", - "arenito", - "aresta", - "argiloso", - "argola", - "arma", - "arquivo", - "arraial", - "arrebate", - "arriscar", - "arroba", - "arrumar", - "arsenal", - "arterial", - "artigo", - "arvoredo", - "asfaltar", - "asilado", - "aspirar", - "assador", - "assinar", - "assoalho", - "assunto", - "astral", - "atacado", - "atadura", - "atalho", - "atarefar", - "atear", - "atender", - "aterro", - "ateu", - "atingir", - "atirador", - "ativo", - "atoleiro", - "atracar", - "atrevido", - "atriz", - "atual", - "atum", - "auditor", - "aumentar", - "aura", - "aurora", - "autismo", - "autoria", - "autuar", - "avaliar", - "avante", - "avaria", - "avental", - "avesso", - "aviador", - "avisar", - "avulso", - "axila", - "azarar", - "azedo", - "azeite", - "azulejo", - "babar", - "babosa", - "bacalhau", - "bacharel", - "bacia", - "bagagem", - "baiano", - "bailar", - "baioneta", - "bairro", - "baixista", - "bajular", - "baleia", - "baliza", - "balsa", - "banal", - "bandeira", - "banho", - "banir", - "banquete", - "barato", - "barbado", - "baronesa", - "barraca", - "barulho", - "baseado", - "bastante", - "batata", - "batedor", - "batida", - "batom", - "batucar", - "baunilha", - "beber", - "beijo", - "beirada", - "beisebol", - "beldade", - "beleza", - "belga", - "beliscar", - "bendito", - "bengala", - "benzer", - "berimbau", - "berlinda", - "berro", - "besouro", - "bexiga", - "bezerro", - "bico", - "bicudo", - "bienal", - "bifocal", - "bifurcar", - "bigorna", - "bilhete", - "bimestre", - "bimotor", - "biologia", - "biombo", - "biosfera", - "bipolar", - "birrento", - "biscoito", - "bisneto", - "bispo", - "bissexto", - "bitola", - "bizarro", - "blindado", - "bloco", - "bloquear", - "boato", - "bobagem", - "bocado", - "bocejo", - "bochecha", - "boicotar", - "bolada", - "boletim", - "bolha", - "bolo", - "bombeiro", - "bonde", - "boneco", - "bonita", - "borbulha", - "borda", - "boreal", - "borracha", - "bovino", - "boxeador", - "branco", - "brasa", - "braveza", - "breu", - "briga", - "brilho", - "brincar", - "broa", - "brochura", - "bronzear", - "broto", - "bruxo", - "bucha", - "budismo", - "bufar", - "bule", - "buraco", - "busca", - "busto", - "buzina", - "cabana", - "cabelo", - "cabide", - "cabo", - "cabrito", - "cacau", - "cacetada", - "cachorro", - "cacique", - "cadastro", - "cadeado", - "cafezal", - "caiaque", - "caipira", - "caixote", - "cajado", - "caju", - "calafrio", - "calcular", - "caldeira", - "calibrar", - "calmante", - "calota", - "camada", - "cambista", - "camisa", - "camomila", - "campanha", - "camuflar", - "canavial", - "cancelar", - "caneta", - "canguru", - "canhoto", - "canivete", - "canoa", - "cansado", - "cantar", - "canudo", - "capacho", - "capela", - "capinar", - "capotar", - "capricho", - "captador", - "capuz", - "caracol", - "carbono", - "cardeal", - "careca", - "carimbar", - "carneiro", - "carpete", - "carreira", - "cartaz", - "carvalho", - "casaco", - "casca", - "casebre", - "castelo", - "casulo", - "catarata", - "cativar", - "caule", - "causador", - "cautelar", - "cavalo", - "caverna", - "cebola", - "cedilha", - "cegonha", - "celebrar", - "celular", - "cenoura", - "censo", - "centeio", - "cercar", - "cerrado", - "certeiro", - "cerveja", - "cetim", - "cevada", - "chacota", - "chaleira", - "chamado", - "chapada", - "charme", - "chatice", - "chave", - "chefe", - "chegada", - "cheiro", - "cheque", - "chicote", - "chifre", - "chinelo", - "chocalho", - "chover", - "chumbo", - "chutar", - "chuva", - "cicatriz", - "ciclone", - "cidade", - "cidreira", - "ciente", - "cigana", - "cimento", - "cinto", - "cinza", - "ciranda", - "circuito", - "cirurgia", - "citar", - "clareza", - "clero", - "clicar", - "clone", - "clube", - "coado", - "coagir", - "cobaia", - "cobertor", - "cobrar", - "cocada", - "coelho", - "coentro", - "coeso", - "cogumelo", - "coibir", - "coifa", - "coiote", - "colar", - "coleira", - "colher", - "colidir", - "colmeia", - "colono", - "coluna", - "comando", - "combinar", - "comentar", - "comitiva", - "comover", - "complexo", - "comum", - "concha", - "condor", - "conectar", - "confuso", - "congelar", - "conhecer", - "conjugar", - "consumir", - "contrato", - "convite", - "cooperar", - "copeiro", - "copiador", - "copo", - "coquetel", - "coragem", - "cordial", - "corneta", - "coronha", - "corporal", - "correio", - "cortejo", - "coruja", - "corvo", - "cosseno", - "costela", - "cotonete", - "couro", - "couve", - "covil", - "cozinha", - "cratera", - "cravo", - "creche", - "credor", - "creme", - "crer", - "crespo", - "criada", - "criminal", - "crioulo", - "crise", - "criticar", - "crosta", - "crua", - "cruzeiro", - "cubano", - "cueca", - "cuidado", - "cujo", - "culatra", - "culminar", - "culpar", - "cultura", - "cumprir", - "cunhado", - "cupido", - "curativo", - "curral", - "cursar", - "curto", - "cuspir", - "custear", - "cutelo", - "damasco", - "datar", - "debater", - "debitar", - "deboche", - "debulhar", - "decalque", - "decimal", - "declive", - "decote", - "decretar", - "dedal", - "dedicado", - "deduzir", - "defesa", - "defumar", - "degelo", - "degrau", - "degustar", - "deitado", - "deixar", - "delator", - "delegado", - "delinear", - "delonga", - "demanda", - "demitir", - "demolido", - "dentista", - "depenado", - "depilar", - "depois", - "depressa", - "depurar", - "deriva", - "derramar", - "desafio", - "desbotar", - "descanso", - "desenho", - "desfiado", - "desgaste", - "desigual", - "deslize", - "desmamar", - "desova", - "despesa", - "destaque", - "desviar", - "detalhar", - "detentor", - "detonar", - "detrito", - "deusa", - "dever", - "devido", - "devotado", - "dezena", - "diagrama", - "dialeto", - "didata", - "difuso", - "digitar", - "dilatado", - "diluente", - "diminuir", - "dinastia", - "dinheiro", - "diocese", - "direto", - "discreta", - "disfarce", - "disparo", - "disquete", - "dissipar", - "distante", - "ditador", - "diurno", - "diverso", - "divisor", - "divulgar", - "dizer", - "dobrador", - "dolorido", - "domador", - "dominado", - "donativo", - "donzela", - "dormente", - "dorsal", - "dosagem", - "dourado", - "doutor", - "drenagem", - "drible", - "drogaria", - "duelar", - "duende", - "dueto", - "duplo", - "duquesa", - "durante", - "duvidoso", - "eclodir", - "ecoar", - "ecologia", - "edificar", - "edital", - "educado", - "efeito", - "efetivar", - "ejetar", - "elaborar", - "eleger", - "eleitor", - "elenco", - "elevador", - "eliminar", - "elogiar", - "embargo", - "embolado", - "embrulho", - "embutido", - "emenda", - "emergir", - "emissor", - "empatia", - "empenho", - "empinado", - "empolgar", - "emprego", - "empurrar", - "emulador", - "encaixe", - "encenado", - "enchente", - "encontro", - "endeusar", - "endossar", - "enfaixar", - "enfeite", - "enfim", - "engajado", - "engenho", - "englobar", - "engomado", - "engraxar", - "enguia", - "enjoar", - "enlatar", - "enquanto", - "enraizar", - "enrolado", - "enrugar", - "ensaio", - "enseada", - "ensino", - "ensopado", - "entanto", - "enteado", - "entidade", - "entortar", - "entrada", - "entulho", - "envergar", - "enviado", - "envolver", - "enxame", - "enxerto", - "enxofre", - "enxuto", - "epiderme", - "equipar", - "ereto", - "erguido", - "errata", - "erva", - "ervilha", - "esbanjar", - "esbelto", - "escama", - "escola", - "escrita", - "escuta", - "esfinge", - "esfolar", - "esfregar", - "esfumado", - "esgrima", - "esmalte", - "espanto", - "espelho", - "espiga", - "esponja", - "espreita", - "espumar", - "esquerda", - "estaca", - "esteira", - "esticar", - "estofado", - "estrela", - "estudo", - "esvaziar", - "etanol", - "etiqueta", - "euforia", - "europeu", - "evacuar", - "evaporar", - "evasivo", - "eventual", - "evidente", - "evoluir", - "exagero", - "exalar", - "examinar", - "exato", - "exausto", - "excesso", - "excitar", - "exclamar", - "executar", - "exemplo", - "exibir", - "exigente", - "exonerar", - "expandir", - "expelir", - "expirar", - "explanar", - "exposto", - "expresso", - "expulsar", - "externo", - "extinto", - "extrato", - "fabricar", - "fabuloso", - "faceta", - "facial", - "fada", - "fadiga", - "faixa", - "falar", - "falta", - "familiar", - "fandango", - "fanfarra", - "fantoche", - "fardado", - "farelo", - "farinha", - "farofa", - "farpa", - "fartura", - "fatia", - "fator", - "favorita", - "faxina", - "fazenda", - "fechado", - "feijoada", - "feirante", - "felino", - "feminino", - "fenda", - "feno", - "fera", - "feriado", - "ferrugem", - "ferver", - "festejar", - "fetal", - "feudal", - "fiapo", - "fibrose", - "ficar", - "ficheiro", - "figurado", - "fileira", - "filho", - "filme", - "filtrar", - "firmeza", - "fisgada", - "fissura", - "fita", - "fivela", - "fixador", - "fixo", - "flacidez", - "flamingo", - "flanela", - "flechada", - "flora", - "flutuar", - "fluxo", - "focal", - "focinho", - "fofocar", - "fogo", - "foguete", - "foice", - "folgado", - "folheto", - "forjar", - "formiga", - "forno", - "forte", - "fosco", - "fossa", - "fragata", - "fralda", - "frango", - "frasco", - "fraterno", - "freira", - "frente", - "fretar", - "frieza", - "friso", - "fritura", - "fronha", - "frustrar", - "fruteira", - "fugir", - "fulano", - "fuligem", - "fundar", - "fungo", - "funil", - "furador", - "furioso", - "futebol", - "gabarito", - "gabinete", - "gado", - "gaiato", - "gaiola", - "gaivota", - "galega", - "galho", - "galinha", - "galocha", - "ganhar", - "garagem", - "garfo", - "gargalo", - "garimpo", - "garoupa", - "garrafa", - "gasoduto", - "gasto", - "gata", - "gatilho", - "gaveta", - "gazela", - "gelado", - "geleia", - "gelo", - "gemada", - "gemer", - "gemido", - "generoso", - "gengiva", - "genial", - "genoma", - "genro", - "geologia", - "gerador", - "germinar", - "gesso", - "gestor", - "ginasta", - "gincana", - "gingado", - "girafa", - "girino", - "glacial", - "glicose", - "global", - "glorioso", - "goela", - "goiaba", - "golfe", - "golpear", - "gordura", - "gorjeta", - "gorro", - "gostoso", - "goteira", - "governar", - "gracejo", - "gradual", - "grafite", - "gralha", - "grampo", - "granada", - "gratuito", - "graveto", - "graxa", - "grego", - "grelhar", - "greve", - "grilo", - "grisalho", - "gritaria", - "grosso", - "grotesco", - "grudado", - "grunhido", - "gruta", - "guache", - "guarani", - "guaxinim", - "guerrear", - "guiar", - "guincho", - "guisado", - "gula", - "guloso", - "guru", - "habitar", - "harmonia", - "haste", - "haver", - "hectare", - "herdar", - "heresia", - "hesitar", - "hiato", - "hibernar", - "hidratar", - "hiena", - "hino", - "hipismo", - "hipnose", - "hipoteca", - "hoje", - "holofote", - "homem", - "honesto", - "honrado", - "hormonal", - "hospedar", - "humorado", - "iate", - "ideia", - "idoso", - "ignorado", - "igreja", - "iguana", - "ileso", - "ilha", - "iludido", - "iluminar", - "ilustrar", - "imagem", - "imediato", - "imenso", - "imersivo", - "iminente", - "imitador", - "imortal", - "impacto", - "impedir", - "implante", - "impor", - "imprensa", - "impune", - "imunizar", - "inalador", - "inapto", - "inativo", - "incenso", - "inchar", - "incidir", - "incluir", - "incolor", - "indeciso", - "indireto", - "indutor", - "ineficaz", - "inerente", - "infantil", - "infestar", - "infinito", - "inflamar", - "informal", - "infrator", - "ingerir", - "inibido", - "inicial", - "inimigo", - "injetar", - "inocente", - "inodoro", - "inovador", - "inox", - "inquieto", - "inscrito", - "inseto", - "insistir", - "inspetor", - "instalar", - "insulto", - "intacto", - "integral", - "intimar", - "intocado", - "intriga", - "invasor", - "inverno", - "invicto", - "invocar", - "iogurte", - "iraniano", - "ironizar", - "irreal", - "irritado", - "isca", - "isento", - "isolado", - "isqueiro", - "italiano", - "janeiro", - "jangada", - "janta", - "jararaca", - "jardim", - "jarro", - "jasmim", - "jato", - "javali", - "jazida", - "jejum", - "joaninha", - "joelhada", - "jogador", - "joia", - "jornal", - "jorrar", - "jovem", - "juba", - "judeu", - "judoca", - "juiz", - "julgador", - "julho", - "jurado", - "jurista", - "juro", - "justa", - "labareda", - "laboral", - "lacre", - "lactante", - "ladrilho", - "lagarta", - "lagoa", - "laje", - "lamber", - "lamentar", - "laminar", - "lampejo", - "lanche", - "lapidar", - "lapso", - "laranja", - "lareira", - "largura", - "lasanha", - "lastro", - "lateral", - "latido", - "lavanda", - "lavoura", - "lavrador", - "laxante", - "lazer", - "lealdade", - "lebre", - "legado", - "legendar", - "legista", - "leigo", - "leiloar", - "leitura", - "lembrete", - "leme", - "lenhador", - "lentilha", - "leoa", - "lesma", - "leste", - "letivo", - "letreiro", - "levar", - "leveza", - "levitar", - "liberal", - "libido", - "liderar", - "ligar", - "ligeiro", - "limitar", - "limoeiro", - "limpador", - "linda", - "linear", - "linhagem", - "liquidez", - "listagem", - "lisura", - "litoral", - "livro", - "lixa", - "lixeira", - "locador", - "locutor", - "lojista", - "lombo", - "lona", - "longe", - "lontra", - "lorde", - "lotado", - "loteria", - "loucura", - "lousa", - "louvar", - "luar", - "lucidez", - "lucro", - "luneta", - "lustre", - "lutador", - "luva", - "macaco", - "macete", - "machado", - "macio", - "madeira", - "madrinha", - "magnata", - "magreza", - "maior", - "mais", - "malandro", - "malha", - "malote", - "maluco", - "mamilo", - "mamoeiro", - "mamute", - "manada", - "mancha", - "mandato", - "manequim", - "manhoso", - "manivela", - "manobrar", - "mansa", - "manter", - "manusear", - "mapeado", - "maquinar", - "marcador", - "maresia", - "marfim", - "margem", - "marinho", - "marmita", - "maroto", - "marquise", - "marreco", - "martelo", - "marujo", - "mascote", - "masmorra", - "massagem", - "mastigar", - "matagal", - "materno", - "matinal", - "matutar", - "maxilar", - "medalha", - "medida", - "medusa", - "megafone", - "meiga", - "melancia", - "melhor", - "membro", - "memorial", - "menino", - "menos", - "mensagem", - "mental", - "merecer", - "mergulho", - "mesada", - "mesclar", - "mesmo", - "mesquita", - "mestre", - "metade", - "meteoro", - "metragem", - "mexer", - "mexicano", - "micro", - "migalha", - "migrar", - "milagre", - "milenar", - "milhar", - "mimado", - "minerar", - "minhoca", - "ministro", - "minoria", - "miolo", - "mirante", - "mirtilo", - "misturar", - "mocidade", - "moderno", - "modular", - "moeda", - "moer", - "moinho", - "moita", - "moldura", - "moleza", - "molho", - "molinete", - "molusco", - "montanha", - "moqueca", - "morango", - "morcego", - "mordomo", - "morena", - "mosaico", - "mosquete", - "mostarda", - "motel", - "motim", - "moto", - "motriz", - "muda", - "muito", - "mulata", - "mulher", - "multar", - "mundial", - "munido", - "muralha", - "murcho", - "muscular", - "museu", - "musical", - "nacional", - "nadador", - "naja", - "namoro", - "narina", - "narrado", - "nascer", - "nativa", - "natureza", - "navalha", - "navegar", - "navio", - "neblina", - "nebuloso", - "negativa", - "negociar", - "negrito", - "nervoso", - "neta", - "neural", - "nevasca", - "nevoeiro", - "ninar", - "ninho", - "nitidez", - "nivelar", - "nobreza", - "noite", - "noiva", - "nomear", - "nominal", - "nordeste", - "nortear", - "notar", - "noticiar", - "noturno", - "novelo", - "novilho", - "novo", - "nublado", - "nudez", - "numeral", - "nupcial", - "nutrir", - "nuvem", - "obcecado", - "obedecer", - "objetivo", - "obrigado", - "obscuro", - "obstetra", - "obter", - "obturar", - "ocidente", - "ocioso", - "ocorrer", - "oculista", - "ocupado", - "ofegante", - "ofensiva", - "oferenda", - "oficina", - "ofuscado", - "ogiva", - "olaria", - "oleoso", - "olhar", - "oliveira", - "ombro", - "omelete", - "omisso", - "omitir", - "ondulado", - "oneroso", - "ontem", - "opcional", - "operador", - "oponente", - "oportuno", - "oposto", - "orar", - "orbitar", - "ordem", - "ordinal", - "orfanato", - "orgasmo", - "orgulho", - "oriental", - "origem", - "oriundo", - "orla", - "ortodoxo", - "orvalho", - "oscilar", - "ossada", - "osso", - "ostentar", - "otimismo", - "ousadia", - "outono", - "outubro", - "ouvido", - "ovelha", - "ovular", - "oxidar", - "oxigenar", - "pacato", - "paciente", - "pacote", - "pactuar", - "padaria", - "padrinho", - "pagar", - "pagode", - "painel", - "pairar", - "paisagem", - "palavra", - "palestra", - "palheta", - "palito", - "palmada", - "palpitar", - "pancada", - "panela", - "panfleto", - "panqueca", - "pantanal", - "papagaio", - "papelada", - "papiro", - "parafina", - "parcial", - "pardal", - "parede", - "partida", - "pasmo", - "passado", - "pastel", - "patamar", - "patente", - "patinar", - "patrono", - "paulada", - "pausar", - "peculiar", - "pedalar", - "pedestre", - "pediatra", - "pedra", - "pegada", - "peitoral", - "peixe", - "pele", - "pelicano", - "penca", - "pendurar", - "peneira", - "penhasco", - "pensador", - "pente", - "perceber", - "perfeito", - "pergunta", - "perito", - "permitir", - "perna", - "perplexo", - "persiana", - "pertence", - "peruca", - "pescado", - "pesquisa", - "pessoa", - "petiscar", - "piada", - "picado", - "piedade", - "pigmento", - "pilastra", - "pilhado", - "pilotar", - "pimenta", - "pincel", - "pinguim", - "pinha", - "pinote", - "pintar", - "pioneiro", - "pipoca", - "piquete", - "piranha", - "pires", - "pirueta", - "piscar", - "pistola", - "pitanga", - "pivete", - "planta", - "plaqueta", - "platina", - "plebeu", - "plumagem", - "pluvial", - "pneu", - "poda", - "poeira", - "poetisa", - "polegada", - "policiar", - "poluente", - "polvilho", - "pomar", - "pomba", - "ponderar", - "pontaria", - "populoso", - "porta", - "possuir", - "postal", - "pote", - "poupar", - "pouso", - "povoar", - "praia", - "prancha", - "prato", - "praxe", - "prece", - "predador", - "prefeito", - "premiar", - "prensar", - "preparar", - "presilha", - "pretexto", - "prevenir", - "prezar", - "primata", - "princesa", - "prisma", - "privado", - "processo", - "produto", - "profeta", - "proibido", - "projeto", - "prometer", - "propagar", - "prosa", - "protetor", - "provador", - "publicar", - "pudim", - "pular", - "pulmonar", - "pulseira", - "punhal", - "punir", - "pupilo", - "pureza", - "puxador", - "quadra", - "quantia", - "quarto", - "quase", - "quebrar", - "queda", - "queijo", - "quente", - "querido", - "quimono", - "quina", - "quiosque", - "rabanada", - "rabisco", - "rachar", - "racionar", - "radial", - "raiar", - "rainha", - "raio", - "raiva", - "rajada", - "ralado", - "ramal", - "ranger", - "ranhura", - "rapadura", - "rapel", - "rapidez", - "raposa", - "raquete", - "raridade", - "rasante", - "rascunho", - "rasgar", - "raspador", - "rasteira", - "rasurar", - "ratazana", - "ratoeira", - "realeza", - "reanimar", - "reaver", - "rebaixar", - "rebelde", - "rebolar", - "recado", - "recente", - "recheio", - "recibo", - "recordar", - "recrutar", - "recuar", - "rede", - "redimir", - "redonda", - "reduzida", - "reenvio", - "refinar", - "refletir", - "refogar", - "refresco", - "refugiar", - "regalia", - "regime", - "regra", - "reinado", - "reitor", - "rejeitar", - "relativo", - "remador", - "remendo", - "remorso", - "renovado", - "reparo", - "repelir", - "repleto", - "repolho", - "represa", - "repudiar", - "requerer", - "resenha", - "resfriar", - "resgatar", - "residir", - "resolver", - "respeito", - "ressaca", - "restante", - "resumir", - "retalho", - "reter", - "retirar", - "retomada", - "retratar", - "revelar", - "revisor", - "revolta", - "riacho", - "rica", - "rigidez", - "rigoroso", - "rimar", - "ringue", - "risada", - "risco", - "risonho", - "robalo", - "rochedo", - "rodada", - "rodeio", - "rodovia", - "roedor", - "roleta", - "romano", - "roncar", - "rosado", - "roseira", - "rosto", - "rota", - "roteiro", - "rotina", - "rotular", - "rouco", - "roupa", - "roxo", - "rubro", - "rugido", - "rugoso", - "ruivo", - "rumo", - "rupestre", - "russo", - "sabor", - "saciar", - "sacola", - "sacudir", - "sadio", - "safira", - "saga", - "sagrada", - "saibro", - "salada", - "saleiro", - "salgado", - "saliva", - "salpicar", - "salsicha", - "saltar", - "salvador", - "sambar", - "samurai", - "sanar", - "sanfona", - "sangue", - "sanidade", - "sapato", - "sarda", - "sargento", - "sarjeta", - "saturar", - "saudade", - "saxofone", - "sazonal", - "secar", - "secular", - "seda", - "sedento", - "sediado", - "sedoso", - "sedutor", - "segmento", - "segredo", - "segundo", - "seiva", - "seleto", - "selvagem", - "semanal", - "semente", - "senador", - "senhor", - "sensual", - "sentado", - "separado", - "sereia", - "seringa", - "serra", - "servo", - "setembro", - "setor", - "sigilo", - "silhueta", - "silicone", - "simetria", - "simpatia", - "simular", - "sinal", - "sincero", - "singular", - "sinopse", - "sintonia", - "sirene", - "siri", - "situado", - "soberano", - "sobra", - "socorro", - "sogro", - "soja", - "solda", - "soletrar", - "solteiro", - "sombrio", - "sonata", - "sondar", - "sonegar", - "sonhador", - "sono", - "soprano", - "soquete", - "sorrir", - "sorteio", - "sossego", - "sotaque", - "soterrar", - "sovado", - "sozinho", - "suavizar", - "subida", - "submerso", - "subsolo", - "subtrair", - "sucata", - "sucesso", - "suco", - "sudeste", - "sufixo", - "sugador", - "sugerir", - "sujeito", - "sulfato", - "sumir", - "suor", - "superior", - "suplicar", - "suposto", - "suprimir", - "surdina", - "surfista", - "surpresa", - "surreal", - "surtir", - "suspiro", - "sustento", - "tabela", - "tablete", - "tabuada", - "tacho", - "tagarela", - "talher", - "talo", - "talvez", - "tamanho", - "tamborim", - "tampa", - "tangente", - "tanto", - "tapar", - "tapioca", - "tardio", - "tarefa", - "tarja", - "tarraxa", - "tatuagem", - "taurino", - "taxativo", - "taxista", - "teatral", - "tecer", - "tecido", - "teclado", - "tedioso", - "teia", - "teimar", - "telefone", - "telhado", - "tempero", - "tenente", - "tensor", - "tentar", - "termal", - "terno", - "terreno", - "tese", - "tesoura", - "testado", - "teto", - "textura", - "texugo", - "tiara", - "tigela", - "tijolo", - "timbrar", - "timidez", - "tingido", - "tinteiro", - "tiragem", - "titular", - "toalha", - "tocha", - "tolerar", - "tolice", - "tomada", - "tomilho", - "tonel", - "tontura", - "topete", - "tora", - "torcido", - "torneio", - "torque", - "torrada", - "torto", - "tostar", - "touca", - "toupeira", - "toxina", - "trabalho", - "tracejar", - "tradutor", - "trafegar", - "trajeto", - "trama", - "trancar", - "trapo", - "traseiro", - "tratador", - "travar", - "treino", - "tremer", - "trepidar", - "trevo", - "triagem", - "tribo", - "triciclo", - "tridente", - "trilogia", - "trindade", - "triplo", - "triturar", - "triunfal", - "trocar", - "trombeta", - "trova", - "trunfo", - "truque", - "tubular", - "tucano", - "tudo", - "tulipa", - "tupi", - "turbo", - "turma", - "turquesa", - "tutelar", - "tutorial", - "uivar", - "umbigo", - "unha", - "unidade", - "uniforme", - "urologia", - "urso", - "urtiga", - "urubu", - "usado", - "usina", - "usufruir", - "vacina", - "vadiar", - "vagaroso", - "vaidoso", - "vala", - "valente", - "validade", - "valores", - "vantagem", - "vaqueiro", - "varanda", - "vareta", - "varrer", - "vascular", - "vasilha", - "vassoura", - "vazar", - "vazio", - "veado", - "vedar", - "vegetar", - "veicular", - "veleiro", - "velhice", - "veludo", - "vencedor", - "vendaval", - "venerar", - "ventre", - "verbal", - "verdade", - "vereador", - "vergonha", - "vermelho", - "verniz", - "versar", - "vertente", - "vespa", - "vestido", - "vetorial", - "viaduto", - "viagem", - "viajar", - "viatura", - "vibrador", - "videira", - "vidraria", - "viela", - "viga", - "vigente", - "vigiar", - "vigorar", - "vilarejo", - "vinco", - "vinheta", - "vinil", - "violeta", - "virada", - "virtude", - "visitar", - "visto", - "vitral", - "viveiro", - "vizinho", - "voador", - "voar", - "vogal", - "volante", - "voleibol", - "voltagem", - "volumoso", - "vontade", - "vulto", - "vuvuzela", - "xadrez", - "xarope", - "xeque", - "xeretar", - "xerife", - "xingar", - "zangado", - "zarpar", - "zebu", - "zelador", - "zombar", - "zoologia", - "zumbido" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/zh_simplified.rs b/networks/monero/wallet/polyseed/src/words/zh_simplified.rs deleted file mode 100644 index 50d2b586c..000000000 --- a/networks/monero/wallet/polyseed/src/words/zh_simplified.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "的", - "一", - "是", - "在", - "不", - "了", - "有", - "和", - "人", - "这", - "中", - "大", - "为", - "上", - "个", - "国", - "我", - "以", - "要", - "他", - "时", - "来", - "用", - "们", - "生", - "到", - "作", - "地", - "于", - "出", - "就", - "分", - "对", - "成", - "会", - "可", - "主", - "发", - "年", - "动", - "同", - "工", - "也", - "能", - "下", - "过", - "子", - "说", - "产", - "种", - "面", - "而", - "方", - "后", - "多", - "定", - "行", - "学", - "法", - "所", - "民", - "得", - "经", - "十", - "三", - "之", - "进", - "着", - "等", - "部", - "度", - "家", - "电", - "力", - "里", - "如", - "水", - "化", - "高", - "自", - "二", - "理", - "起", - "小", - "物", - "现", - "实", - "加", - "量", - "都", - "两", - "体", - "制", - "机", - "当", - "使", - "点", - "从", - "业", - "本", - "去", - "把", - "性", - "好", - "应", - "开", - "它", - "合", - "还", - "因", - "由", - "其", - "些", - "然", - "前", - "外", - "天", - "政", - "四", - "日", - "那", - "社", - "义", - "事", - "平", - "形", - "相", - "全", - "表", - "间", - "样", - "与", - "关", - "各", - "重", - "新", - "线", - "内", - "数", - "正", - "心", - "反", - "你", - "明", - "看", - "原", - "又", - "么", - "利", - "比", - "或", - "但", - "质", - "气", - "第", - "向", - "道", - "命", - "此", - "变", - "条", - "只", - "没", - "结", - "解", - "问", - "意", - "建", - "月", - "公", - "无", - "系", - "军", - "很", - "情", - "者", - "最", - "立", - "代", - "想", - "已", - "通", - "并", - "提", - "直", - "题", - "党", - "程", - "展", - "五", - "果", - "料", - "象", - "员", - "革", - "位", - "入", - "常", - "文", - "总", - "次", - "品", - "式", - "活", - "设", - "及", - "管", - "特", - "件", - "长", - "求", - "老", - "头", - "基", - "资", - "边", - "流", - "路", - "级", - "少", - "图", - "山", - "统", - "接", - "知", - "较", - "将", - "组", - "见", - "计", - "别", - "她", - "手", - "角", - "期", - "根", - "论", - "运", - "农", - "指", - "几", - "九", - "区", - "强", - "放", - "决", - "西", - "被", - "干", - "做", - "必", - "战", - "先", - "回", - "则", - "任", - "取", - "据", - "处", - "队", - "南", - "给", - "色", - "光", - "门", - "即", - "保", - "治", - "北", - "造", - "百", - "规", - "热", - "领", - "七", - "海", - "口", - "东", - "导", - "器", - "压", - "志", - "世", - "金", - "增", - "争", - "济", - "阶", - "油", - "思", - "术", - "极", - "交", - "受", - "联", - "什", - "认", - "六", - "共", - "权", - "收", - "证", - "改", - "清", - "美", - "再", - "采", - "转", - "更", - "单", - "风", - "切", - "打", - "白", - "教", - "速", - "花", - "带", - "安", - "场", - "身", - "车", - "例", - "真", - "务", - "具", - "万", - "每", - "目", - "至", - "达", - "走", - "积", - "示", - "议", - "声", - "报", - "斗", - "完", - "类", - "八", - "离", - "华", - "名", - "确", - "才", - "科", - "张", - "信", - "马", - "节", - "话", - "米", - "整", - "空", - "元", - "况", - "今", - "集", - "温", - "传", - "土", - "许", - "步", - "群", - "广", - "石", - "记", - "需", - "段", - "研", - "界", - "拉", - "林", - "律", - "叫", - "且", - "究", - "观", - "越", - "织", - "装", - "影", - "算", - "低", - "持", - "音", - "众", - "书", - "布", - "复", - "容", - "儿", - "须", - "际", - "商", - "非", - "验", - "连", - "断", - "深", - "难", - "近", - "矿", - "千", - "周", - "委", - "素", - "技", - "备", - "半", - "办", - "青", - "省", - "列", - "习", - "响", - "约", - "支", - "般", - "史", - "感", - "劳", - "便", - "团", - "往", - "酸", - "历", - "市", - "克", - "何", - "除", - "消", - "构", - "府", - "称", - "太", - "准", - "精", - "值", - "号", - "率", - "族", - "维", - "划", - "选", - "标", - "写", - "存", - "候", - "毛", - "亲", - "快", - "效", - "斯", - "院", - "查", - "江", - "型", - "眼", - "王", - "按", - "格", - "养", - "易", - "置", - "派", - "层", - "片", - "始", - "却", - "专", - "状", - "育", - "厂", - "京", - "识", - "适", - "属", - "圆", - "包", - "火", - "住", - "调", - "满", - "县", - "局", - "照", - "参", - "红", - "细", - "引", - "听", - "该", - "铁", - "价", - "严", - "首", - "底", - "液", - "官", - "德", - "随", - "病", - "苏", - "失", - "尔", - "死", - "讲", - "配", - "女", - "黄", - "推", - "显", - "谈", - "罪", - "神", - "艺", - "呢", - "席", - "含", - "企", - "望", - "密", - "批", - "营", - "项", - "防", - "举", - "球", - "英", - "氧", - "势", - "告", - "李", - "台", - "落", - "木", - "帮", - "轮", - "破", - "亚", - "师", - "围", - "注", - "远", - "字", - "材", - "排", - "供", - "河", - "态", - "封", - "另", - "施", - "减", - "树", - "溶", - "怎", - "止", - "案", - "言", - "士", - "均", - "武", - "固", - "叶", - "鱼", - "波", - "视", - "仅", - "费", - "紧", - "爱", - "左", - "章", - "早", - "朝", - "害", - "续", - "轻", - "服", - "试", - "食", - "充", - "兵", - "源", - "判", - "护", - "司", - "足", - "某", - "练", - "差", - "致", - "板", - "田", - "降", - "黑", - "犯", - "负", - "击", - "范", - "继", - "兴", - "似", - "余", - "坚", - "曲", - "输", - "修", - "故", - "城", - "夫", - "够", - "送", - "笔", - "船", - "占", - "右", - "财", - "吃", - "富", - "春", - "职", - "觉", - "汉", - "画", - "功", - "巴", - "跟", - "虽", - "杂", - "飞", - "检", - "吸", - "助", - "升", - "阳", - "互", - "初", - "创", - "抗", - "考", - "投", - "坏", - "策", - "古", - "径", - "换", - "未", - "跑", - "留", - "钢", - "曾", - "端", - "责", - "站", - "简", - "述", - "钱", - "副", - "尽", - "帝", - "射", - "草", - "冲", - "承", - "独", - "令", - "限", - "阿", - "宣", - "环", - "双", - "请", - "超", - "微", - "让", - "控", - "州", - "良", - "轴", - "找", - "否", - "纪", - "益", - "依", - "优", - "顶", - "础", - "载", - "倒", - "房", - "突", - "坐", - "粉", - "敌", - "略", - "客", - "袁", - "冷", - "胜", - "绝", - "析", - "块", - "剂", - "测", - "丝", - "协", - "诉", - "念", - "陈", - "仍", - "罗", - "盐", - "友", - "洋", - "错", - "苦", - "夜", - "刑", - "移", - "频", - "逐", - "靠", - "混", - "母", - "短", - "皮", - "终", - "聚", - "汽", - "村", - "云", - "哪", - "既", - "距", - "卫", - "停", - "烈", - "央", - "察", - "烧", - "迅", - "境", - "若", - "印", - "洲", - "刻", - "括", - "激", - "孔", - "搞", - "甚", - "室", - "待", - "核", - "校", - "散", - "侵", - "吧", - "甲", - "游", - "久", - "菜", - "味", - "旧", - "模", - "湖", - "货", - "损", - "预", - "阻", - "毫", - "普", - "稳", - "乙", - "妈", - "植", - "息", - "扩", - "银", - "语", - "挥", - "酒", - "守", - "拿", - "序", - "纸", - "医", - "缺", - "雨", - "吗", - "针", - "刘", - "啊", - "急", - "唱", - "误", - "训", - "愿", - "审", - "附", - "获", - "茶", - "鲜", - "粮", - "斤", - "孩", - "脱", - "硫", - "肥", - "善", - "龙", - "演", - "父", - "渐", - "血", - "欢", - "械", - "掌", - "歌", - "沙", - "刚", - "攻", - "谓", - "盾", - "讨", - "晚", - "粒", - "乱", - "燃", - "矛", - "乎", - "杀", - "药", - "宁", - "鲁", - "贵", - "钟", - "煤", - "读", - "班", - "伯", - "香", - "介", - "迫", - "句", - "丰", - "培", - "握", - "兰", - "担", - "弦", - "蛋", - "沉", - "假", - "穿", - "执", - "答", - "乐", - "谁", - "顺", - "烟", - "缩", - "征", - "脸", - "喜", - "松", - "脚", - "困", - "异", - "免", - "背", - "星", - "福", - "买", - "染", - "井", - "概", - "慢", - "怕", - "磁", - "倍", - "祖", - "皇", - "促", - "静", - "补", - "评", - "翻", - "肉", - "践", - "尼", - "衣", - "宽", - "扬", - "棉", - "希", - "伤", - "操", - "垂", - "秋", - "宜", - "氢", - "套", - "督", - "振", - "架", - "亮", - "末", - "宪", - "庆", - "编", - "牛", - "触", - "映", - "雷", - "销", - "诗", - "座", - "居", - "抓", - "裂", - "胞", - "呼", - "娘", - "景", - "威", - "绿", - "晶", - "厚", - "盟", - "衡", - "鸡", - "孙", - "延", - "危", - "胶", - "屋", - "乡", - "临", - "陆", - "顾", - "掉", - "呀", - "灯", - "岁", - "措", - "束", - "耐", - "剧", - "玉", - "赵", - "跳", - "哥", - "季", - "课", - "凯", - "胡", - "额", - "款", - "绍", - "卷", - "齐", - "伟", - "蒸", - "殖", - "永", - "宗", - "苗", - "川", - "炉", - "岩", - "弱", - "零", - "杨", - "奏", - "沿", - "露", - "杆", - "探", - "滑", - "镇", - "饭", - "浓", - "航", - "怀", - "赶", - "库", - "夺", - "伊", - "灵", - "税", - "途", - "灭", - "赛", - "归", - "召", - "鼓", - "播", - "盘", - "裁", - "险", - "康", - "唯", - "录", - "菌", - "纯", - "借", - "糖", - "盖", - "横", - "符", - "私", - "努", - "堂", - "域", - "枪", - "润", - "幅", - "哈", - "竟", - "熟", - "虫", - "泽", - "脑", - "壤", - "碳", - "欧", - "遍", - "侧", - "寨", - "敢", - "彻", - "虑", - "斜", - "薄", - "庭", - "纳", - "弹", - "饲", - "伸", - "折", - "麦", - "湿", - "暗", - "荷", - "瓦", - "塞", - "床", - "筑", - "恶", - "户", - "访", - "塔", - "奇", - "透", - "梁", - "刀", - "旋", - "迹", - "卡", - "氯", - "遇", - "份", - "毒", - "泥", - "退", - "洗", - "摆", - "灰", - "彩", - "卖", - "耗", - "夏", - "择", - "忙", - "铜", - "献", - "硬", - "予", - "繁", - "圈", - "雪", - "函", - "亦", - "抽", - "篇", - "阵", - "阴", - "丁", - "尺", - "追", - "堆", - "雄", - "迎", - "泛", - "爸", - "楼", - "避", - "谋", - "吨", - "野", - "猪", - "旗", - "累", - "偏", - "典", - "馆", - "索", - "秦", - "脂", - "潮", - "爷", - "豆", - "忽", - "托", - "惊", - "塑", - "遗", - "愈", - "朱", - "替", - "纤", - "粗", - "倾", - "尚", - "痛", - "楚", - "谢", - "奋", - "购", - "磨", - "君", - "池", - "旁", - "碎", - "骨", - "监", - "捕", - "弟", - "暴", - "割", - "贯", - "殊", - "释", - "词", - "亡", - "壁", - "顿", - "宝", - "午", - "尘", - "闻", - "揭", - "炮", - "残", - "冬", - "桥", - "妇", - "警", - "综", - "招", - "吴", - "付", - "浮", - "遭", - "徐", - "您", - "摇", - "谷", - "赞", - "箱", - "隔", - "订", - "男", - "吹", - "园", - "纷", - "唐", - "败", - "宋", - "玻", - "巨", - "耕", - "坦", - "荣", - "闭", - "湾", - "键", - "凡", - "驻", - "锅", - "救", - "恩", - "剥", - "凝", - "碱", - "齿", - "截", - "炼", - "麻", - "纺", - "禁", - "废", - "盛", - "版", - "缓", - "净", - "睛", - "昌", - "婚", - "涉", - "筒", - "嘴", - "插", - "岸", - "朗", - "庄", - "街", - "藏", - "姑", - "贸", - "腐", - "奴", - "啦", - "惯", - "乘", - "伙", - "恢", - "匀", - "纱", - "扎", - "辩", - "耳", - "彪", - "臣", - "亿", - "璃", - "抵", - "脉", - "秀", - "萨", - "俄", - "网", - "舞", - "店", - "喷", - "纵", - "寸", - "汗", - "挂", - "洪", - "贺", - "闪", - "柬", - "爆", - "烯", - "津", - "稻", - "墙", - "软", - "勇", - "像", - "滚", - "厘", - "蒙", - "芳", - "肯", - "坡", - "柱", - "荡", - "腿", - "仪", - "旅", - "尾", - "轧", - "冰", - "贡", - "登", - "黎", - "削", - "钻", - "勒", - "逃", - "障", - "氨", - "郭", - "峰", - "币", - "港", - "伏", - "轨", - "亩", - "毕", - "擦", - "莫", - "刺", - "浪", - "秘", - "援", - "株", - "健", - "售", - "股", - "岛", - "甘", - "泡", - "睡", - "童", - "铸", - "汤", - "阀", - "休", - "汇", - "舍", - "牧", - "绕", - "炸", - "哲", - "磷", - "绩", - "朋", - "淡", - "尖", - "启", - "陷", - "柴", - "呈", - "徒", - "颜", - "泪", - "稍", - "忘", - "泵", - "蓝", - "拖", - "洞", - "授", - "镜", - "辛", - "壮", - "锋", - "贫", - "虚", - "弯", - "摩", - "泰", - "幼", - "廷", - "尊", - "窗", - "纲", - "弄", - "隶", - "疑", - "氏", - "宫", - "姐", - "震", - "瑞", - "怪", - "尤", - "琴", - "循", - "描", - "膜", - "违", - "夹", - "腰", - "缘", - "珠", - "穷", - "森", - "枝", - "竹", - "沟", - "催", - "绳", - "忆", - "邦", - "剩", - "幸", - "浆", - "栏", - "拥", - "牙", - "贮", - "礼", - "滤", - "钠", - "纹", - "罢", - "拍", - "咱", - "喊", - "袖", - "埃", - "勤", - "罚", - "焦", - "潜", - "伍", - "墨", - "欲", - "缝", - "姓", - "刊", - "饱", - "仿", - "奖", - "铝", - "鬼", - "丽", - "跨", - "默", - "挖", - "链", - "扫", - "喝", - "袋", - "炭", - "污", - "幕", - "诸", - "弧", - "励", - "梅", - "奶", - "洁", - "灾", - "舟", - "鉴", - "苯", - "讼", - "抱", - "毁", - "懂", - "寒", - "智", - "埔", - "寄", - "届", - "跃", - "渡", - "挑", - "丹", - "艰", - "贝", - "碰", - "拔", - "爹", - "戴", - "码", - "梦", - "芽", - "熔", - "赤", - "渔", - "哭", - "敬", - "颗", - "奔", - "铅", - "仲", - "虎", - "稀", - "妹", - "乏", - "珍", - "申", - "桌", - "遵", - "允", - "隆", - "螺", - "仓", - "魏", - "锐", - "晓", - "氮", - "兼", - "隐", - "碍", - "赫", - "拨", - "忠", - "肃", - "缸", - "牵", - "抢", - "博", - "巧", - "壳", - "兄", - "杜", - "讯", - "诚", - "碧", - "祥", - "柯", - "页", - "巡", - "矩", - "悲", - "灌", - "龄", - "伦", - "票", - "寻", - "桂", - "铺", - "圣", - "恐", - "恰", - "郑", - "趣", - "抬", - "荒", - "腾", - "贴", - "柔", - "滴", - "猛", - "阔", - "辆", - "妻", - "填", - "撤", - "储", - "签", - "闹", - "扰", - "紫", - "砂", - "递", - "戏", - "吊", - "陶", - "伐", - "喂", - "疗", - "瓶", - "婆", - "抚", - "臂", - "摸", - "忍", - "虾", - "蜡", - "邻", - "胸", - "巩", - "挤", - "偶", - "弃", - "槽", - "劲", - "乳", - "邓", - "吉", - "仁", - "烂", - "砖", - "租", - "乌", - "舰", - "伴", - "瓜", - "浅", - "丙", - "暂", - "燥", - "橡", - "柳", - "迷", - "暖", - "牌", - "秧", - "胆", - "详", - "簧", - "踏", - "瓷", - "谱", - "呆", - "宾", - "糊", - "洛", - "辉", - "愤", - "竞", - "隙", - "怒", - "粘", - "乃", - "绪", - "肩", - "籍", - "敏", - "涂", - "熙", - "皆", - "侦", - "悬", - "掘", - "享", - "纠", - "醒", - "狂", - "锁", - "淀", - "恨", - "牲", - "霸", - "爬", - "赏", - "逆", - "玩", - "陵", - "祝", - "秒", - "浙", - "貌", - "役", - "彼", - "悉", - "鸭", - "趋", - "凤", - "晨", - "畜", - "辈", - "秩", - "卵", - "署", - "梯", - "炎", - "滩", - "棋", - "驱", - "筛", - "峡", - "冒", - "啥", - "寿", - "译", - "浸", - "泉", - "帽", - "迟", - "硅", - "疆", - "贷", - "漏", - "稿", - "冠", - "嫩", - "胁", - "芯", - "牢", - "叛", - "蚀", - "奥", - "鸣", - "岭", - "羊", - "凭", - "串", - "塘", - "绘", - "酵", - "融", - "盆", - "锡", - "庙", - "筹", - "冻", - "辅", - "摄", - "袭", - "筋", - "拒", - "僚", - "旱", - "钾", - "鸟", - "漆", - "沈", - "眉", - "疏", - "添", - "棒", - "穗", - "硝", - "韩", - "逼", - "扭", - "侨", - "凉", - "挺", - "碗", - "栽", - "炒", - "杯", - "患", - "馏", - "劝", - "豪", - "辽", - "勃", - "鸿", - "旦", - "吏", - "拜", - "狗", - "埋", - "辊", - "掩", - "饮", - "搬", - "骂", - "辞", - "勾", - "扣", - "估", - "蒋", - "绒", - "雾", - "丈", - "朵", - "姆", - "拟", - "宇", - "辑", - "陕", - "雕", - "偿", - "蓄", - "崇", - "剪", - "倡", - "厅", - "咬", - "驶", - "薯", - "刷", - "斥", - "番", - "赋", - "奉", - "佛", - "浇", - "漫", - "曼", - "扇", - "钙", - "桃", - "扶", - "仔", - "返", - "俗", - "亏", - "腔", - "鞋", - "棱", - "覆", - "框", - "悄", - "叔", - "撞", - "骗", - "勘", - "旺", - "沸", - "孤", - "吐", - "孟", - "渠", - "屈", - "疾", - "妙", - "惜", - "仰", - "狠", - "胀", - "谐", - "抛", - "霉", - "桑", - "岗", - "嘛", - "衰", - "盗", - "渗", - "脏", - "赖", - "涌", - "甜", - "曹", - "阅", - "肌", - "哩", - "厉", - "烃", - "纬", - "毅", - "昨", - "伪", - "症", - "煮", - "叹", - "钉", - "搭", - "茎", - "笼", - "酷", - "偷", - "弓", - "锥", - "恒", - "杰", - "坑", - "鼻", - "翼", - "纶", - "叙", - "狱", - "逮", - "罐", - "络", - "棚", - "抑", - "膨", - "蔬", - "寺", - "骤", - "穆", - "冶", - "枯", - "册", - "尸", - "凸", - "绅", - "坯", - "牺", - "焰", - "轰", - "欣", - "晋", - "瘦", - "御", - "锭", - "锦", - "丧", - "旬", - "锻", - "垄", - "搜", - "扑", - "邀", - "亭", - "酯", - "迈", - "舒", - "脆", - "酶", - "闲", - "忧", - "酚", - "顽", - "羽", - "涨", - "卸", - "仗", - "陪", - "辟", - "惩", - "杭", - "姚", - "肚", - "捉", - "飘", - "漂", - "昆", - "欺", - "吾", - "郎", - "烷", - "汁", - "呵", - "饰", - "萧", - "雅", - "邮", - "迁", - "燕", - "撒", - "姻", - "赴", - "宴", - "烦", - "债", - "帐", - "斑", - "铃", - "旨", - "醇", - "董", - "饼", - "雏", - "姿", - "拌", - "傅", - "腹", - "妥", - "揉", - "贤", - "拆", - "歪", - "葡", - "胺", - "丢", - "浩", - "徽", - "昂", - "垫", - "挡", - "览", - "贪", - "慰", - "缴", - "汪", - "慌", - "冯", - "诺", - "姜", - "谊", - "凶", - "劣", - "诬", - "耀", - "昏", - "躺", - "盈", - "骑", - "乔", - "溪", - "丛", - "卢", - "抹", - "闷", - "咨", - "刮", - "驾", - "缆", - "悟", - "摘", - "铒", - "掷", - "颇", - "幻", - "柄", - "惠", - "惨", - "佳", - "仇", - "腊", - "窝", - "涤", - "剑", - "瞧", - "堡", - "泼", - "葱", - "罩", - "霍", - "捞", - "胎", - "苍", - "滨", - "俩", - "捅", - "湘", - "砍", - "霞", - "邵", - "萄", - "疯", - "淮", - "遂", - "熊", - "粪", - "烘", - "宿", - "档", - "戈", - "驳", - "嫂", - "裕", - "徙", - "箭", - "捐", - "肠", - "撑", - "晒", - "辨", - "殿", - "莲", - "摊", - "搅", - "酱", - "屏", - "疫", - "哀", - "蔡", - "堵", - "沫", - "皱", - "畅", - "叠", - "阁", - "莱", - "敲", - "辖", - "钩", - "痕", - "坝", - "巷", - "饿", - "祸", - "丘", - "玄", - "溜", - "曰", - "逻", - "彭", - "尝", - "卿", - "妨", - "艇", - "吞", - "韦", - "怨", - "矮", - "歇" -] \ No newline at end of file diff --git a/networks/monero/wallet/polyseed/src/words/zh_traditional.rs b/networks/monero/wallet/polyseed/src/words/zh_traditional.rs deleted file mode 100644 index 3847f6e6c..000000000 --- a/networks/monero/wallet/polyseed/src/words/zh_traditional.rs +++ /dev/null @@ -1,2050 +0,0 @@ -&[ - "的", - "一", - "是", - "在", - "不", - "了", - "有", - "和", - "人", - "這", - "中", - "大", - "為", - "上", - "個", - "國", - "我", - "以", - "要", - "他", - "時", - "來", - "用", - "們", - "生", - "到", - "作", - "地", - "於", - "出", - "就", - "分", - "對", - "成", - "會", - "可", - "主", - "發", - "年", - "動", - "同", - "工", - "也", - "能", - "下", - "過", - "子", - "說", - "產", - "種", - "面", - "而", - "方", - "後", - "多", - "定", - "行", - "學", - "法", - "所", - "民", - "得", - "經", - "十", - "三", - "之", - "進", - "著", - "等", - "部", - "度", - "家", - "電", - "力", - "裡", - "如", - "水", - "化", - "高", - "自", - "二", - "理", - "起", - "小", - "物", - "現", - "實", - "加", - "量", - "都", - "兩", - "體", - "制", - "機", - "當", - "使", - "點", - "從", - "業", - "本", - "去", - "把", - "性", - "好", - "應", - "開", - "它", - "合", - "還", - "因", - "由", - "其", - "些", - "然", - "前", - "外", - "天", - "政", - "四", - "日", - "那", - "社", - "義", - "事", - "平", - "形", - "相", - "全", - "表", - "間", - "樣", - "與", - "關", - "各", - "重", - "新", - "線", - "內", - "數", - "正", - "心", - "反", - "你", - "明", - "看", - "原", - "又", - "麼", - "利", - "比", - "或", - "但", - "質", - "氣", - "第", - "向", - "道", - "命", - "此", - "變", - "條", - "只", - "沒", - "結", - "解", - "問", - "意", - "建", - "月", - "公", - "無", - "系", - "軍", - "很", - "情", - "者", - "最", - "立", - "代", - "想", - "已", - "通", - "並", - "提", - "直", - "題", - "黨", - "程", - "展", - "五", - "果", - "料", - "象", - "員", - "革", - "位", - "入", - "常", - "文", - "總", - "次", - "品", - "式", - "活", - "設", - "及", - "管", - "特", - "件", - "長", - "求", - "老", - "頭", - "基", - "資", - "邊", - "流", - "路", - "級", - "少", - "圖", - "山", - "統", - "接", - "知", - "較", - "將", - "組", - "見", - "計", - "別", - "她", - "手", - "角", - "期", - "根", - "論", - "運", - "農", - "指", - "幾", - "九", - "區", - "強", - "放", - "決", - "西", - "被", - "幹", - "做", - "必", - "戰", - "先", - "回", - "則", - "任", - "取", - "據", - "處", - "隊", - "南", - "給", - "色", - "光", - "門", - "即", - "保", - "治", - "北", - "造", - "百", - "規", - "熱", - "領", - "七", - "海", - "口", - "東", - "導", - "器", - "壓", - "志", - "世", - "金", - "增", - "爭", - "濟", - "階", - "油", - "思", - "術", - "極", - "交", - "受", - "聯", - "什", - "認", - "六", - "共", - "權", - "收", - "證", - "改", - "清", - "美", - "再", - "採", - "轉", - "更", - "單", - "風", - "切", - "打", - "白", - "教", - "速", - "花", - "帶", - "安", - "場", - "身", - "車", - "例", - "真", - "務", - "具", - "萬", - "每", - "目", - "至", - "達", - "走", - "積", - "示", - "議", - "聲", - "報", - "鬥", - "完", - "類", - "八", - "離", - "華", - "名", - "確", - "才", - "科", - "張", - "信", - "馬", - "節", - "話", - "米", - "整", - "空", - "元", - "況", - "今", - "集", - "溫", - "傳", - "土", - "許", - "步", - "群", - "廣", - "石", - "記", - "需", - "段", - "研", - "界", - "拉", - "林", - "律", - "叫", - "且", - "究", - "觀", - "越", - "織", - "裝", - "影", - "算", - "低", - "持", - "音", - "眾", - "書", - "布", - "复", - "容", - "兒", - "須", - "際", - "商", - "非", - "驗", - "連", - "斷", - "深", - "難", - "近", - "礦", - "千", - "週", - "委", - "素", - "技", - "備", - "半", - "辦", - "青", - "省", - "列", - "習", - "響", - "約", - "支", - "般", - "史", - "感", - "勞", - "便", - "團", - "往", - "酸", - "歷", - "市", - "克", - "何", - "除", - "消", - "構", - "府", - "稱", - "太", - "準", - "精", - "值", - "號", - "率", - "族", - "維", - "劃", - "選", - "標", - "寫", - "存", - "候", - "毛", - "親", - "快", - "效", - "斯", - "院", - "查", - "江", - "型", - "眼", - "王", - "按", - "格", - "養", - "易", - "置", - "派", - "層", - "片", - "始", - "卻", - "專", - "狀", - "育", - "廠", - "京", - "識", - "適", - "屬", - "圓", - "包", - "火", - "住", - "調", - "滿", - "縣", - "局", - "照", - "參", - "紅", - "細", - "引", - "聽", - "該", - "鐵", - "價", - "嚴", - "首", - "底", - "液", - "官", - "德", - "隨", - "病", - "蘇", - "失", - "爾", - "死", - "講", - "配", - "女", - "黃", - "推", - "顯", - "談", - "罪", - "神", - "藝", - "呢", - "席", - "含", - "企", - "望", - "密", - "批", - "營", - "項", - "防", - "舉", - "球", - "英", - "氧", - "勢", - "告", - "李", - "台", - "落", - "木", - "幫", - "輪", - "破", - "亞", - "師", - "圍", - "注", - "遠", - "字", - "材", - "排", - "供", - "河", - "態", - "封", - "另", - "施", - "減", - "樹", - "溶", - "怎", - "止", - "案", - "言", - "士", - "均", - "武", - "固", - "葉", - "魚", - "波", - "視", - "僅", - "費", - "緊", - "愛", - "左", - "章", - "早", - "朝", - "害", - "續", - "輕", - "服", - "試", - "食", - "充", - "兵", - "源", - "判", - "護", - "司", - "足", - "某", - "練", - "差", - "致", - "板", - "田", - "降", - "黑", - "犯", - "負", - "擊", - "范", - "繼", - "興", - "似", - "餘", - "堅", - "曲", - "輸", - "修", - "故", - "城", - "夫", - "夠", - "送", - "筆", - "船", - "佔", - "右", - "財", - "吃", - "富", - "春", - "職", - "覺", - "漢", - "畫", - "功", - "巴", - "跟", - "雖", - "雜", - "飛", - "檢", - "吸", - "助", - "昇", - "陽", - "互", - "初", - "創", - "抗", - "考", - "投", - "壞", - "策", - "古", - "徑", - "換", - "未", - "跑", - "留", - "鋼", - "曾", - "端", - "責", - "站", - "簡", - "述", - "錢", - "副", - "盡", - "帝", - "射", - "草", - "衝", - "承", - "獨", - "令", - "限", - "阿", - "宣", - "環", - "雙", - "請", - "超", - "微", - "讓", - "控", - "州", - "良", - "軸", - "找", - "否", - "紀", - "益", - "依", - "優", - "頂", - "礎", - "載", - "倒", - "房", - "突", - "坐", - "粉", - "敵", - "略", - "客", - "袁", - "冷", - "勝", - "絕", - "析", - "塊", - "劑", - "測", - "絲", - "協", - "訴", - "念", - "陳", - "仍", - "羅", - "鹽", - "友", - "洋", - "錯", - "苦", - "夜", - "刑", - "移", - "頻", - "逐", - "靠", - "混", - "母", - "短", - "皮", - "終", - "聚", - "汽", - "村", - "雲", - "哪", - "既", - "距", - "衛", - "停", - "烈", - "央", - "察", - "燒", - "迅", - "境", - "若", - "印", - "洲", - "刻", - "括", - "激", - "孔", - "搞", - "甚", - "室", - "待", - "核", - "校", - "散", - "侵", - "吧", - "甲", - "遊", - "久", - "菜", - "味", - "舊", - "模", - "湖", - "貨", - "損", - "預", - "阻", - "毫", - "普", - "穩", - "乙", - "媽", - "植", - "息", - "擴", - "銀", - "語", - "揮", - "酒", - "守", - "拿", - "序", - "紙", - "醫", - "缺", - "雨", - "嗎", - "針", - "劉", - "啊", - "急", - "唱", - "誤", - "訓", - "願", - "審", - "附", - "獲", - "茶", - "鮮", - "糧", - "斤", - "孩", - "脫", - "硫", - "肥", - "善", - "龍", - "演", - "父", - "漸", - "血", - "歡", - "械", - "掌", - "歌", - "沙", - "剛", - "攻", - "謂", - "盾", - "討", - "晚", - "粒", - "亂", - "燃", - "矛", - "乎", - "殺", - "藥", - "寧", - "魯", - "貴", - "鐘", - "煤", - "讀", - "班", - "伯", - "香", - "介", - "迫", - "句", - "豐", - "培", - "握", - "蘭", - "擔", - "弦", - "蛋", - "沉", - "假", - "穿", - "執", - "答", - "樂", - "誰", - "順", - "煙", - "縮", - "徵", - "臉", - "喜", - "松", - "腳", - "困", - "異", - "免", - "背", - "星", - "福", - "買", - "染", - "井", - "概", - "慢", - "怕", - "磁", - "倍", - "祖", - "皇", - "促", - "靜", - "補", - "評", - "翻", - "肉", - "踐", - "尼", - "衣", - "寬", - "揚", - "棉", - "希", - "傷", - "操", - "垂", - "秋", - "宜", - "氫", - "套", - "督", - "振", - "架", - "亮", - "末", - "憲", - "慶", - "編", - "牛", - "觸", - "映", - "雷", - "銷", - "詩", - "座", - "居", - "抓", - "裂", - "胞", - "呼", - "娘", - "景", - "威", - "綠", - "晶", - "厚", - "盟", - "衡", - "雞", - "孫", - "延", - "危", - "膠", - "屋", - "鄉", - "臨", - "陸", - "顧", - "掉", - "呀", - "燈", - "歲", - "措", - "束", - "耐", - "劇", - "玉", - "趙", - "跳", - "哥", - "季", - "課", - "凱", - "胡", - "額", - "款", - "紹", - "卷", - "齊", - "偉", - "蒸", - "殖", - "永", - "宗", - "苗", - "川", - "爐", - "岩", - "弱", - "零", - "楊", - "奏", - "沿", - "露", - "桿", - "探", - "滑", - "鎮", - "飯", - "濃", - "航", - "懷", - "趕", - "庫", - "奪", - "伊", - "靈", - "稅", - "途", - "滅", - "賽", - "歸", - "召", - "鼓", - "播", - "盤", - "裁", - "險", - "康", - "唯", - "錄", - "菌", - "純", - "借", - "糖", - "蓋", - "橫", - "符", - "私", - "努", - "堂", - "域", - "槍", - "潤", - "幅", - "哈", - "竟", - "熟", - "蟲", - "澤", - "腦", - "壤", - "碳", - "歐", - "遍", - "側", - "寨", - "敢", - "徹", - "慮", - "斜", - "薄", - "庭", - "納", - "彈", - "飼", - "伸", - "折", - "麥", - "濕", - "暗", - "荷", - "瓦", - "塞", - "床", - "築", - "惡", - "戶", - "訪", - "塔", - "奇", - "透", - "梁", - "刀", - "旋", - "跡", - "卡", - "氯", - "遇", - "份", - "毒", - "泥", - "退", - "洗", - "擺", - "灰", - "彩", - "賣", - "耗", - "夏", - "擇", - "忙", - "銅", - "獻", - "硬", - "予", - "繁", - "圈", - "雪", - "函", - "亦", - "抽", - "篇", - "陣", - "陰", - "丁", - "尺", - "追", - "堆", - "雄", - "迎", - "泛", - "爸", - "樓", - "避", - "謀", - "噸", - "野", - "豬", - "旗", - "累", - "偏", - "典", - "館", - "索", - "秦", - "脂", - "潮", - "爺", - "豆", - "忽", - "托", - "驚", - "塑", - "遺", - "愈", - "朱", - "替", - "纖", - "粗", - "傾", - "尚", - "痛", - "楚", - "謝", - "奮", - "購", - "磨", - "君", - "池", - "旁", - "碎", - "骨", - "監", - "捕", - "弟", - "暴", - "割", - "貫", - "殊", - "釋", - "詞", - "亡", - "壁", - "頓", - "寶", - "午", - "塵", - "聞", - "揭", - "炮", - "殘", - "冬", - "橋", - "婦", - "警", - "綜", - "招", - "吳", - "付", - "浮", - "遭", - "徐", - "您", - "搖", - "谷", - "贊", - "箱", - "隔", - "訂", - "男", - "吹", - "園", - "紛", - "唐", - "敗", - "宋", - "玻", - "巨", - "耕", - "坦", - "榮", - "閉", - "灣", - "鍵", - "凡", - "駐", - "鍋", - "救", - "恩", - "剝", - "凝", - "鹼", - "齒", - "截", - "煉", - "麻", - "紡", - "禁", - "廢", - "盛", - "版", - "緩", - "淨", - "睛", - "昌", - "婚", - "涉", - "筒", - "嘴", - "插", - "岸", - "朗", - "莊", - "街", - "藏", - "姑", - "貿", - "腐", - "奴", - "啦", - "慣", - "乘", - "夥", - "恢", - "勻", - "紗", - "扎", - "辯", - "耳", - "彪", - "臣", - "億", - "璃", - "抵", - "脈", - "秀", - "薩", - "俄", - "網", - "舞", - "店", - "噴", - "縱", - "寸", - "汗", - "掛", - "洪", - "賀", - "閃", - "柬", - "爆", - "烯", - "津", - "稻", - "牆", - "軟", - "勇", - "像", - "滾", - "厘", - "蒙", - "芳", - "肯", - "坡", - "柱", - "盪", - "腿", - "儀", - "旅", - "尾", - "軋", - "冰", - "貢", - "登", - "黎", - "削", - "鑽", - "勒", - "逃", - "障", - "氨", - "郭", - "峰", - "幣", - "港", - "伏", - "軌", - "畝", - "畢", - "擦", - "莫", - "刺", - "浪", - "秘", - "援", - "株", - "健", - "售", - "股", - "島", - "甘", - "泡", - "睡", - "童", - "鑄", - "湯", - "閥", - "休", - "匯", - "舍", - "牧", - "繞", - "炸", - "哲", - "磷", - "績", - "朋", - "淡", - "尖", - "啟", - "陷", - "柴", - "呈", - "徒", - "顏", - "淚", - "稍", - "忘", - "泵", - "藍", - "拖", - "洞", - "授", - "鏡", - "辛", - "壯", - "鋒", - "貧", - "虛", - "彎", - "摩", - "泰", - "幼", - "廷", - "尊", - "窗", - "綱", - "弄", - "隸", - "疑", - "氏", - "宮", - "姐", - "震", - "瑞", - "怪", - "尤", - "琴", - "循", - "描", - "膜", - "違", - "夾", - "腰", - "緣", - "珠", - "窮", - "森", - "枝", - "竹", - "溝", - "催", - "繩", - "憶", - "邦", - "剩", - "幸", - "漿", - "欄", - "擁", - "牙", - "貯", - "禮", - "濾", - "鈉", - "紋", - "罷", - "拍", - "咱", - "喊", - "袖", - "埃", - "勤", - "罰", - "焦", - "潛", - "伍", - "墨", - "欲", - "縫", - "姓", - "刊", - "飽", - "仿", - "獎", - "鋁", - "鬼", - "麗", - "跨", - "默", - "挖", - "鏈", - "掃", - "喝", - "袋", - "炭", - "污", - "幕", - "諸", - "弧", - "勵", - "梅", - "奶", - "潔", - "災", - "舟", - "鑑", - "苯", - "訟", - "抱", - "毀", - "懂", - "寒", - "智", - "埔", - "寄", - "屆", - "躍", - "渡", - "挑", - "丹", - "艱", - "貝", - "碰", - "拔", - "爹", - "戴", - "碼", - "夢", - "芽", - "熔", - "赤", - "漁", - "哭", - "敬", - "顆", - "奔", - "鉛", - "仲", - "虎", - "稀", - "妹", - "乏", - "珍", - "申", - "桌", - "遵", - "允", - "隆", - "螺", - "倉", - "魏", - "銳", - "曉", - "氮", - "兼", - "隱", - "礙", - "赫", - "撥", - "忠", - "肅", - "缸", - "牽", - "搶", - "博", - "巧", - "殼", - "兄", - "杜", - "訊", - "誠", - "碧", - "祥", - "柯", - "頁", - "巡", - "矩", - "悲", - "灌", - "齡", - "倫", - "票", - "尋", - "桂", - "鋪", - "聖", - "恐", - "恰", - "鄭", - "趣", - "抬", - "荒", - "騰", - "貼", - "柔", - "滴", - "猛", - "闊", - "輛", - "妻", - "填", - "撤", - "儲", - "簽", - "鬧", - "擾", - "紫", - "砂", - "遞", - "戲", - "吊", - "陶", - "伐", - "餵", - "療", - "瓶", - "婆", - "撫", - "臂", - "摸", - "忍", - "蝦", - "蠟", - "鄰", - "胸", - "鞏", - "擠", - "偶", - "棄", - "槽", - "勁", - "乳", - "鄧", - "吉", - "仁", - "爛", - "磚", - "租", - "烏", - "艦", - "伴", - "瓜", - "淺", - "丙", - "暫", - "燥", - "橡", - "柳", - "迷", - "暖", - "牌", - "秧", - "膽", - "詳", - "簧", - "踏", - "瓷", - "譜", - "呆", - "賓", - "糊", - "洛", - "輝", - "憤", - "競", - "隙", - "怒", - "粘", - "乃", - "緒", - "肩", - "籍", - "敏", - "塗", - "熙", - "皆", - "偵", - "懸", - "掘", - "享", - "糾", - "醒", - "狂", - "鎖", - "淀", - "恨", - "牲", - "霸", - "爬", - "賞", - "逆", - "玩", - "陵", - "祝", - "秒", - "浙", - "貌", - "役", - "彼", - "悉", - "鴨", - "趨", - "鳳", - "晨", - "畜", - "輩", - "秩", - "卵", - "署", - "梯", - "炎", - "灘", - "棋", - "驅", - "篩", - "峽", - "冒", - "啥", - "壽", - "譯", - "浸", - "泉", - "帽", - "遲", - "矽", - "疆", - "貸", - "漏", - "稿", - "冠", - "嫩", - "脅", - "芯", - "牢", - "叛", - "蝕", - "奧", - "鳴", - "嶺", - "羊", - "憑", - "串", - "塘", - "繪", - "酵", - "融", - "盆", - "錫", - "廟", - "籌", - "凍", - "輔", - "攝", - "襲", - "筋", - "拒", - "僚", - "旱", - "鉀", - "鳥", - "漆", - "沈", - "眉", - "疏", - "添", - "棒", - "穗", - "硝", - "韓", - "逼", - "扭", - "僑", - "涼", - "挺", - "碗", - "栽", - "炒", - "杯", - "患", - "餾", - "勸", - "豪", - "遼", - "勃", - "鴻", - "旦", - "吏", - "拜", - "狗", - "埋", - "輥", - "掩", - "飲", - "搬", - "罵", - "辭", - "勾", - "扣", - "估", - "蔣", - "絨", - "霧", - "丈", - "朵", - "姆", - "擬", - "宇", - "輯", - "陝", - "雕", - "償", - "蓄", - "崇", - "剪", - "倡", - "廳", - "咬", - "駛", - "薯", - "刷", - "斥", - "番", - "賦", - "奉", - "佛", - "澆", - "漫", - "曼", - "扇", - "鈣", - "桃", - "扶", - "仔", - "返", - "俗", - "虧", - "腔", - "鞋", - "棱", - "覆", - "框", - "悄", - "叔", - "撞", - "騙", - "勘", - "旺", - "沸", - "孤", - "吐", - "孟", - "渠", - "屈", - "疾", - "妙", - "惜", - "仰", - "狠", - "脹", - "諧", - "拋", - "黴", - "桑", - "崗", - "嘛", - "衰", - "盜", - "滲", - "臟", - "賴", - "湧", - "甜", - "曹", - "閱", - "肌", - "哩", - "厲", - "烴", - "緯", - "毅", - "昨", - "偽", - "症", - "煮", - "嘆", - "釘", - "搭", - "莖", - "籠", - "酷", - "偷", - "弓", - "錐", - "恆", - "傑", - "坑", - "鼻", - "翼", - "綸", - "敘", - "獄", - "逮", - "罐", - "絡", - "棚", - "抑", - "膨", - "蔬", - "寺", - "驟", - "穆", - "冶", - "枯", - "冊", - "屍", - "凸", - "紳", - "坯", - "犧", - "焰", - "轟", - "欣", - "晉", - "瘦", - "禦", - "錠", - "錦", - "喪", - "旬", - "鍛", - "壟", - "搜", - "撲", - "邀", - "亭", - "酯", - "邁", - "舒", - "脆", - "酶", - "閒", - "憂", - "酚", - "頑", - "羽", - "漲", - "卸", - "仗", - "陪", - "闢", - "懲", - "杭", - "姚", - "肚", - "捉", - "飄", - "漂", - "昆", - "欺", - "吾", - "郎", - "烷", - "汁", - "呵", - "飾", - "蕭", - "雅", - "郵", - "遷", - "燕", - "撒", - "姻", - "赴", - "宴", - "煩", - "債", - "帳", - "斑", - "鈴", - "旨", - "醇", - "董", - "餅", - "雛", - "姿", - "拌", - "傅", - "腹", - "妥", - "揉", - "賢", - "拆", - "歪", - "葡", - "胺", - "丟", - "浩", - "徽", - "昂", - "墊", - "擋", - "覽", - "貪", - "慰", - "繳", - "汪", - "慌", - "馮", - "諾", - "姜", - "誼", - "兇", - "劣", - "誣", - "耀", - "昏", - "躺", - "盈", - "騎", - "喬", - "溪", - "叢", - "盧", - "抹", - "悶", - "諮", - "刮", - "駕", - "纜", - "悟", - "摘", - "鉺", - "擲", - "頗", - "幻", - "柄", - "惠", - "慘", - "佳", - "仇", - "臘", - "窩", - "滌", - "劍", - "瞧", - "堡", - "潑", - "蔥", - "罩", - "霍", - "撈", - "胎", - "蒼", - "濱", - "倆", - "捅", - "湘", - "砍", - "霞", - "邵", - "萄", - "瘋", - "淮", - "遂", - "熊", - "糞", - "烘", - "宿", - "檔", - "戈", - "駁", - "嫂", - "裕", - "徙", - "箭", - "捐", - "腸", - "撐", - "曬", - "辨", - "殿", - "蓮", - "攤", - "攪", - "醬", - "屏", - "疫", - "哀", - "蔡", - "堵", - "沫", - "皺", - "暢", - "疊", - "閣", - "萊", - "敲", - "轄", - "鉤", - "痕", - "壩", - "巷", - "餓", - "禍", - "丘", - "玄", - "溜", - "曰", - "邏", - "彭", - "嘗", - "卿", - "妨", - "艇", - "吞", - "韋", - "怨", - "矮", - "歇" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/Cargo.toml b/networks/monero/wallet/seed/Cargo.toml deleted file mode 100644 index ba28ed0c3..000000000 --- a/networks/monero/wallet/seed/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -name = "monero-seed" -version = "0.1.0" -description = "Rust implementation of Monero's seed algorithm" -license = "MIT" -repository = "https://github.com/serai-dex/serai/tree/develop/networks/monero/wallet/seed" -authors = ["Luke Parker "] -edition = "2021" -rust-version = "1.80" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[lints] -workspace = true - -[dependencies] -std-shims = { path = "../../../../common/std-shims", version = "^0.1.1", default-features = false } - -thiserror = { version = "1", default-features = false, optional = true } - -zeroize = { version = "^1.5", default-features = false, features = ["zeroize_derive"] } -rand_core = { version = "0.6", default-features = false } - -curve25519-dalek = { version = "4", default-features = false, features = ["alloc", "zeroize"] } - -[dev-dependencies] -hex = { version = "0.4", default-features = false, features = ["std"] } -monero-primitives = { path = "../../primitives", default-features = false, features = ["std"] } - -[features] -std = [ - "std-shims/std", - - "thiserror", - - "zeroize/std", - "rand_core/std", -] -default = ["std"] diff --git a/networks/monero/wallet/seed/LICENSE b/networks/monero/wallet/seed/LICENSE deleted file mode 100644 index 91d893c11..000000000 --- a/networks/monero/wallet/seed/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022-2024 Luke Parker - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/networks/monero/wallet/seed/README.md b/networks/monero/wallet/seed/README.md deleted file mode 100644 index dded41331..000000000 --- a/networks/monero/wallet/seed/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Monero Seeds - -Rust implementation of Monero's seed algorithm. - -This library is usable under no-std when the `std` feature (on by default) is -disabled. - -### Cargo Features - -- `std` (on by default): Enables `std` (and with it, more efficient internal - implementations). diff --git a/networks/monero/wallet/seed/src/lib.rs b/networks/monero/wallet/seed/src/lib.rs deleted file mode 100644 index 1cbdffa8d..000000000 --- a/networks/monero/wallet/seed/src/lib.rs +++ /dev/null @@ -1,353 +0,0 @@ -#![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![doc = include_str!("../README.md")] -#![deny(missing_docs)] -#![cfg_attr(not(feature = "std"), no_std)] - -use core::{ops::Deref, fmt}; -use std_shims::{ - sync::LazyLock, - vec, - vec::Vec, - string::{String, ToString}, - collections::HashMap, -}; - -use zeroize::{Zeroize, Zeroizing}; -use rand_core::{RngCore, CryptoRng}; - -use curve25519_dalek::scalar::Scalar; - -#[cfg(test)] -mod tests; - -// The amount of words in a seed without a checksum. -const SEED_LENGTH: usize = 24; -// The amount of words in a seed with a checksum. -const SEED_LENGTH_WITH_CHECKSUM: usize = 25; - -/// An error when working with a seed. -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -#[cfg_attr(feature = "std", derive(thiserror::Error))] -pub enum SeedError { - #[cfg_attr(feature = "std", error("invalid seed"))] - /// The seed was invalid. - InvalidSeed, - /// The checksum did not match the data. - #[cfg_attr(feature = "std", error("invalid checksum"))] - InvalidChecksum, - /// The deprecated English language option was used with a checksum. - /// - /// The deprecated English language option did not include a checksum. - #[cfg_attr(feature = "std", error("deprecated English language option included a checksum"))] - DeprecatedEnglishWithChecksum, -} - -/// Language options. -#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Zeroize)] -pub enum Language { - /// Chinese language option. - Chinese, - /// English language option. - English, - /// Dutch language option. - Dutch, - /// French language option. - French, - /// Spanish language option. - Spanish, - /// German language option. - German, - /// Italian language option. - Italian, - /// Portuguese language option. - Portuguese, - /// Japanese language option. - Japanese, - /// Russian language option. - Russian, - /// Esperanto language option. - Esperanto, - /// Lojban language option. - Lojban, - /// The original, and deprecated, English language. - DeprecatedEnglish, -} - -fn trim(word: &str, len: usize) -> Zeroizing { - Zeroizing::new(word.chars().take(len).collect()) -} - -struct WordList { - word_list: &'static [&'static str], - word_map: HashMap<&'static str, usize>, - trimmed_word_map: HashMap, - unique_prefix_length: usize, -} - -impl WordList { - fn new(word_list: &'static [&'static str], prefix_length: usize) -> WordList { - let mut lang = WordList { - word_list, - word_map: HashMap::new(), - trimmed_word_map: HashMap::new(), - unique_prefix_length: prefix_length, - }; - - for (i, word) in lang.word_list.iter().enumerate() { - lang.word_map.insert(word, i); - lang.trimmed_word_map.insert(trim(word, lang.unique_prefix_length).deref().clone(), i); - } - - lang - } -} - -static LANGUAGES: LazyLock> = LazyLock::new(|| { - HashMap::from([ - (Language::Chinese, WordList::new(include!("./words/zh.rs"), 1)), - (Language::English, WordList::new(include!("./words/en.rs"), 3)), - (Language::Dutch, WordList::new(include!("./words/nl.rs"), 4)), - (Language::French, WordList::new(include!("./words/fr.rs"), 4)), - (Language::Spanish, WordList::new(include!("./words/es.rs"), 4)), - (Language::German, WordList::new(include!("./words/de.rs"), 4)), - (Language::Italian, WordList::new(include!("./words/it.rs"), 4)), - (Language::Portuguese, WordList::new(include!("./words/pt.rs"), 4)), - (Language::Japanese, WordList::new(include!("./words/ja.rs"), 3)), - (Language::Russian, WordList::new(include!("./words/ru.rs"), 4)), - (Language::Esperanto, WordList::new(include!("./words/eo.rs"), 4)), - (Language::Lojban, WordList::new(include!("./words/jbo.rs"), 4)), - (Language::DeprecatedEnglish, WordList::new(include!("./words/ang.rs"), 4)), - ]) -}); - -fn checksum_index(words: &[Zeroizing], lang: &WordList) -> usize { - let mut trimmed_words = Zeroizing::new(String::new()); - for w in words { - *trimmed_words += &trim(w, lang.unique_prefix_length); - } - - const fn crc32_table() -> [u32; 256] { - let poly = 0xedb88320u32; - - let mut res = [0; 256]; - let mut i = 0; - while i < 256 { - let mut entry = i; - let mut b = 0; - while b < 8 { - let trigger = entry & 1; - entry >>= 1; - if trigger == 1 { - entry ^= poly; - } - b += 1; - } - res[i as usize] = entry; - i += 1; - } - - res - } - const CRC32_TABLE: [u32; 256] = crc32_table(); - - let trimmed_words = trimmed_words.as_bytes(); - let mut checksum = u32::MAX; - for i in 0 .. trimmed_words.len() { - checksum = CRC32_TABLE[usize::from(u8::try_from(checksum % 256).unwrap() ^ trimmed_words[i])] ^ - (checksum >> 8); - } - - usize::try_from(!checksum).unwrap() % words.len() -} - -// Convert a private key to a seed -#[allow(clippy::needless_pass_by_value)] -fn key_to_seed(lang: Language, key: Zeroizing) -> Seed { - let bytes = Zeroizing::new(key.to_bytes()); - - // get the language words - let words = &LANGUAGES[&lang].word_list; - let list_len = u64::try_from(words.len()).unwrap(); - - // To store the found words & add the checksum word later. - let mut seed = Vec::with_capacity(25); - - // convert to words - // 4 bytes -> 3 words. 8 digits base 16 -> 3 digits base 1626 - let mut segment = [0; 4]; - let mut indices = [0; 4]; - for i in 0 .. 8 { - // convert first 4 byte to u32 & get the word indices - let start = i * 4; - // convert 4 byte to u32 - segment.copy_from_slice(&bytes[start .. (start + 4)]); - // Actually convert to a u64 so we can add without overflowing - indices[0] = u64::from(u32::from_le_bytes(segment)); - indices[1] = indices[0]; - indices[0] /= list_len; - indices[2] = indices[0] + indices[1]; - indices[0] /= list_len; - indices[3] = indices[0] + indices[2]; - - // append words to seed - for i in indices.iter().skip(1) { - let word = usize::try_from(i % list_len).unwrap(); - seed.push(Zeroizing::new(words[word].to_string())); - } - } - segment.zeroize(); - indices.zeroize(); - - // create a checksum word for all languages except old english - if lang != Language::DeprecatedEnglish { - let checksum = seed[checksum_index(&seed, &LANGUAGES[&lang])].clone(); - seed.push(checksum); - } - - let mut res = Zeroizing::new(String::new()); - for (i, word) in seed.iter().enumerate() { - if i != 0 { - *res += " "; - } - *res += word; - } - Seed(lang, res) -} - -// Convert a seed to bytes -fn seed_to_bytes(lang: Language, words: &str) -> Result, SeedError> { - // get seed words - let words = words.split_whitespace().map(|w| Zeroizing::new(w.to_string())).collect::>(); - if (words.len() != SEED_LENGTH) && (words.len() != SEED_LENGTH_WITH_CHECKSUM) { - panic!("invalid seed passed to seed_to_bytes"); - } - - let has_checksum = words.len() == SEED_LENGTH_WITH_CHECKSUM; - if has_checksum && lang == Language::DeprecatedEnglish { - Err(SeedError::DeprecatedEnglishWithChecksum)?; - } - - // Validate words are in the language word list - let lang_word_list: &WordList = &LANGUAGES[&lang]; - let matched_indices = (|| { - let has_checksum = words.len() == SEED_LENGTH_WITH_CHECKSUM; - let mut matched_indices = Zeroizing::new(vec![]); - - // Iterate through all the words and see if they're all present - for word in &words { - let trimmed = trim(word, lang_word_list.unique_prefix_length); - let word = if has_checksum { &trimmed } else { word }; - - if let Some(index) = if has_checksum { - lang_word_list.trimmed_word_map.get(word.deref()) - } else { - lang_word_list.word_map.get(&word.as_str()) - } { - matched_indices.push(*index); - } else { - Err(SeedError::InvalidSeed)?; - } - } - - if has_checksum { - // exclude the last word when calculating a checksum. - let last_word = words.last().unwrap().clone(); - let checksum = words[checksum_index(&words[.. words.len() - 1], lang_word_list)].clone(); - - // check the trimmed checksum and trimmed last word line up - if trim(&checksum, lang_word_list.unique_prefix_length) != - trim(&last_word, lang_word_list.unique_prefix_length) - { - Err(SeedError::InvalidChecksum)?; - } - } - - Ok(matched_indices) - })()?; - - // convert to bytes - let mut res = Zeroizing::new([0; 32]); - let mut indices = Zeroizing::new([0; 4]); - for i in 0 .. 8 { - // read 3 indices at a time - let i3 = i * 3; - indices[1] = matched_indices[i3]; - indices[2] = matched_indices[i3 + 1]; - indices[3] = matched_indices[i3 + 2]; - - let inner = |i| { - let mut base = (lang_word_list.word_list.len() - indices[i] + indices[i + 1]) % - lang_word_list.word_list.len(); - // Shift the index over - for _ in 0 .. i { - base *= lang_word_list.word_list.len(); - } - base - }; - // set the last index - indices[0] = indices[1] + inner(1) + inner(2); - if (indices[0] % lang_word_list.word_list.len()) != indices[1] { - Err(SeedError::InvalidSeed)?; - } - - let pos = i * 4; - let mut bytes = u32::try_from(indices[0]).unwrap().to_le_bytes(); - res[pos .. (pos + 4)].copy_from_slice(&bytes); - bytes.zeroize(); - } - - Ok(res) -} - -/// A Monero seed. -#[derive(Clone, PartialEq, Eq, Zeroize)] -pub struct Seed(Language, Zeroizing); - -impl fmt::Debug for Seed { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("Seed").finish_non_exhaustive() - } -} - -impl Seed { - /// Create a new seed. - pub fn new(rng: &mut R, lang: Language) -> Seed { - let mut scalar_bytes = Zeroizing::new([0; 64]); - rng.fill_bytes(scalar_bytes.as_mut()); - key_to_seed(lang, Zeroizing::new(Scalar::from_bytes_mod_order_wide(scalar_bytes.deref()))) - } - - /// Parse a seed from a string. - #[allow(clippy::needless_pass_by_value)] - pub fn from_string(lang: Language, words: Zeroizing) -> Result { - let entropy = seed_to_bytes(lang, &words)?; - - // Make sure this is a valid scalar - let scalar = Scalar::from_canonical_bytes(*entropy); - if scalar.is_none().into() { - Err(SeedError::InvalidSeed)?; - } - let mut scalar = scalar.unwrap(); - scalar.zeroize(); - - // Call from_entropy so a trimmed seed becomes a full seed - Ok(Self::from_entropy(lang, entropy).unwrap()) - } - - /// Create a seed from entropy. - #[allow(clippy::needless_pass_by_value)] - pub fn from_entropy(lang: Language, entropy: Zeroizing<[u8; 32]>) -> Option { - Option::from(Scalar::from_canonical_bytes(*entropy)) - .map(|scalar| key_to_seed(lang, Zeroizing::new(scalar))) - } - - /// Convert a seed to a string. - pub fn to_string(&self) -> Zeroizing { - self.1.clone() - } - - /// Return the entropy underlying this seed. - pub fn entropy(&self) -> Zeroizing<[u8; 32]> { - seed_to_bytes(self.0, &self.1).unwrap() - } -} diff --git a/networks/monero/wallet/seed/src/tests.rs b/networks/monero/wallet/seed/src/tests.rs deleted file mode 100644 index 59d6ea003..000000000 --- a/networks/monero/wallet/seed/src/tests.rs +++ /dev/null @@ -1,234 +0,0 @@ -use zeroize::Zeroizing; -use rand_core::OsRng; - -use curve25519_dalek::scalar::Scalar; - -use monero_primitives::keccak256; - -use crate::*; - -#[test] -fn test_original_seed() { - struct Vector { - language: Language, - seed: String, - spend: String, - view: String, - } - - let vectors = [ - Vector { - language: Language::Chinese, - seed: "摇 曲 艺 武 滴 然 效 似 赏 式 祥 歌 买 疑 小 碧 堆 博 键 房 鲜 悲 付 喷 武".into(), - spend: "a5e4fff1706ef9212993a69f246f5c95ad6d84371692d63e9bb0ea112a58340d".into(), - view: "1176c43ce541477ea2f3ef0b49b25112b084e26b8a843e1304ac4677b74cdf02".into(), - }, - Vector { - language: Language::English, - seed: "washing thirsty occur lectures tuesday fainted toxic adapt \ - abnormal memoir nylon mostly building shrugged online ember northern \ - ruby woes dauntless boil family illness inroads northern" - .into(), - spend: "c0af65c0dd837e666b9d0dfed62745f4df35aed7ea619b2798a709f0fe545403".into(), - view: "513ba91c538a5a9069e0094de90e927c0cd147fa10428ce3ac1afd49f63e3b01".into(), - }, - Vector { - language: Language::Dutch, - seed: "setwinst riphagen vimmetje extase blief tuitelig fuiven meifeest \ - ponywagen zesmaal ripdeal matverf codetaal leut ivoor rotten \ - wisgerhof winzucht typograaf atrium rein zilt traktaat verzaagd setwinst" - .into(), - spend: "e2d2873085c447c2bc7664222ac8f7d240df3aeac137f5ff2022eaa629e5b10a".into(), - view: "eac30b69477e3f68093d131c7fd961564458401b07f8c87ff8f6030c1a0c7301".into(), - }, - Vector { - language: Language::French, - seed: "poids vaseux tarte bazar poivre effet entier nuance \ - sensuel ennui pacte osselet poudre battre alibi mouton \ - stade paquet pliage gibier type question position projet pliage" - .into(), - spend: "2dd39ff1a4628a94b5c2ec3e42fb3dfe15c2b2f010154dc3b3de6791e805b904".into(), - view: "6725b32230400a1032f31d622b44c3a227f88258939b14a7c72e00939e7bdf0e".into(), - }, - Vector { - language: Language::Spanish, - seed: "minero ocupar mirar evadir octubre cal logro miope \ - opaco disco ancla litio clase cuello nasal clase \ - fiar avance deseo mente grumo negro cordón croqueta clase" - .into(), - spend: "ae2c9bebdddac067d73ec0180147fc92bdf9ac7337f1bcafbbe57dd13558eb02".into(), - view: "18deafb34d55b7a43cae2c1c1c206a3c80c12cc9d1f84640b484b95b7fec3e05".into(), - }, - Vector { - language: Language::German, - seed: "Kaliber Gabelung Tapir Liveband Favorit Specht Enklave Nabel \ - Jupiter Foliant Chronik nisten löten Vase Aussage Rekord \ - Yeti Gesetz Eleganz Alraune Künstler Almweide Jahr Kastanie Almweide" - .into(), - spend: "79801b7a1b9796856e2397d862a113862e1fdc289a205e79d8d70995b276db06".into(), - view: "99f0ec556643bd9c038a4ed86edcb9c6c16032c4622ed2e000299d527a792701".into(), - }, - Vector { - language: Language::Italian, - seed: "cavo pancetta auto fulmine alleanza filmato diavolo prato \ - forzare meritare litigare lezione segreto evasione votare buio \ - licenza cliente dorso natale crescere vento tutelare vetta evasione" - .into(), - spend: "5e7fd774eb00fa5877e2a8b4dc9c7ffe111008a3891220b56a6e49ac816d650a".into(), - view: "698a1dce6018aef5516e82ca0cb3e3ec7778d17dfb41a137567bfa2e55e63a03".into(), - }, - Vector { - language: Language::Portuguese, - seed: "agito eventualidade onus itrio holograma sodomizar objetos dobro \ - iugoslavo bcrepuscular odalisca abjeto iuane darwinista eczema acetona \ - cibernetico hoquei gleba driver buffer azoto megera nogueira agito" - .into(), - spend: "13b3115f37e35c6aa1db97428b897e584698670c1b27854568d678e729200c0f".into(), - view: "ad1b4fd35270f5f36c4da7166672b347e75c3f4d41346ec2a06d1d0193632801".into(), - }, - Vector { - language: Language::Japanese, - seed: "ぜんぶ どうぐ おたがい せんきょ おうじ そんちょう じゅしん いろえんぴつ \ - かほう つかれる えらぶ にちじょう くのう にちようび ぬまえび さんきゃく \ - おおや ちぬき うすめる いがく せつでん さうな すいえい せつだん おおや" - .into(), - spend: "c56e895cdb13007eda8399222974cdbab493640663804b93cbef3d8c3df80b0b".into(), - view: "6c3634a313ec2ee979d565c33888fd7c3502d696ce0134a8bc1a2698c7f2c508".into(), - }, - Vector { - language: Language::Russian, - seed: "шатер икра нация ехать получать инерция доза реальный \ - рыжий таможня лопата душа веселый клетка атлас лекция \ - обгонять паек наивный лыжный дурак стать ежик задача паек" - .into(), - spend: "7cb5492df5eb2db4c84af20766391cd3e3662ab1a241c70fc881f3d02c381f05".into(), - view: "fcd53e41ec0df995ab43927f7c44bc3359c93523d5009fb3f5ba87431d545a03".into(), - }, - Vector { - language: Language::Esperanto, - seed: "ukazo klini peco etikedo fabriko imitado onklino urino \ - pudro incidento kumuluso ikono smirgi hirundo uretro krii \ - sparkado super speciala pupo alpinisto cvana vokegi zombio fabriko" - .into(), - spend: "82ebf0336d3b152701964ed41df6b6e9a035e57fc98b84039ed0bd4611c58904".into(), - view: "cd4d120e1ea34360af528f6a3e6156063312d9cefc9aa6b5218d366c0ed6a201".into(), - }, - Vector { - language: Language::Lojban, - seed: "jetnu vensa julne xrotu xamsi julne cutci dakli \ - mlatu xedja muvgau palpi xindo sfubu ciste cinri \ - blabi darno dembi janli blabi fenki bukpu burcu blabi" - .into(), - spend: "e4f8c6819ab6cf792cebb858caabac9307fd646901d72123e0367ebc0a79c200".into(), - view: "c806ce62bafaa7b2d597f1a1e2dbe4a2f96bfd804bf6f8420fc7f4a6bd700c00".into(), - }, - Vector { - language: Language::DeprecatedEnglish, - seed: "glorious especially puff son moment add youth nowhere \ - throw glide grip wrong rhythm consume very swear \ - bitter heavy eventually begin reason flirt type unable" - .into(), - spend: "647f4765b66b636ff07170ab6280a9a6804dfbaf19db2ad37d23be024a18730b".into(), - view: "045da65316a906a8c30046053119c18020b07a7a3a6ef5c01ab2a8755416bd02".into(), - }, - // The following seeds require the language specification in order to calculate - // a single valid checksum - Vector { - language: Language::Spanish, - seed: "pluma laico atraer pintor peor cerca balde buscar \ - lancha batir nulo reloj resto gemelo nevera poder columna gol \ - oveja latir amplio bolero feliz fuerza nevera" - .into(), - spend: "30303983fc8d215dd020cc6b8223793318d55c466a86e4390954f373fdc7200a".into(), - view: "97c649143f3c147ba59aa5506cc09c7992c5c219bb26964442142bf97980800e".into(), - }, - Vector { - language: Language::Spanish, - seed: "pluma pluma pluma pluma pluma pluma pluma pluma \ - pluma pluma pluma pluma pluma pluma pluma pluma \ - pluma pluma pluma pluma pluma pluma pluma pluma pluma" - .into(), - spend: "b4050000b4050000b4050000b4050000b4050000b4050000b4050000b4050000".into(), - view: "d73534f7912b395eb70ef911791a2814eb6df7ce56528eaaa83ff2b72d9f5e0f".into(), - }, - Vector { - language: Language::English, - seed: "plus plus plus plus plus plus plus plus \ - plus plus plus plus plus plus plus plus \ - plus plus plus plus plus plus plus plus plus" - .into(), - spend: "3b0400003b0400003b0400003b0400003b0400003b0400003b0400003b040000".into(), - view: "43a8a7715eed11eff145a2024ddcc39740255156da7bbd736ee66a0838053a02".into(), - }, - Vector { - language: Language::Spanish, - seed: "audio audio audio audio audio audio audio audio \ - audio audio audio audio audio audio audio audio \ - audio audio audio audio audio audio audio audio audio" - .into(), - spend: "ba000000ba000000ba000000ba000000ba000000ba000000ba000000ba000000".into(), - view: "1437256da2c85d029b293d8c6b1d625d9374969301869b12f37186e3f906c708".into(), - }, - Vector { - language: Language::English, - seed: "audio audio audio audio audio audio audio audio \ - audio audio audio audio audio audio audio audio \ - audio audio audio audio audio audio audio audio audio" - .into(), - spend: "7900000079000000790000007900000079000000790000007900000079000000".into(), - view: "20bec797ab96780ae6a045dd816676ca7ed1d7c6773f7022d03ad234b581d600".into(), - }, - ]; - - for vector in vectors { - fn trim_by_lang(word: &str, lang: Language) -> String { - if lang != Language::DeprecatedEnglish { - word.chars().take(LANGUAGES[&lang].unique_prefix_length).collect() - } else { - word.to_string() - } - } - - let trim_seed = |seed: &str| { - seed - .split_whitespace() - .map(|word| trim_by_lang(word, vector.language)) - .collect::>() - .join(" ") - }; - - // Test against Monero - { - println!("{}. language: {:?}, seed: {}", line!(), vector.language, vector.seed.clone()); - let seed = Seed::from_string(vector.language, Zeroizing::new(vector.seed.clone())).unwrap(); - let trim = trim_seed(&vector.seed); - assert_eq!(seed, Seed::from_string(vector.language, Zeroizing::new(trim)).unwrap()); - - let spend: [u8; 32] = hex::decode(vector.spend).unwrap().try_into().unwrap(); - // For originalal seeds, Monero directly uses the entropy as a spend key - assert_eq!( - Option::::from(Scalar::from_canonical_bytes(*seed.entropy())), - Option::::from(Scalar::from_canonical_bytes(spend)), - ); - - let view: [u8; 32] = hex::decode(vector.view).unwrap().try_into().unwrap(); - // Monero then derives the view key as H(spend) - assert_eq!( - Scalar::from_bytes_mod_order(keccak256(spend)), - Scalar::from_canonical_bytes(view).unwrap() - ); - - assert_eq!(Seed::from_entropy(vector.language, Zeroizing::new(spend)).unwrap(), seed); - } - - // Test against ourselves - { - let seed = Seed::new(&mut OsRng, vector.language); - println!("{}. seed: {}", line!(), *seed.to_string()); - let trim = trim_seed(&seed.to_string()); - assert_eq!(seed, Seed::from_string(vector.language, Zeroizing::new(trim)).unwrap()); - assert_eq!(seed, Seed::from_entropy(vector.language, seed.entropy()).unwrap()); - assert_eq!(seed, Seed::from_string(vector.language, seed.to_string()).unwrap()); - } - } -} diff --git a/networks/monero/wallet/seed/src/words/ang.rs b/networks/monero/wallet/seed/src/words/ang.rs deleted file mode 100644 index 2800b1a99..000000000 --- a/networks/monero/wallet/seed/src/words/ang.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "like", - "just", - "love", - "know", - "never", - "want", - "time", - "out", - "there", - "make", - "look", - "eye", - "down", - "only", - "think", - "heart", - "back", - "then", - "into", - "about", - "more", - "away", - "still", - "them", - "take", - "thing", - "even", - "through", - "long", - "always", - "world", - "too", - "friend", - "tell", - "try", - "hand", - "thought", - "over", - "here", - "other", - "need", - "smile", - "again", - "much", - "cry", - "been", - "night", - "ever", - "little", - "said", - "end", - "some", - "those", - "around", - "mind", - "people", - "girl", - "leave", - "dream", - "left", - "turn", - "myself", - "give", - "nothing", - "really", - "off", - "before", - "something", - "find", - "walk", - "wish", - "good", - "once", - "place", - "ask", - "stop", - "keep", - "watch", - "seem", - "everything", - "wait", - "got", - "yet", - "made", - "remember", - "start", - "alone", - "run", - "hope", - "maybe", - "believe", - "body", - "hate", - "after", - "close", - "talk", - "stand", - "own", - "each", - "hurt", - "help", - "home", - "god", - "soul", - "new", - "many", - "two", - "inside", - "should", - "true", - "first", - "fear", - "mean", - "better", - "play", - "another", - "gone", - "change", - "use", - "wonder", - "someone", - "hair", - "cold", - "open", - "best", - "any", - "behind", - "happen", - "water", - "dark", - "laugh", - "stay", - "forever", - "name", - "work", - "show", - "sky", - "break", - "came", - "deep", - "door", - "put", - "black", - "together", - "upon", - "happy", - "such", - "great", - "white", - "matter", - "fill", - "past", - "please", - "burn", - "cause", - "enough", - "touch", - "moment", - "soon", - "voice", - "scream", - "anything", - "stare", - "sound", - "red", - "everyone", - "hide", - "kiss", - "truth", - "death", - "beautiful", - "mine", - "blood", - "broken", - "very", - "pass", - "next", - "forget", - "tree", - "wrong", - "air", - "mother", - "understand", - "lip", - "hit", - "wall", - "memory", - "sleep", - "free", - "high", - "realize", - "school", - "might", - "skin", - "sweet", - "perfect", - "blue", - "kill", - "breath", - "dance", - "against", - "fly", - "between", - "grow", - "strong", - "under", - "listen", - "bring", - "sometimes", - "speak", - "pull", - "person", - "become", - "family", - "begin", - "ground", - "real", - "small", - "father", - "sure", - "feet", - "rest", - "young", - "finally", - "land", - "across", - "today", - "different", - "guy", - "line", - "fire", - "reason", - "reach", - "second", - "slowly", - "write", - "eat", - "smell", - "mouth", - "step", - "learn", - "three", - "floor", - "promise", - "breathe", - "darkness", - "push", - "earth", - "guess", - "save", - "song", - "above", - "along", - "both", - "color", - "house", - "almost", - "sorry", - "anymore", - "brother", - "okay", - "dear", - "game", - "fade", - "already", - "apart", - "warm", - "beauty", - "heard", - "notice", - "question", - "shine", - "began", - "piece", - "whole", - "shadow", - "secret", - "street", - "within", - "finger", - "point", - "morning", - "whisper", - "child", - "moon", - "green", - "story", - "glass", - "kid", - "silence", - "since", - "soft", - "yourself", - "empty", - "shall", - "angel", - "answer", - "baby", - "bright", - "dad", - "path", - "worry", - "hour", - "drop", - "follow", - "power", - "war", - "half", - "flow", - "heaven", - "act", - "chance", - "fact", - "least", - "tired", - "children", - "near", - "quite", - "afraid", - "rise", - "sea", - "taste", - "window", - "cover", - "nice", - "trust", - "lot", - "sad", - "cool", - "force", - "peace", - "return", - "blind", - "easy", - "ready", - "roll", - "rose", - "drive", - "held", - "music", - "beneath", - "hang", - "mom", - "paint", - "emotion", - "quiet", - "clear", - "cloud", - "few", - "pretty", - "bird", - "outside", - "paper", - "picture", - "front", - "rock", - "simple", - "anyone", - "meant", - "reality", - "road", - "sense", - "waste", - "bit", - "leaf", - "thank", - "happiness", - "meet", - "men", - "smoke", - "truly", - "decide", - "self", - "age", - "book", - "form", - "alive", - "carry", - "escape", - "damn", - "instead", - "able", - "ice", - "minute", - "throw", - "catch", - "leg", - "ring", - "course", - "goodbye", - "lead", - "poem", - "sick", - "corner", - "desire", - "known", - "problem", - "remind", - "shoulder", - "suppose", - "toward", - "wave", - "drink", - "jump", - "woman", - "pretend", - "sister", - "week", - "human", - "joy", - "crack", - "grey", - "pray", - "surprise", - "dry", - "knee", - "less", - "search", - "bleed", - "caught", - "clean", - "embrace", - "future", - "king", - "son", - "sorrow", - "chest", - "hug", - "remain", - "sat", - "worth", - "blow", - "daddy", - "final", - "parent", - "tight", - "also", - "create", - "lonely", - "safe", - "cross", - "dress", - "evil", - "silent", - "bone", - "fate", - "perhaps", - "anger", - "class", - "scar", - "snow", - "tiny", - "tonight", - "continue", - "control", - "dog", - "edge", - "mirror", - "month", - "suddenly", - "comfort", - "given", - "loud", - "quickly", - "gaze", - "plan", - "rush", - "stone", - "town", - "battle", - "ignore", - "spirit", - "stood", - "stupid", - "yours", - "brown", - "build", - "dust", - "hey", - "kept", - "pay", - "phone", - "twist", - "although", - "ball", - "beyond", - "hidden", - "nose", - "taken", - "fail", - "float", - "pure", - "somehow", - "wash", - "wrap", - "angry", - "cheek", - "creature", - "forgotten", - "heat", - "rip", - "single", - "space", - "special", - "weak", - "whatever", - "yell", - "anyway", - "blame", - "job", - "choose", - "country", - "curse", - "drift", - "echo", - "figure", - "grew", - "laughter", - "neck", - "suffer", - "worse", - "yeah", - "disappear", - "foot", - "forward", - "knife", - "mess", - "somewhere", - "stomach", - "storm", - "beg", - "idea", - "lift", - "offer", - "breeze", - "field", - "five", - "often", - "simply", - "stuck", - "win", - "allow", - "confuse", - "enjoy", - "except", - "flower", - "seek", - "strength", - "calm", - "grin", - "gun", - "heavy", - "hill", - "large", - "ocean", - "shoe", - "sigh", - "straight", - "summer", - "tongue", - "accept", - "crazy", - "everyday", - "exist", - "grass", - "mistake", - "sent", - "shut", - "surround", - "table", - "ache", - "brain", - "destroy", - "heal", - "nature", - "shout", - "sign", - "stain", - "choice", - "doubt", - "glance", - "glow", - "mountain", - "queen", - "stranger", - "throat", - "tomorrow", - "city", - "either", - "fish", - "flame", - "rather", - "shape", - "spin", - "spread", - "ash", - "distance", - "finish", - "image", - "imagine", - "important", - "nobody", - "shatter", - "warmth", - "became", - "feed", - "flesh", - "funny", - "lust", - "shirt", - "trouble", - "yellow", - "attention", - "bare", - "bite", - "money", - "protect", - "amaze", - "appear", - "born", - "choke", - "completely", - "daughter", - "fresh", - "friendship", - "gentle", - "probably", - "six", - "deserve", - "expect", - "grab", - "middle", - "nightmare", - "river", - "thousand", - "weight", - "worst", - "wound", - "barely", - "bottle", - "cream", - "regret", - "relationship", - "stick", - "test", - "crush", - "endless", - "fault", - "itself", - "rule", - "spill", - "art", - "circle", - "join", - "kick", - "mask", - "master", - "passion", - "quick", - "raise", - "smooth", - "unless", - "wander", - "actually", - "broke", - "chair", - "deal", - "favorite", - "gift", - "note", - "number", - "sweat", - "box", - "chill", - "clothes", - "lady", - "mark", - "park", - "poor", - "sadness", - "tie", - "animal", - "belong", - "brush", - "consume", - "dawn", - "forest", - "innocent", - "pen", - "pride", - "stream", - "thick", - "clay", - "complete", - "count", - "draw", - "faith", - "press", - "silver", - "struggle", - "surface", - "taught", - "teach", - "wet", - "bless", - "chase", - "climb", - "enter", - "letter", - "melt", - "metal", - "movie", - "stretch", - "swing", - "vision", - "wife", - "beside", - "crash", - "forgot", - "guide", - "haunt", - "joke", - "knock", - "plant", - "pour", - "prove", - "reveal", - "steal", - "stuff", - "trip", - "wood", - "wrist", - "bother", - "bottom", - "crawl", - "crowd", - "fix", - "forgive", - "frown", - "grace", - "loose", - "lucky", - "party", - "release", - "surely", - "survive", - "teacher", - "gently", - "grip", - "speed", - "suicide", - "travel", - "treat", - "vein", - "written", - "cage", - "chain", - "conversation", - "date", - "enemy", - "however", - "interest", - "million", - "page", - "pink", - "proud", - "sway", - "themselves", - "winter", - "church", - "cruel", - "cup", - "demon", - "experience", - "freedom", - "pair", - "pop", - "purpose", - "respect", - "shoot", - "softly", - "state", - "strange", - "bar", - "birth", - "curl", - "dirt", - "excuse", - "lord", - "lovely", - "monster", - "order", - "pack", - "pants", - "pool", - "scene", - "seven", - "shame", - "slide", - "ugly", - "among", - "blade", - "blonde", - "closet", - "creek", - "deny", - "drug", - "eternity", - "gain", - "grade", - "handle", - "key", - "linger", - "pale", - "prepare", - "swallow", - "swim", - "tremble", - "wheel", - "won", - "cast", - "cigarette", - "claim", - "college", - "direction", - "dirty", - "gather", - "ghost", - "hundred", - "loss", - "lung", - "orange", - "present", - "swear", - "swirl", - "twice", - "wild", - "bitter", - "blanket", - "doctor", - "everywhere", - "flash", - "grown", - "knowledge", - "numb", - "pressure", - "radio", - "repeat", - "ruin", - "spend", - "unknown", - "buy", - "clock", - "devil", - "early", - "false", - "fantasy", - "pound", - "precious", - "refuse", - "sheet", - "teeth", - "welcome", - "add", - "ahead", - "block", - "bury", - "caress", - "content", - "depth", - "despite", - "distant", - "marry", - "purple", - "threw", - "whenever", - "bomb", - "dull", - "easily", - "grasp", - "hospital", - "innocence", - "normal", - "receive", - "reply", - "rhyme", - "shade", - "someday", - "sword", - "toe", - "visit", - "asleep", - "bought", - "center", - "consider", - "flat", - "hero", - "history", - "ink", - "insane", - "muscle", - "mystery", - "pocket", - "reflection", - "shove", - "silently", - "smart", - "soldier", - "spot", - "stress", - "train", - "type", - "view", - "whether", - "bus", - "energy", - "explain", - "holy", - "hunger", - "inch", - "magic", - "mix", - "noise", - "nowhere", - "prayer", - "presence", - "shock", - "snap", - "spider", - "study", - "thunder", - "trail", - "admit", - "agree", - "bag", - "bang", - "bound", - "butterfly", - "cute", - "exactly", - "explode", - "familiar", - "fold", - "further", - "pierce", - "reflect", - "scent", - "selfish", - "sharp", - "sink", - "spring", - "stumble", - "universe", - "weep", - "women", - "wonderful", - "action", - "ancient", - "attempt", - "avoid", - "birthday", - "branch", - "chocolate", - "core", - "depress", - "drunk", - "especially", - "focus", - "fruit", - "honest", - "match", - "palm", - "perfectly", - "pillow", - "pity", - "poison", - "roar", - "shift", - "slightly", - "thump", - "truck", - "tune", - "twenty", - "unable", - "wipe", - "wrote", - "coat", - "constant", - "dinner", - "drove", - "egg", - "eternal", - "flight", - "flood", - "frame", - "freak", - "gasp", - "glad", - "hollow", - "motion", - "peer", - "plastic", - "root", - "screen", - "season", - "sting", - "strike", - "team", - "unlike", - "victim", - "volume", - "warn", - "weird", - "attack", - "await", - "awake", - "built", - "charm", - "crave", - "despair", - "fought", - "grant", - "grief", - "horse", - "limit", - "message", - "ripple", - "sanity", - "scatter", - "serve", - "split", - "string", - "trick", - "annoy", - "blur", - "boat", - "brave", - "clearly", - "cling", - "connect", - "fist", - "forth", - "imagination", - "iron", - "jock", - "judge", - "lesson", - "milk", - "misery", - "nail", - "naked", - "ourselves", - "poet", - "possible", - "princess", - "sail", - "size", - "snake", - "society", - "stroke", - "torture", - "toss", - "trace", - "wise", - "bloom", - "bullet", - "cell", - "check", - "cost", - "darling", - "during", - "footstep", - "fragile", - "hallway", - "hardly", - "horizon", - "invisible", - "journey", - "midnight", - "mud", - "nod", - "pause", - "relax", - "shiver", - "sudden", - "value", - "youth", - "abuse", - "admire", - "blink", - "breast", - "bruise", - "constantly", - "couple", - "creep", - "curve", - "difference", - "dumb", - "emptiness", - "gotta", - "honor", - "plain", - "planet", - "recall", - "rub", - "ship", - "slam", - "soar", - "somebody", - "tightly", - "weather", - "adore", - "approach", - "bond", - "bread", - "burst", - "candle", - "coffee", - "cousin", - "crime", - "desert", - "flutter", - "frozen", - "grand", - "heel", - "hello", - "language", - "level", - "movement", - "pleasure", - "powerful", - "random", - "rhythm", - "settle", - "silly", - "slap", - "sort", - "spoken", - "steel", - "threaten", - "tumble", - "upset", - "aside", - "awkward", - "bee", - "blank", - "board", - "button", - "card", - "carefully", - "complain", - "crap", - "deeply", - "discover", - "drag", - "dread", - "effort", - "entire", - "fairy", - "giant", - "gotten", - "greet", - "illusion", - "jeans", - "leap", - "liquid", - "march", - "mend", - "nervous", - "nine", - "replace", - "rope", - "spine", - "stole", - "terror", - "accident", - "apple", - "balance", - "boom", - "childhood", - "collect", - "demand", - "depression", - "eventually", - "faint", - "glare", - "goal", - "group", - "honey", - "kitchen", - "laid", - "limb", - "machine", - "mere", - "mold", - "murder", - "nerve", - "painful", - "poetry", - "prince", - "rabbit", - "shelter", - "shore", - "shower", - "soothe", - "stair", - "steady", - "sunlight", - "tangle", - "tease", - "treasure", - "uncle", - "begun", - "bliss", - "canvas", - "cheer", - "claw", - "clutch", - "commit", - "crimson", - "crystal", - "delight", - "doll", - "existence", - "express", - "fog", - "football", - "gay", - "goose", - "guard", - "hatred", - "illuminate", - "mass", - "math", - "mourn", - "rich", - "rough", - "skip", - "stir", - "student", - "style", - "support", - "thorn", - "tough", - "yard", - "yearn", - "yesterday", - "advice", - "appreciate", - "autumn", - "bank", - "beam", - "bowl", - "capture", - "carve", - "collapse", - "confusion", - "creation", - "dove", - "feather", - "girlfriend", - "glory", - "government", - "harsh", - "hop", - "inner", - "loser", - "moonlight", - "neighbor", - "neither", - "peach", - "pig", - "praise", - "screw", - "shield", - "shimmer", - "sneak", - "stab", - "subject", - "throughout", - "thrown", - "tower", - "twirl", - "wow", - "army", - "arrive", - "bathroom", - "bump", - "cease", - "cookie", - "couch", - "courage", - "dim", - "guilt", - "howl", - "hum", - "husband", - "insult", - "led", - "lunch", - "mock", - "mostly", - "natural", - "nearly", - "needle", - "nerd", - "peaceful", - "perfection", - "pile", - "price", - "remove", - "roam", - "sanctuary", - "serious", - "shiny", - "shook", - "sob", - "stolen", - "tap", - "vain", - "void", - "warrior", - "wrinkle", - "affection", - "apologize", - "blossom", - "bounce", - "bridge", - "cheap", - "crumble", - "decision", - "descend", - "desperately", - "dig", - "dot", - "flip", - "frighten", - "heartbeat", - "huge", - "lazy", - "lick", - "odd", - "opinion", - "process", - "puzzle", - "quietly", - "retreat", - "score", - "sentence", - "separate", - "situation", - "skill", - "soak", - "square", - "stray", - "taint", - "task", - "tide", - "underneath", - "veil", - "whistle", - "anywhere", - "bedroom", - "bid", - "bloody", - "burden", - "careful", - "compare", - "concern", - "curtain", - "decay", - "defeat", - "describe", - "double", - "dreamer", - "driver", - "dwell", - "evening", - "flare", - "flicker", - "grandma", - "guitar", - "harm", - "horrible", - "hungry", - "indeed", - "lace", - "melody", - "monkey", - "nation", - "object", - "obviously", - "rainbow", - "salt", - "scratch", - "shown", - "shy", - "stage", - "stun", - "third", - "tickle", - "useless", - "weakness", - "worship", - "worthless", - "afternoon", - "beard", - "boyfriend", - "bubble", - "busy", - "certain", - "chin", - "concrete", - "desk", - "diamond", - "doom", - "drawn", - "due", - "felicity", - "freeze", - "frost", - "garden", - "glide", - "harmony", - "hopefully", - "hunt", - "jealous", - "lightning", - "mama", - "mercy", - "peel", - "physical", - "position", - "pulse", - "punch", - "quit", - "rant", - "respond", - "salty", - "sane", - "satisfy", - "savior", - "sheep", - "slept", - "social", - "sport", - "tuck", - "utter", - "valley", - "wolf", - "aim", - "alas", - "alter", - "arrow", - "awaken", - "beaten", - "belief", - "brand", - "ceiling", - "cheese", - "clue", - "confidence", - "connection", - "daily", - "disguise", - "eager", - "erase", - "essence", - "everytime", - "expression", - "fan", - "flag", - "flirt", - "foul", - "fur", - "giggle", - "glorious", - "ignorance", - "law", - "lifeless", - "measure", - "mighty", - "muse", - "north", - "opposite", - "paradise", - "patience", - "patient", - "pencil", - "petal", - "plate", - "ponder", - "possibly", - "practice", - "slice", - "spell", - "stock", - "strife", - "strip", - "suffocate", - "suit", - "tender", - "tool", - "trade", - "velvet", - "verse", - "waist", - "witch", - "aunt", - "bench", - "bold", - "cap", - "certainly", - "click", - "companion", - "creator", - "dart", - "delicate", - "determine", - "dish", - "dragon", - "drama", - "drum", - "dude", - "everybody", - "feast", - "forehead", - "former", - "fright", - "fully", - "gas", - "hook", - "hurl", - "invite", - "juice", - "manage", - "moral", - "possess", - "raw", - "rebel", - "royal", - "scale", - "scary", - "several", - "slight", - "stubborn", - "swell", - "talent", - "tea", - "terrible", - "thread", - "torment", - "trickle", - "usually", - "vast", - "violence", - "weave", - "acid", - "agony", - "ashamed", - "awe", - "belly", - "blend", - "blush", - "character", - "cheat", - "common", - "company", - "coward", - "creak", - "danger", - "deadly", - "defense", - "define", - "depend", - "desperate", - "destination", - "dew", - "duck", - "dusty", - "embarrass", - "engine", - "example", - "explore", - "foe", - "freely", - "frustrate", - "generation", - "glove", - "guilty", - "health", - "hurry", - "idiot", - "impossible", - "inhale", - "jaw", - "kingdom", - "mention", - "mist", - "moan", - "mumble", - "mutter", - "observe", - "ode", - "pathetic", - "pattern", - "pie", - "prefer", - "puff", - "rape", - "rare", - "revenge", - "rude", - "scrape", - "spiral", - "squeeze", - "strain", - "sunset", - "suspend", - "sympathy", - "thigh", - "throne", - "total", - "unseen", - "weapon", - "weary" -] diff --git a/networks/monero/wallet/seed/src/words/de.rs b/networks/monero/wallet/seed/src/words/de.rs deleted file mode 100644 index 85dee0819..000000000 --- a/networks/monero/wallet/seed/src/words/de.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "Abakus", - "Abart", - "abbilden", - "Abbruch", - "Abdrift", - "Abendrot", - "Abfahrt", - "abfeuern", - "Abflug", - "abfragen", - "Abglanz", - "abhärten", - "abheben", - "Abhilfe", - "Abitur", - "Abkehr", - "Ablauf", - "ablecken", - "Ablösung", - "Abnehmer", - "abnutzen", - "Abonnent", - "Abrasion", - "Abrede", - "abrüsten", - "Absicht", - "Absprung", - "Abstand", - "absuchen", - "Abteil", - "Abundanz", - "abwarten", - "Abwurf", - "Abzug", - "Achse", - "Achtung", - "Acker", - "Aderlass", - "Adler", - "Admiral", - "Adresse", - "Affe", - "Affront", - "Afrika", - "Aggregat", - "Agilität", - "ähneln", - "Ahnung", - "Ahorn", - "Akazie", - "Akkord", - "Akrobat", - "Aktfoto", - "Aktivist", - "Albatros", - "Alchimie", - "Alemanne", - "Alibi", - "Alkohol", - "Allee", - "Allüre", - "Almosen", - "Almweide", - "Aloe", - "Alpaka", - "Alpental", - "Alphabet", - "Alpinist", - "Alraune", - "Altbier", - "Alter", - "Altflöte", - "Altruist", - "Alublech", - "Aludose", - "Amateur", - "Amazonas", - "Ameise", - "Amnesie", - "Amok", - "Ampel", - "Amphibie", - "Ampulle", - "Amsel", - "Amulett", - "Anakonda", - "Analogie", - "Ananas", - "Anarchie", - "Anatomie", - "Anbau", - "Anbeginn", - "anbieten", - "Anblick", - "ändern", - "andocken", - "Andrang", - "anecken", - "Anflug", - "Anfrage", - "Anführer", - "Angebot", - "Angler", - "Anhalter", - "Anhöhe", - "Animator", - "Anis", - "Anker", - "ankleben", - "Ankunft", - "Anlage", - "anlocken", - "Anmut", - "Annahme", - "Anomalie", - "Anonymus", - "Anorak", - "anpeilen", - "Anrecht", - "Anruf", - "Ansage", - "Anschein", - "Ansicht", - "Ansporn", - "Anteil", - "Antlitz", - "Antrag", - "Antwort", - "Anwohner", - "Aorta", - "Apfel", - "Appetit", - "Applaus", - "Aquarium", - "Arbeit", - "Arche", - "Argument", - "Arktis", - "Armband", - "Aroma", - "Asche", - "Askese", - "Asphalt", - "Asteroid", - "Ästhetik", - "Astronom", - "Atelier", - "Athlet", - "Atlantik", - "Atmung", - "Audienz", - "aufatmen", - "Auffahrt", - "aufholen", - "aufregen", - "Aufsatz", - "Auftritt", - "Aufwand", - "Augapfel", - "Auktion", - "Ausbruch", - "Ausflug", - "Ausgabe", - "Aushilfe", - "Ausland", - "Ausnahme", - "Aussage", - "Autobahn", - "Avocado", - "Axthieb", - "Bach", - "backen", - "Badesee", - "Bahnhof", - "Balance", - "Balkon", - "Ballett", - "Balsam", - "Banane", - "Bandage", - "Bankett", - "Barbar", - "Barde", - "Barett", - "Bargeld", - "Barkasse", - "Barriere", - "Bart", - "Bass", - "Bastler", - "Batterie", - "Bauch", - "Bauer", - "Bauholz", - "Baujahr", - "Baum", - "Baustahl", - "Bauteil", - "Bauweise", - "Bazar", - "beachten", - "Beatmung", - "beben", - "Becher", - "Becken", - "bedanken", - "beeilen", - "beenden", - "Beere", - "befinden", - "Befreier", - "Begabung", - "Begierde", - "begrüßen", - "Beiboot", - "Beichte", - "Beifall", - "Beigabe", - "Beil", - "Beispiel", - "Beitrag", - "beizen", - "bekommen", - "beladen", - "Beleg", - "bellen", - "belohnen", - "Bemalung", - "Bengel", - "Benutzer", - "Benzin", - "beraten", - "Bereich", - "Bergluft", - "Bericht", - "Bescheid", - "Besitz", - "besorgen", - "Bestand", - "Besuch", - "betanken", - "beten", - "betören", - "Bett", - "Beule", - "Beute", - "Bewegung", - "bewirken", - "Bewohner", - "bezahlen", - "Bezug", - "biegen", - "Biene", - "Bierzelt", - "bieten", - "Bikini", - "Bildung", - "Billard", - "binden", - "Biobauer", - "Biologe", - "Bionik", - "Biotop", - "Birke", - "Bison", - "Bitte", - "Biwak", - "Bizeps", - "blasen", - "Blatt", - "Blauwal", - "Blende", - "Blick", - "Blitz", - "Blockade", - "Blödelei", - "Blondine", - "Blues", - "Blume", - "Blut", - "Bodensee", - "Bogen", - "Boje", - "Bollwerk", - "Bonbon", - "Bonus", - "Boot", - "Bordarzt", - "Börse", - "Böschung", - "Boudoir", - "Boxkampf", - "Boykott", - "Brahms", - "Brandung", - "Brauerei", - "Brecher", - "Breitaxt", - "Bremse", - "brennen", - "Brett", - "Brief", - "Brigade", - "Brillanz", - "bringen", - "brodeln", - "Brosche", - "Brötchen", - "Brücke", - "Brunnen", - "Brüste", - "Brutofen", - "Buch", - "Büffel", - "Bugwelle", - "Bühne", - "Buletten", - "Bullauge", - "Bumerang", - "bummeln", - "Buntglas", - "Bürde", - "Burgherr", - "Bursche", - "Busen", - "Buslinie", - "Bussard", - "Butangas", - "Butter", - "Cabrio", - "campen", - "Captain", - "Cartoon", - "Cello", - "Chalet", - "Charisma", - "Chefarzt", - "Chiffon", - "Chipsatz", - "Chirurg", - "Chor", - "Chronik", - "Chuzpe", - "Clubhaus", - "Cockpit", - "Codewort", - "Cognac", - "Coladose", - "Computer", - "Coupon", - "Cousin", - "Cracking", - "Crash", - "Curry", - "Dach", - "Dackel", - "daddeln", - "daliegen", - "Dame", - "Dammbau", - "Dämon", - "Dampflok", - "Dank", - "Darm", - "Datei", - "Datsche", - "Datteln", - "Datum", - "Dauer", - "Daunen", - "Deckel", - "Decoder", - "Defekt", - "Degen", - "Dehnung", - "Deiche", - "Dekade", - "Dekor", - "Delfin", - "Demut", - "denken", - "Deponie", - "Design", - "Desktop", - "Dessert", - "Detail", - "Detektiv", - "Dezibel", - "Diadem", - "Diagnose", - "Dialekt", - "Diamant", - "Dichter", - "Dickicht", - "Diesel", - "Diktat", - "Diplom", - "Direktor", - "Dirne", - "Diskurs", - "Distanz", - "Docht", - "Dohle", - "Dolch", - "Domäne", - "Donner", - "Dorade", - "Dorf", - "Dörrobst", - "Dorsch", - "Dossier", - "Dozent", - "Drachen", - "Draht", - "Drama", - "Drang", - "Drehbuch", - "Dreieck", - "Dressur", - "Drittel", - "Drossel", - "Druck", - "Duell", - "Duft", - "Düne", - "Dünung", - "dürfen", - "Duschbad", - "Düsenjet", - "Dynamik", - "Ebbe", - "Echolot", - "Echse", - "Eckball", - "Edding", - "Edelweiß", - "Eden", - "Edition", - "Efeu", - "Effekte", - "Egoismus", - "Ehre", - "Eiablage", - "Eiche", - "Eidechse", - "Eidotter", - "Eierkopf", - "Eigelb", - "Eiland", - "Eilbote", - "Eimer", - "einatmen", - "Einband", - "Eindruck", - "Einfall", - "Eingang", - "Einkauf", - "einladen", - "Einöde", - "Einrad", - "Eintopf", - "Einwurf", - "Einzug", - "Eisbär", - "Eisen", - "Eishöhle", - "Eismeer", - "Eiweiß", - "Ekstase", - "Elan", - "Elch", - "Elefant", - "Eleganz", - "Element", - "Elfe", - "Elite", - "Elixier", - "Ellbogen", - "Eloquenz", - "Emigrant", - "Emission", - "Emotion", - "Empathie", - "Empfang", - "Endzeit", - "Energie", - "Engpass", - "Enkel", - "Enklave", - "Ente", - "entheben", - "Entität", - "entladen", - "Entwurf", - "Episode", - "Epoche", - "erachten", - "Erbauer", - "erblühen", - "Erdbeere", - "Erde", - "Erdgas", - "Erdkunde", - "Erdnuss", - "Erdöl", - "Erdteil", - "Ereignis", - "Eremit", - "erfahren", - "Erfolg", - "erfreuen", - "erfüllen", - "Ergebnis", - "erhitzen", - "erkalten", - "erkennen", - "erleben", - "Erlösung", - "ernähren", - "erneuern", - "Ernte", - "Eroberer", - "eröffnen", - "Erosion", - "Erotik", - "Erpel", - "erraten", - "Erreger", - "erröten", - "Ersatz", - "Erstflug", - "Ertrag", - "Eruption", - "erwarten", - "erwidern", - "Erzbau", - "Erzeuger", - "erziehen", - "Esel", - "Eskimo", - "Eskorte", - "Espe", - "Espresso", - "essen", - "Etage", - "Etappe", - "Etat", - "Ethik", - "Etikett", - "Etüde", - "Eule", - "Euphorie", - "Europa", - "Everest", - "Examen", - "Exil", - "Exodus", - "Extrakt", - "Fabel", - "Fabrik", - "Fachmann", - "Fackel", - "Faden", - "Fagott", - "Fahne", - "Faible", - "Fairness", - "Fakt", - "Fakultät", - "Falke", - "Fallobst", - "Fälscher", - "Faltboot", - "Familie", - "Fanclub", - "Fanfare", - "Fangarm", - "Fantasie", - "Farbe", - "Farmhaus", - "Farn", - "Fasan", - "Faser", - "Fassung", - "fasten", - "Faulheit", - "Fauna", - "Faust", - "Favorit", - "Faxgerät", - "Fazit", - "fechten", - "Federboa", - "Fehler", - "Feier", - "Feige", - "feilen", - "Feinripp", - "Feldbett", - "Felge", - "Fellpony", - "Felswand", - "Ferien", - "Ferkel", - "Fernweh", - "Ferse", - "Fest", - "Fettnapf", - "Feuer", - "Fiasko", - "Fichte", - "Fiktion", - "Film", - "Filter", - "Filz", - "Finanzen", - "Findling", - "Finger", - "Fink", - "Finnwal", - "Fisch", - "Fitness", - "Fixpunkt", - "Fixstern", - "Fjord", - "Flachbau", - "Flagge", - "Flamenco", - "Flanke", - "Flasche", - "Flaute", - "Fleck", - "Flegel", - "flehen", - "Fleisch", - "fliegen", - "Flinte", - "Flirt", - "Flocke", - "Floh", - "Floskel", - "Floß", - "Flöte", - "Flugzeug", - "Flunder", - "Flusstal", - "Flutung", - "Fockmast", - "Fohlen", - "Föhnlage", - "Fokus", - "folgen", - "Foliant", - "Folklore", - "Fontäne", - "Förde", - "Forelle", - "Format", - "Forscher", - "Fortgang", - "Forum", - "Fotograf", - "Frachter", - "Fragment", - "Fraktion", - "fräsen", - "Frauenpo", - "Freak", - "Fregatte", - "Freiheit", - "Freude", - "Frieden", - "Frohsinn", - "Frosch", - "Frucht", - "Frühjahr", - "Fuchs", - "Fügung", - "fühlen", - "Füller", - "Fundbüro", - "Funkboje", - "Funzel", - "Furnier", - "Fürsorge", - "Fusel", - "Fußbad", - "Futteral", - "Gabelung", - "gackern", - "Gage", - "gähnen", - "Galaxie", - "Galeere", - "Galopp", - "Gameboy", - "Gamsbart", - "Gandhi", - "Gang", - "Garage", - "Gardine", - "Garküche", - "Garten", - "Gasthaus", - "Gattung", - "gaukeln", - "Gazelle", - "Gebäck", - "Gebirge", - "Gebräu", - "Geburt", - "Gedanke", - "Gedeck", - "Gedicht", - "Gefahr", - "Gefieder", - "Geflügel", - "Gefühl", - "Gegend", - "Gehirn", - "Gehöft", - "Gehweg", - "Geige", - "Geist", - "Gelage", - "Geld", - "Gelenk", - "Gelübde", - "Gemälde", - "Gemeinde", - "Gemüse", - "genesen", - "Genuss", - "Gepäck", - "Geranie", - "Gericht", - "Germane", - "Geruch", - "Gesang", - "Geschenk", - "Gesetz", - "Gesindel", - "Gesöff", - "Gespan", - "Gestade", - "Gesuch", - "Getier", - "Getränk", - "Getümmel", - "Gewand", - "Geweih", - "Gewitter", - "Gewölbe", - "Geysir", - "Giftzahn", - "Gipfel", - "Giraffe", - "Gitarre", - "glänzen", - "Glasauge", - "Glatze", - "Gleis", - "Globus", - "Glück", - "glühen", - "Glutofen", - "Goldzahn", - "Gondel", - "gönnen", - "Gottheit", - "graben", - "Grafik", - "Grashalm", - "Graugans", - "greifen", - "Grenze", - "grillen", - "Groschen", - "Grotte", - "Grube", - "Grünalge", - "Gruppe", - "gruseln", - "Gulasch", - "Gummibär", - "Gurgel", - "Gürtel", - "Güterzug", - "Haarband", - "Habicht", - "hacken", - "hadern", - "Hafen", - "Hagel", - "Hähnchen", - "Haifisch", - "Haken", - "Halbaffe", - "Halsader", - "halten", - "Halunke", - "Handbuch", - "Hanf", - "Harfe", - "Harnisch", - "härten", - "Harz", - "Hasenohr", - "Haube", - "hauchen", - "Haupt", - "Haut", - "Havarie", - "Hebamme", - "hecheln", - "Heck", - "Hedonist", - "Heiler", - "Heimat", - "Heizung", - "Hektik", - "Held", - "helfen", - "Helium", - "Hemd", - "hemmen", - "Hengst", - "Herd", - "Hering", - "Herkunft", - "Hermelin", - "Herrchen", - "Herzdame", - "Heulboje", - "Hexe", - "Hilfe", - "Himbeere", - "Himmel", - "Hingabe", - "hinhören", - "Hinweis", - "Hirsch", - "Hirte", - "Hitzkopf", - "Hobel", - "Hochform", - "Hocker", - "hoffen", - "Hofhund", - "Hofnarr", - "Höhenzug", - "Hohlraum", - "Hölle", - "Holzboot", - "Honig", - "Honorar", - "horchen", - "Hörprobe", - "Höschen", - "Hotel", - "Hubraum", - "Hufeisen", - "Hügel", - "huldigen", - "Hülle", - "Humbug", - "Hummer", - "Humor", - "Hund", - "Hunger", - "Hupe", - "Hürde", - "Hurrikan", - "Hydrant", - "Hypnose", - "Ibis", - "Idee", - "Idiot", - "Igel", - "Illusion", - "Imitat", - "impfen", - "Import", - "Inferno", - "Ingwer", - "Inhalte", - "Inland", - "Insekt", - "Ironie", - "Irrfahrt", - "Irrtum", - "Isolator", - "Istwert", - "Jacke", - "Jade", - "Jagdhund", - "Jäger", - "Jaguar", - "Jahr", - "Jähzorn", - "Jazzfest", - "Jetpilot", - "jobben", - "Jochbein", - "jodeln", - "Jodsalz", - "Jolle", - "Journal", - "Jubel", - "Junge", - "Junimond", - "Jupiter", - "Jutesack", - "Juwel", - "Kabarett", - "Kabine", - "Kabuff", - "Käfer", - "Kaffee", - "Kahlkopf", - "Kaimauer", - "Kajüte", - "Kaktus", - "Kaliber", - "Kaltluft", - "Kamel", - "kämmen", - "Kampagne", - "Kanal", - "Känguru", - "Kanister", - "Kanone", - "Kante", - "Kanu", - "kapern", - "Kapitän", - "Kapuze", - "Karneval", - "Karotte", - "Käsebrot", - "Kasper", - "Kastanie", - "Katalog", - "Kathode", - "Katze", - "kaufen", - "Kaugummi", - "Kauz", - "Kehle", - "Keilerei", - "Keksdose", - "Kellner", - "Keramik", - "Kerze", - "Kessel", - "Kette", - "keuchen", - "kichern", - "Kielboot", - "Kindheit", - "Kinnbart", - "Kinosaal", - "Kiosk", - "Kissen", - "Klammer", - "Klang", - "Klapprad", - "Klartext", - "kleben", - "Klee", - "Kleinod", - "Klima", - "Klingel", - "Klippe", - "Klischee", - "Kloster", - "Klugheit", - "Klüngel", - "kneten", - "Knie", - "Knöchel", - "knüpfen", - "Kobold", - "Kochbuch", - "Kohlrabi", - "Koje", - "Kokosöl", - "Kolibri", - "Kolumne", - "Kombüse", - "Komiker", - "kommen", - "Konto", - "Konzept", - "Kopfkino", - "Kordhose", - "Korken", - "Korsett", - "Kosename", - "Krabbe", - "Krach", - "Kraft", - "Krähe", - "Kralle", - "Krapfen", - "Krater", - "kraulen", - "Kreuz", - "Krokodil", - "Kröte", - "Kugel", - "Kuhhirt", - "Kühnheit", - "Künstler", - "Kurort", - "Kurve", - "Kurzfilm", - "kuscheln", - "küssen", - "Kutter", - "Labor", - "lachen", - "Lackaffe", - "Ladeluke", - "Lagune", - "Laib", - "Lakritze", - "Lammfell", - "Land", - "Langmut", - "Lappalie", - "Last", - "Laterne", - "Latzhose", - "Laubsäge", - "laufen", - "Laune", - "Lausbub", - "Lavasee", - "Leben", - "Leder", - "Leerlauf", - "Lehm", - "Lehrer", - "leihen", - "Lektüre", - "Lenker", - "Lerche", - "Leseecke", - "Leuchter", - "Lexikon", - "Libelle", - "Libido", - "Licht", - "Liebe", - "liefern", - "Liftboy", - "Limonade", - "Lineal", - "Linoleum", - "List", - "Liveband", - "Lobrede", - "locken", - "Löffel", - "Logbuch", - "Logik", - "Lohn", - "Loipe", - "Lokal", - "Lorbeer", - "Lösung", - "löten", - "Lottofee", - "Löwe", - "Luchs", - "Luder", - "Luftpost", - "Luke", - "Lümmel", - "Lunge", - "lutschen", - "Luxus", - "Macht", - "Magazin", - "Magier", - "Magnet", - "mähen", - "Mahlzeit", - "Mahnmal", - "Maibaum", - "Maisbrei", - "Makel", - "malen", - "Mammut", - "Maniküre", - "Mantel", - "Marathon", - "Marder", - "Marine", - "Marke", - "Marmor", - "Märzluft", - "Maske", - "Maßanzug", - "Maßkrug", - "Mastkorb", - "Material", - "Matratze", - "Mauerbau", - "Maulkorb", - "Mäuschen", - "Mäzen", - "Medium", - "Meinung", - "melden", - "Melodie", - "Mensch", - "Merkmal", - "Messe", - "Metall", - "Meteor", - "Methode", - "Metzger", - "Mieze", - "Milchkuh", - "Mimose", - "Minirock", - "Minute", - "mischen", - "Missetat", - "mitgehen", - "Mittag", - "Mixtape", - "Möbel", - "Modul", - "mögen", - "Möhre", - "Molch", - "Moment", - "Monat", - "Mondflug", - "Monitor", - "Monokini", - "Monster", - "Monument", - "Moorhuhn", - "Moos", - "Möpse", - "Moral", - "Mörtel", - "Motiv", - "Motorrad", - "Möwe", - "Mühe", - "Mulatte", - "Müller", - "Mumie", - "Mund", - "Münze", - "Muschel", - "Muster", - "Mythos", - "Nabel", - "Nachtzug", - "Nackedei", - "Nagel", - "Nähe", - "Nähnadel", - "Namen", - "Narbe", - "Narwal", - "Nasenbär", - "Natur", - "Nebel", - "necken", - "Neffe", - "Neigung", - "Nektar", - "Nenner", - "Neptun", - "Nerz", - "Nessel", - "Nestbau", - "Netz", - "Neubau", - "Neuerung", - "Neugier", - "nicken", - "Niere", - "Nilpferd", - "nisten", - "Nocke", - "Nomade", - "Nordmeer", - "Notdurft", - "Notstand", - "Notwehr", - "Nudismus", - "Nuss", - "Nutzhanf", - "Oase", - "Obdach", - "Oberarzt", - "Objekt", - "Oboe", - "Obsthain", - "Ochse", - "Odyssee", - "Ofenholz", - "öffnen", - "Ohnmacht", - "Ohrfeige", - "Ohrwurm", - "Ökologie", - "Oktave", - "Ölberg", - "Olive", - "Ölkrise", - "Omelett", - "Onkel", - "Oper", - "Optiker", - "Orange", - "Orchidee", - "ordnen", - "Orgasmus", - "Orkan", - "Ortskern", - "Ortung", - "Ostasien", - "Ozean", - "Paarlauf", - "Packeis", - "paddeln", - "Paket", - "Palast", - "Pandabär", - "Panik", - "Panorama", - "Panther", - "Papagei", - "Papier", - "Paprika", - "Paradies", - "Parka", - "Parodie", - "Partner", - "Passant", - "Patent", - "Patzer", - "Pause", - "Pavian", - "Pedal", - "Pegel", - "peilen", - "Perle", - "Person", - "Pfad", - "Pfau", - "Pferd", - "Pfleger", - "Physik", - "Pier", - "Pilotwal", - "Pinzette", - "Piste", - "Plakat", - "Plankton", - "Platin", - "Plombe", - "plündern", - "Pobacke", - "Pokal", - "polieren", - "Popmusik", - "Porträt", - "Posaune", - "Postamt", - "Pottwal", - "Pracht", - "Pranke", - "Preis", - "Primat", - "Prinzip", - "Protest", - "Proviant", - "Prüfung", - "Pubertät", - "Pudding", - "Pullover", - "Pulsader", - "Punkt", - "Pute", - "Putsch", - "Puzzle", - "Python", - "quaken", - "Qualle", - "Quark", - "Quellsee", - "Querkopf", - "Quitte", - "Quote", - "Rabauke", - "Rache", - "Radclub", - "Radhose", - "Radio", - "Radtour", - "Rahmen", - "Rampe", - "Randlage", - "Ranzen", - "Rapsöl", - "Raserei", - "rasten", - "Rasur", - "Rätsel", - "Raubtier", - "Raumzeit", - "Rausch", - "Reaktor", - "Realität", - "Rebell", - "Rede", - "Reetdach", - "Regatta", - "Regen", - "Rehkitz", - "Reifen", - "Reim", - "Reise", - "Reizung", - "Rekord", - "Relevanz", - "Rennboot", - "Respekt", - "Restmüll", - "retten", - "Reue", - "Revolte", - "Rhetorik", - "Rhythmus", - "Richtung", - "Riegel", - "Rindvieh", - "Rippchen", - "Ritter", - "Robbe", - "Roboter", - "Rockband", - "Rohdaten", - "Roller", - "Roman", - "röntgen", - "Rose", - "Rosskur", - "Rost", - "Rotahorn", - "Rotglut", - "Rotznase", - "Rubrik", - "Rückweg", - "Rufmord", - "Ruhe", - "Ruine", - "Rumpf", - "Runde", - "Rüstung", - "rütteln", - "Saaltür", - "Saatguts", - "Säbel", - "Sachbuch", - "Sack", - "Saft", - "sagen", - "Sahneeis", - "Salat", - "Salbe", - "Salz", - "Sammlung", - "Samt", - "Sandbank", - "Sanftmut", - "Sardine", - "Satire", - "Sattel", - "Satzbau", - "Sauerei", - "Saum", - "Säure", - "Schall", - "Scheitel", - "Schiff", - "Schlager", - "Schmied", - "Schnee", - "Scholle", - "Schrank", - "Schulbus", - "Schwan", - "Seeadler", - "Seefahrt", - "Seehund", - "Seeufer", - "segeln", - "Sehnerv", - "Seide", - "Seilzug", - "Senf", - "Sessel", - "Seufzer", - "Sexgott", - "Sichtung", - "Signal", - "Silber", - "singen", - "Sinn", - "Sirup", - "Sitzbank", - "Skandal", - "Skikurs", - "Skipper", - "Skizze", - "Smaragd", - "Socke", - "Sohn", - "Sommer", - "Songtext", - "Sorte", - "Spagat", - "Spannung", - "Spargel", - "Specht", - "Speiseöl", - "Spiegel", - "Sport", - "spülen", - "Stadtbus", - "Stall", - "Stärke", - "Stativ", - "staunen", - "Stern", - "Stiftung", - "Stollen", - "Strömung", - "Sturm", - "Substanz", - "Südalpen", - "Sumpf", - "surfen", - "Tabak", - "Tafel", - "Tagebau", - "takeln", - "Taktung", - "Talsohle", - "Tand", - "Tanzbär", - "Tapir", - "Tarantel", - "Tarnname", - "Tasse", - "Tatnacht", - "Tatsache", - "Tatze", - "Taube", - "tauchen", - "Taufpate", - "Taumel", - "Teelicht", - "Teich", - "teilen", - "Tempo", - "Tenor", - "Terrasse", - "Testflug", - "Theater", - "Thermik", - "ticken", - "Tiefflug", - "Tierart", - "Tigerhai", - "Tinte", - "Tischler", - "toben", - "Toleranz", - "Tölpel", - "Tonband", - "Topf", - "Topmodel", - "Torbogen", - "Torlinie", - "Torte", - "Tourist", - "Tragesel", - "trampeln", - "Trapez", - "Traum", - "treffen", - "Trennung", - "Treue", - "Trick", - "trimmen", - "Trödel", - "Trost", - "Trumpf", - "tüfteln", - "Turban", - "Turm", - "Übermut", - "Ufer", - "Uhrwerk", - "umarmen", - "Umbau", - "Umfeld", - "Umgang", - "Umsturz", - "Unart", - "Unfug", - "Unimog", - "Unruhe", - "Unwucht", - "Uranerz", - "Urlaub", - "Urmensch", - "Utopie", - "Vakuum", - "Valuta", - "Vandale", - "Vase", - "Vektor", - "Ventil", - "Verb", - "Verdeck", - "Verfall", - "Vergaser", - "verhexen", - "Verlag", - "Vers", - "Vesper", - "Vieh", - "Viereck", - "Vinyl", - "Virus", - "Vitrine", - "Vollblut", - "Vorbote", - "Vorrat", - "Vorsicht", - "Vulkan", - "Wachstum", - "Wade", - "Wagemut", - "Wahlen", - "Wahrheit", - "Wald", - "Walhai", - "Wallach", - "Walnuss", - "Walzer", - "wandeln", - "Wanze", - "wärmen", - "Warnruf", - "Wäsche", - "Wasser", - "Weberei", - "wechseln", - "Wegegeld", - "wehren", - "Weiher", - "Weinglas", - "Weißbier", - "Weitwurf", - "Welle", - "Weltall", - "Werkbank", - "Werwolf", - "Wetter", - "wiehern", - "Wildgans", - "Wind", - "Wohl", - "Wohnort", - "Wolf", - "Wollust", - "Wortlaut", - "Wrack", - "Wunder", - "Wurfaxt", - "Wurst", - "Yacht", - "Yeti", - "Zacke", - "Zahl", - "zähmen", - "Zahnfee", - "Zäpfchen", - "Zaster", - "Zaumzeug", - "Zebra", - "zeigen", - "Zeitlupe", - "Zellkern", - "Zeltdach", - "Zensor", - "Zerfall", - "Zeug", - "Ziege", - "Zielfoto", - "Zimteis", - "Zobel", - "Zollhund", - "Zombie", - "Zöpfe", - "Zucht", - "Zufahrt", - "Zugfahrt", - "Zugvogel", - "Zündung", - "Zweck", - "Zyklop" -] diff --git a/networks/monero/wallet/seed/src/words/en.rs b/networks/monero/wallet/seed/src/words/en.rs deleted file mode 100644 index c6f9a454e..000000000 --- a/networks/monero/wallet/seed/src/words/en.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "abbey", - "abducts", - "ability", - "ablaze", - "abnormal", - "abort", - "abrasive", - "absorb", - "abyss", - "academy", - "aces", - "aching", - "acidic", - "acoustic", - "acquire", - "across", - "actress", - "acumen", - "adapt", - "addicted", - "adept", - "adhesive", - "adjust", - "adopt", - "adrenalin", - "adult", - "adventure", - "aerial", - "afar", - "affair", - "afield", - "afloat", - "afoot", - "afraid", - "after", - "against", - "agenda", - "aggravate", - "agile", - "aglow", - "agnostic", - "agony", - "agreed", - "ahead", - "aided", - "ailments", - "aimless", - "airport", - "aisle", - "ajar", - "akin", - "alarms", - "album", - "alchemy", - "alerts", - "algebra", - "alkaline", - "alley", - "almost", - "aloof", - "alpine", - "already", - "also", - "altitude", - "alumni", - "always", - "amaze", - "ambush", - "amended", - "amidst", - "ammo", - "amnesty", - "among", - "amply", - "amused", - "anchor", - "android", - "anecdote", - "angled", - "ankle", - "annoyed", - "answers", - "antics", - "anvil", - "anxiety", - "anybody", - "apart", - "apex", - "aphid", - "aplomb", - "apology", - "apply", - "apricot", - "aptitude", - "aquarium", - "arbitrary", - "archer", - "ardent", - "arena", - "argue", - "arises", - "army", - "around", - "arrow", - "arsenic", - "artistic", - "ascend", - "ashtray", - "aside", - "asked", - "asleep", - "aspire", - "assorted", - "asylum", - "athlete", - "atlas", - "atom", - "atrium", - "attire", - "auburn", - "auctions", - "audio", - "august", - "aunt", - "austere", - "autumn", - "avatar", - "avidly", - "avoid", - "awakened", - "awesome", - "awful", - "awkward", - "awning", - "awoken", - "axes", - "axis", - "axle", - "aztec", - "azure", - "baby", - "bacon", - "badge", - "baffles", - "bagpipe", - "bailed", - "bakery", - "balding", - "bamboo", - "banjo", - "baptism", - "basin", - "batch", - "bawled", - "bays", - "because", - "beer", - "befit", - "begun", - "behind", - "being", - "below", - "bemused", - "benches", - "berries", - "bested", - "betting", - "bevel", - "beware", - "beyond", - "bias", - "bicycle", - "bids", - "bifocals", - "biggest", - "bikini", - "bimonthly", - "binocular", - "biology", - "biplane", - "birth", - "biscuit", - "bite", - "biweekly", - "blender", - "blip", - "bluntly", - "boat", - "bobsled", - "bodies", - "bogeys", - "boil", - "boldly", - "bomb", - "border", - "boss", - "both", - "bounced", - "bovine", - "bowling", - "boxes", - "boyfriend", - "broken", - "brunt", - "bubble", - "buckets", - "budget", - "buffet", - "bugs", - "building", - "bulb", - "bumper", - "bunch", - "business", - "butter", - "buying", - "buzzer", - "bygones", - "byline", - "bypass", - "cabin", - "cactus", - "cadets", - "cafe", - "cage", - "cajun", - "cake", - "calamity", - "camp", - "candy", - "casket", - "catch", - "cause", - "cavernous", - "cease", - "cedar", - "ceiling", - "cell", - "cement", - "cent", - "certain", - "chlorine", - "chrome", - "cider", - "cigar", - "cinema", - "circle", - "cistern", - "citadel", - "civilian", - "claim", - "click", - "clue", - "coal", - "cobra", - "cocoa", - "code", - "coexist", - "coffee", - "cogs", - "cohesive", - "coils", - "colony", - "comb", - "cool", - "copy", - "corrode", - "costume", - "cottage", - "cousin", - "cowl", - "criminal", - "cube", - "cucumber", - "cuddled", - "cuffs", - "cuisine", - "cunning", - "cupcake", - "custom", - "cycling", - "cylinder", - "cynical", - "dabbing", - "dads", - "daft", - "dagger", - "daily", - "damp", - "dangerous", - "dapper", - "darted", - "dash", - "dating", - "dauntless", - "dawn", - "daytime", - "dazed", - "debut", - "decay", - "dedicated", - "deepest", - "deftly", - "degrees", - "dehydrate", - "deity", - "dejected", - "delayed", - "demonstrate", - "dented", - "deodorant", - "depth", - "desk", - "devoid", - "dewdrop", - "dexterity", - "dialect", - "dice", - "diet", - "different", - "digit", - "dilute", - "dime", - "dinner", - "diode", - "diplomat", - "directed", - "distance", - "ditch", - "divers", - "dizzy", - "doctor", - "dodge", - "does", - "dogs", - "doing", - "dolphin", - "domestic", - "donuts", - "doorway", - "dormant", - "dosage", - "dotted", - "double", - "dove", - "down", - "dozen", - "dreams", - "drinks", - "drowning", - "drunk", - "drying", - "dual", - "dubbed", - "duckling", - "dude", - "duets", - "duke", - "dullness", - "dummy", - "dunes", - "duplex", - "duration", - "dusted", - "duties", - "dwarf", - "dwelt", - "dwindling", - "dying", - "dynamite", - "dyslexic", - "each", - "eagle", - "earth", - "easy", - "eating", - "eavesdrop", - "eccentric", - "echo", - "eclipse", - "economics", - "ecstatic", - "eden", - "edgy", - "edited", - "educated", - "eels", - "efficient", - "eggs", - "egotistic", - "eight", - "either", - "eject", - "elapse", - "elbow", - "eldest", - "eleven", - "elite", - "elope", - "else", - "eluded", - "emails", - "ember", - "emerge", - "emit", - "emotion", - "empty", - "emulate", - "energy", - "enforce", - "enhanced", - "enigma", - "enjoy", - "enlist", - "enmity", - "enough", - "enraged", - "ensign", - "entrance", - "envy", - "epoxy", - "equip", - "erase", - "erected", - "erosion", - "error", - "eskimos", - "espionage", - "essential", - "estate", - "etched", - "eternal", - "ethics", - "etiquette", - "evaluate", - "evenings", - "evicted", - "evolved", - "examine", - "excess", - "exhale", - "exit", - "exotic", - "exquisite", - "extra", - "exult", - "fabrics", - "factual", - "fading", - "fainted", - "faked", - "fall", - "family", - "fancy", - "farming", - "fatal", - "faulty", - "fawns", - "faxed", - "fazed", - "feast", - "february", - "federal", - "feel", - "feline", - "females", - "fences", - "ferry", - "festival", - "fetches", - "fever", - "fewest", - "fiat", - "fibula", - "fictional", - "fidget", - "fierce", - "fifteen", - "fight", - "films", - "firm", - "fishing", - "fitting", - "five", - "fixate", - "fizzle", - "fleet", - "flippant", - "flying", - "foamy", - "focus", - "foes", - "foggy", - "foiled", - "folding", - "fonts", - "foolish", - "fossil", - "fountain", - "fowls", - "foxes", - "foyer", - "framed", - "friendly", - "frown", - "fruit", - "frying", - "fudge", - "fuel", - "fugitive", - "fully", - "fuming", - "fungal", - "furnished", - "fuselage", - "future", - "fuzzy", - "gables", - "gadget", - "gags", - "gained", - "galaxy", - "gambit", - "gang", - "gasp", - "gather", - "gauze", - "gave", - "gawk", - "gaze", - "gearbox", - "gecko", - "geek", - "gels", - "gemstone", - "general", - "geometry", - "germs", - "gesture", - "getting", - "geyser", - "ghetto", - "ghost", - "giant", - "giddy", - "gifts", - "gigantic", - "gills", - "gimmick", - "ginger", - "girth", - "giving", - "glass", - "gleeful", - "glide", - "gnaw", - "gnome", - "goat", - "goblet", - "godfather", - "goes", - "goggles", - "going", - "goldfish", - "gone", - "goodbye", - "gopher", - "gorilla", - "gossip", - "gotten", - "gourmet", - "governing", - "gown", - "greater", - "grunt", - "guarded", - "guest", - "guide", - "gulp", - "gumball", - "guru", - "gusts", - "gutter", - "guys", - "gymnast", - "gypsy", - "gyrate", - "habitat", - "hacksaw", - "haggled", - "hairy", - "hamburger", - "happens", - "hashing", - "hatchet", - "haunted", - "having", - "hawk", - "haystack", - "hazard", - "hectare", - "hedgehog", - "heels", - "hefty", - "height", - "hemlock", - "hence", - "heron", - "hesitate", - "hexagon", - "hickory", - "hiding", - "highway", - "hijack", - "hiker", - "hills", - "himself", - "hinder", - "hippo", - "hire", - "history", - "hitched", - "hive", - "hoax", - "hobby", - "hockey", - "hoisting", - "hold", - "honked", - "hookup", - "hope", - "hornet", - "hospital", - "hotel", - "hounded", - "hover", - "howls", - "hubcaps", - "huddle", - "huge", - "hull", - "humid", - "hunter", - "hurried", - "husband", - "huts", - "hybrid", - "hydrogen", - "hyper", - "iceberg", - "icing", - "icon", - "identity", - "idiom", - "idled", - "idols", - "igloo", - "ignore", - "iguana", - "illness", - "imagine", - "imbalance", - "imitate", - "impel", - "inactive", - "inbound", - "incur", - "industrial", - "inexact", - "inflamed", - "ingested", - "initiate", - "injury", - "inkling", - "inline", - "inmate", - "innocent", - "inorganic", - "input", - "inquest", - "inroads", - "insult", - "intended", - "inundate", - "invoke", - "inwardly", - "ionic", - "irate", - "iris", - "irony", - "irritate", - "island", - "isolated", - "issued", - "italics", - "itches", - "items", - "itinerary", - "itself", - "ivory", - "jabbed", - "jackets", - "jaded", - "jagged", - "jailed", - "jamming", - "january", - "jargon", - "jaunt", - "javelin", - "jaws", - "jazz", - "jeans", - "jeers", - "jellyfish", - "jeopardy", - "jerseys", - "jester", - "jetting", - "jewels", - "jigsaw", - "jingle", - "jittery", - "jive", - "jobs", - "jockey", - "jogger", - "joining", - "joking", - "jolted", - "jostle", - "journal", - "joyous", - "jubilee", - "judge", - "juggled", - "juicy", - "jukebox", - "july", - "jump", - "junk", - "jury", - "justice", - "juvenile", - "kangaroo", - "karate", - "keep", - "kennel", - "kept", - "kernels", - "kettle", - "keyboard", - "kickoff", - "kidneys", - "king", - "kiosk", - "kisses", - "kitchens", - "kiwi", - "knapsack", - "knee", - "knife", - "knowledge", - "knuckle", - "koala", - "laboratory", - "ladder", - "lagoon", - "lair", - "lakes", - "lamb", - "language", - "laptop", - "large", - "last", - "later", - "launching", - "lava", - "lawsuit", - "layout", - "lazy", - "lectures", - "ledge", - "leech", - "left", - "legion", - "leisure", - "lemon", - "lending", - "leopard", - "lesson", - "lettuce", - "lexicon", - "liar", - "library", - "licks", - "lids", - "lied", - "lifestyle", - "light", - "likewise", - "lilac", - "limits", - "linen", - "lion", - "lipstick", - "liquid", - "listen", - "lively", - "loaded", - "lobster", - "locker", - "lodge", - "lofty", - "logic", - "loincloth", - "long", - "looking", - "lopped", - "lordship", - "losing", - "lottery", - "loudly", - "love", - "lower", - "loyal", - "lucky", - "luggage", - "lukewarm", - "lullaby", - "lumber", - "lunar", - "lurk", - "lush", - "luxury", - "lymph", - "lynx", - "lyrics", - "macro", - "madness", - "magically", - "mailed", - "major", - "makeup", - "malady", - "mammal", - "maps", - "masterful", - "match", - "maul", - "maverick", - "maximum", - "mayor", - "maze", - "meant", - "mechanic", - "medicate", - "meeting", - "megabyte", - "melting", - "memoir", - "menu", - "merger", - "mesh", - "metro", - "mews", - "mice", - "midst", - "mighty", - "mime", - "mirror", - "misery", - "mittens", - "mixture", - "moat", - "mobile", - "mocked", - "mohawk", - "moisture", - "molten", - "moment", - "money", - "moon", - "mops", - "morsel", - "mostly", - "motherly", - "mouth", - "movement", - "mowing", - "much", - "muddy", - "muffin", - "mugged", - "mullet", - "mumble", - "mundane", - "muppet", - "mural", - "musical", - "muzzle", - "myriad", - "mystery", - "myth", - "nabbing", - "nagged", - "nail", - "names", - "nanny", - "napkin", - "narrate", - "nasty", - "natural", - "nautical", - "navy", - "nearby", - "necklace", - "needed", - "negative", - "neither", - "neon", - "nephew", - "nerves", - "nestle", - "network", - "neutral", - "never", - "newt", - "nexus", - "nibs", - "niche", - "niece", - "nifty", - "nightly", - "nimbly", - "nineteen", - "nirvana", - "nitrogen", - "nobody", - "nocturnal", - "nodes", - "noises", - "nomad", - "noodles", - "northern", - "nostril", - "noted", - "nouns", - "novelty", - "nowhere", - "nozzle", - "nuance", - "nucleus", - "nudged", - "nugget", - "nuisance", - "null", - "number", - "nuns", - "nurse", - "nutshell", - "nylon", - "oaks", - "oars", - "oasis", - "oatmeal", - "obedient", - "object", - "obliged", - "obnoxious", - "observant", - "obtains", - "obvious", - "occur", - "ocean", - "october", - "odds", - "odometer", - "offend", - "often", - "oilfield", - "ointment", - "okay", - "older", - "olive", - "olympics", - "omega", - "omission", - "omnibus", - "onboard", - "oncoming", - "oneself", - "ongoing", - "onion", - "online", - "onslaught", - "onto", - "onward", - "oozed", - "opacity", - "opened", - "opposite", - "optical", - "opus", - "orange", - "orbit", - "orchid", - "orders", - "organs", - "origin", - "ornament", - "orphans", - "oscar", - "ostrich", - "otherwise", - "otter", - "ouch", - "ought", - "ounce", - "ourselves", - "oust", - "outbreak", - "oval", - "oven", - "owed", - "owls", - "owner", - "oxidant", - "oxygen", - "oyster", - "ozone", - "pact", - "paddles", - "pager", - "pairing", - "palace", - "pamphlet", - "pancakes", - "paper", - "paradise", - "pastry", - "patio", - "pause", - "pavements", - "pawnshop", - "payment", - "peaches", - "pebbles", - "peculiar", - "pedantic", - "peeled", - "pegs", - "pelican", - "pencil", - "people", - "pepper", - "perfect", - "pests", - "petals", - "phase", - "pheasants", - "phone", - "phrases", - "physics", - "piano", - "picked", - "pierce", - "pigment", - "piloted", - "pimple", - "pinched", - "pioneer", - "pipeline", - "pirate", - "pistons", - "pitched", - "pivot", - "pixels", - "pizza", - "playful", - "pledge", - "pliers", - "plotting", - "plus", - "plywood", - "poaching", - "pockets", - "podcast", - "poetry", - "point", - "poker", - "polar", - "ponies", - "pool", - "popular", - "portents", - "possible", - "potato", - "pouch", - "poverty", - "powder", - "pram", - "present", - "pride", - "problems", - "pruned", - "prying", - "psychic", - "public", - "puck", - "puddle", - "puffin", - "pulp", - "pumpkins", - "punch", - "puppy", - "purged", - "push", - "putty", - "puzzled", - "pylons", - "pyramid", - "python", - "queen", - "quick", - "quote", - "rabbits", - "racetrack", - "radar", - "rafts", - "rage", - "railway", - "raking", - "rally", - "ramped", - "randomly", - "rapid", - "rarest", - "rash", - "rated", - "ravine", - "rays", - "razor", - "react", - "rebel", - "recipe", - "reduce", - "reef", - "refer", - "regular", - "reheat", - "reinvest", - "rejoices", - "rekindle", - "relic", - "remedy", - "renting", - "reorder", - "repent", - "request", - "reruns", - "rest", - "return", - "reunion", - "revamp", - "rewind", - "rhino", - "rhythm", - "ribbon", - "richly", - "ridges", - "rift", - "rigid", - "rims", - "ringing", - "riots", - "ripped", - "rising", - "ritual", - "river", - "roared", - "robot", - "rockets", - "rodent", - "rogue", - "roles", - "romance", - "roomy", - "roped", - "roster", - "rotate", - "rounded", - "rover", - "rowboat", - "royal", - "ruby", - "rudely", - "ruffled", - "rugged", - "ruined", - "ruling", - "rumble", - "runway", - "rural", - "rustled", - "ruthless", - "sabotage", - "sack", - "sadness", - "safety", - "saga", - "sailor", - "sake", - "salads", - "sample", - "sanity", - "sapling", - "sarcasm", - "sash", - "satin", - "saucepan", - "saved", - "sawmill", - "saxophone", - "sayings", - "scamper", - "scenic", - "school", - "science", - "scoop", - "scrub", - "scuba", - "seasons", - "second", - "sedan", - "seeded", - "segments", - "seismic", - "selfish", - "semifinal", - "sensible", - "september", - "sequence", - "serving", - "session", - "setup", - "seventh", - "sewage", - "shackles", - "shelter", - "shipped", - "shocking", - "shrugged", - "shuffled", - "shyness", - "siblings", - "sickness", - "sidekick", - "sieve", - "sifting", - "sighting", - "silk", - "simplest", - "sincerely", - "sipped", - "siren", - "situated", - "sixteen", - "sizes", - "skater", - "skew", - "skirting", - "skulls", - "skydive", - "slackens", - "sleepless", - "slid", - "slower", - "slug", - "smash", - "smelting", - "smidgen", - "smog", - "smuggled", - "snake", - "sneeze", - "sniff", - "snout", - "snug", - "soapy", - "sober", - "soccer", - "soda", - "software", - "soggy", - "soil", - "solved", - "somewhere", - "sonic", - "soothe", - "soprano", - "sorry", - "southern", - "sovereign", - "sowed", - "soya", - "space", - "speedy", - "sphere", - "spiders", - "splendid", - "spout", - "sprig", - "spud", - "spying", - "square", - "stacking", - "stellar", - "stick", - "stockpile", - "strained", - "stunning", - "stylishly", - "subtly", - "succeed", - "suddenly", - "suede", - "suffice", - "sugar", - "suitcase", - "sulking", - "summon", - "sunken", - "superior", - "surfer", - "sushi", - "suture", - "swagger", - "swept", - "swiftly", - "sword", - "swung", - "syllabus", - "symptoms", - "syndrome", - "syringe", - "system", - "taboo", - "tacit", - "tadpoles", - "tagged", - "tail", - "taken", - "talent", - "tamper", - "tanks", - "tapestry", - "tarnished", - "tasked", - "tattoo", - "taunts", - "tavern", - "tawny", - "taxi", - "teardrop", - "technical", - "tedious", - "teeming", - "tell", - "template", - "tender", - "tepid", - "tequila", - "terminal", - "testing", - "tether", - "textbook", - "thaw", - "theatrics", - "thirsty", - "thorn", - "threaten", - "thumbs", - "thwart", - "ticket", - "tidy", - "tiers", - "tiger", - "tilt", - "timber", - "tinted", - "tipsy", - "tirade", - "tissue", - "titans", - "toaster", - "tobacco", - "today", - "toenail", - "toffee", - "together", - "toilet", - "token", - "tolerant", - "tomorrow", - "tonic", - "toolbox", - "topic", - "torch", - "tossed", - "total", - "touchy", - "towel", - "toxic", - "toyed", - "trash", - "trendy", - "tribal", - "trolling", - "truth", - "trying", - "tsunami", - "tubes", - "tucks", - "tudor", - "tuesday", - "tufts", - "tugs", - "tuition", - "tulips", - "tumbling", - "tunnel", - "turnip", - "tusks", - "tutor", - "tuxedo", - "twang", - "tweezers", - "twice", - "twofold", - "tycoon", - "typist", - "tyrant", - "ugly", - "ulcers", - "ultimate", - "umbrella", - "umpire", - "unafraid", - "unbending", - "uncle", - "under", - "uneven", - "unfit", - "ungainly", - "unhappy", - "union", - "unjustly", - "unknown", - "unlikely", - "unmask", - "unnoticed", - "unopened", - "unplugs", - "unquoted", - "unrest", - "unsafe", - "until", - "unusual", - "unveil", - "unwind", - "unzip", - "upbeat", - "upcoming", - "update", - "upgrade", - "uphill", - "upkeep", - "upload", - "upon", - "upper", - "upright", - "upstairs", - "uptight", - "upwards", - "urban", - "urchins", - "urgent", - "usage", - "useful", - "usher", - "using", - "usual", - "utensils", - "utility", - "utmost", - "utopia", - "uttered", - "vacation", - "vague", - "vain", - "value", - "vampire", - "vane", - "vapidly", - "vary", - "vastness", - "vats", - "vaults", - "vector", - "veered", - "vegan", - "vehicle", - "vein", - "velvet", - "venomous", - "verification", - "vessel", - "veteran", - "vexed", - "vials", - "vibrate", - "victim", - "video", - "viewpoint", - "vigilant", - "viking", - "village", - "vinegar", - "violin", - "vipers", - "virtual", - "visited", - "vitals", - "vivid", - "vixen", - "vocal", - "vogue", - "voice", - "volcano", - "vortex", - "voted", - "voucher", - "vowels", - "voyage", - "vulture", - "wade", - "waffle", - "wagtail", - "waist", - "waking", - "wallets", - "wanted", - "warped", - "washing", - "water", - "waveform", - "waxing", - "wayside", - "weavers", - "website", - "wedge", - "weekday", - "weird", - "welders", - "went", - "wept", - "were", - "western", - "wetsuit", - "whale", - "when", - "whipped", - "whole", - "wickets", - "width", - "wield", - "wife", - "wiggle", - "wildly", - "winter", - "wipeout", - "wiring", - "wise", - "withdrawn", - "wives", - "wizard", - "wobbly", - "woes", - "woken", - "wolf", - "womanly", - "wonders", - "woozy", - "worry", - "wounded", - "woven", - "wrap", - "wrist", - "wrong", - "yacht", - "yahoo", - "yanks", - "yard", - "yawning", - "yearbook", - "yellow", - "yesterday", - "yeti", - "yields", - "yodel", - "yoga", - "younger", - "yoyo", - "zapped", - "zeal", - "zebra", - "zero", - "zesty", - "zigzags", - "zinger", - "zippers", - "zodiac", - "zombie", - "zones", - "zoom" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/eo.rs b/networks/monero/wallet/seed/src/words/eo.rs deleted file mode 100644 index d9d6ff40e..000000000 --- a/networks/monero/wallet/seed/src/words/eo.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "abako", - "abdiki", - "abelo", - "abituriento", - "ablativo", - "abnorma", - "abonantoj", - "abrikoto", - "absoluta", - "abunda", - "acetono", - "acida", - "adapti", - "adekvata", - "adheri", - "adicii", - "adjektivo", - "administri", - "adolesko", - "adreso", - "adstringa", - "adulto", - "advokato", - "adzo", - "aeroplano", - "aferulo", - "afgana", - "afiksi", - "aflaba", - "aforismo", - "afranki", - "aftozo", - "afusto", - "agavo", - "agento", - "agiti", - "aglo", - "agmaniero", - "agnoski", - "agordo", - "agrabla", - "agtipo", - "agutio", - "aikido", - "ailanto", - "aina", - "ajatolo", - "ajgenvaloro", - "ajlobulbo", - "ajnlitera", - "ajuto", - "ajzi", - "akademio", - "akcepti", - "akeo", - "akiri", - "aklamado", - "akmeo", - "akno", - "akompani", - "akrobato", - "akselo", - "aktiva", - "akurata", - "akvofalo", - "alarmo", - "albumo", - "alcedo", - "aldoni", - "aleo", - "alfabeto", - "algo", - "alhasti", - "aligatoro", - "alkoholo", - "almozo", - "alnomo", - "alojo", - "alpinisto", - "alrigardi", - "alskribi", - "alta", - "alumeto", - "alveni", - "alzaca", - "amaso", - "ambasado", - "amdeklaro", - "amebo", - "amfibio", - "amhara", - "amiko", - "amkanto", - "amletero", - "amnestio", - "amoranto", - "amplekso", - "amrakonto", - "amsterdama", - "amuzi", - "ananaso", - "androido", - "anekdoto", - "anfrakto", - "angulo", - "anheli", - "animo", - "anjono", - "ankro", - "anonci", - "anpriskribo", - "ansero", - "antikva", - "anuitato", - "aorto", - "aparta", - "aperti", - "apika", - "aplikado", - "apneo", - "apogi", - "aprobi", - "apsido", - "apterigo", - "apudesto", - "araneo", - "arbo", - "ardeco", - "aresti", - "argilo", - "aristokrato", - "arko", - "arlekeno", - "armi", - "arniko", - "aromo", - "arpio", - "arsenalo", - "artisto", - "aruba", - "arvorto", - "asaio", - "asbesto", - "ascendi", - "asekuri", - "asfalto", - "asisti", - "askalono", - "asocio", - "aspekti", - "astro", - "asulo", - "atakonto", - "atendi", - "atingi", - "atleto", - "atmosfero", - "atomo", - "atropino", - "atuto", - "avataro", - "aventuro", - "aviadilo", - "avokado", - "azaleo", - "azbuko", - "azenino", - "azilpetanto", - "azoto", - "azteka", - "babili", - "bacilo", - "badmintono", - "bagatelo", - "bahama", - "bajoneto", - "baki", - "balai", - "bambuo", - "bani", - "baobabo", - "bapti", - "baro", - "bastono", - "batilo", - "bavara", - "bazalto", - "beata", - "bebofono", - "bedo", - "begonio", - "behaviorismo", - "bejlo", - "bekero", - "belarto", - "bemolo", - "benko", - "bereto", - "besto", - "betulo", - "bevelo", - "bezoni", - "biaso", - "biblioteko", - "biciklo", - "bidaro", - "bieno", - "bifsteko", - "bigamiulo", - "bijekcio", - "bikino", - "bildo", - "bimetalismo", - "bindi", - "biografio", - "birdo", - "biskvito", - "bitlibro", - "bivako", - "bizara", - "bjalistoka", - "blanka", - "bleki", - "blinda", - "blovi", - "blua", - "boato", - "bobsledo", - "bocvanano", - "bodisatvo", - "bofratino", - "bogefratoj", - "bohema", - "boji", - "bokalo", - "boli", - "bombono", - "bona", - "bopatrino", - "bordo", - "bosko", - "botelo", - "bovido", - "brakpleno", - "bretaro", - "brikmuro", - "broso", - "brulema", - "bubalo", - "buctrapi", - "budo", - "bufedo", - "bugio", - "bujabeso", - "buklo", - "buldozo", - "bumerango", - "bunta", - "burokrataro", - "busbileto", - "butero", - "buzuko", - "caro", - "cebo", - "ceceo", - "cedro", - "cefalo", - "cejana", - "cekumo", - "celebri", - "cemento", - "cent", - "cepo", - "certa", - "cetera", - "cezio", - "ciano", - "cibeto", - "cico", - "cidro", - "cifero", - "cigaredo", - "ciklo", - "cilindro", - "cimbalo", - "cinamo", - "cipreso", - "cirkonstanco", - "cisterno", - "citrono", - "ciumi", - "civilizado", - "colo", - "congo", - "cunamo", - "cvana", - "dabi", - "daco", - "dadaismo", - "dafodilo", - "dago", - "daimio", - "dajmono", - "daktilo", - "dalio", - "damo", - "danki", - "darmo", - "datumoj", - "dazipo", - "deadmoni", - "debeto", - "decidi", - "dedukti", - "deerigi", - "defendi", - "degeli", - "dehaki", - "deirpunkto", - "deklaracio", - "delikata", - "demandi", - "dento", - "dependi", - "derivi", - "desegni", - "detrui", - "devi", - "deziri", - "dialogo", - "dicentro", - "didaktika", - "dieto", - "diferenci", - "digesti", - "diino", - "dikfingro", - "diligenta", - "dimensio", - "dinamo", - "diodo", - "diplomo", - "direkte", - "diskuti", - "diurno", - "diversa", - "dizajno", - "dobrogitaro", - "docento", - "dogano", - "dojeno", - "doktoro", - "dolori", - "domego", - "donaci", - "dopado", - "dormi", - "dosierujo", - "dotita", - "dozeno", - "drato", - "dresi", - "drinki", - "droni", - "druido", - "duaranga", - "dubi", - "ducent", - "dudek", - "duelo", - "dufoje", - "dugongo", - "duhufa", - "duilo", - "dujare", - "dukato", - "duloka", - "dumtempe", - "dungi", - "duobla", - "dupiedulo", - "dura", - "dusenca", - "dutaga", - "duuma", - "duvalvuloj", - "duzo", - "ebena", - "eblecoj", - "ebono", - "ebria", - "eburo", - "ecaro", - "ecigi", - "ecoj", - "edelvejso", - "editoro", - "edro", - "eduki", - "edzino", - "efektiva", - "efiki", - "efloreski", - "egala", - "egeco", - "egiptologo", - "eglefino", - "egoista", - "egreto", - "ejakuli", - "ejlo", - "ekarto", - "ekbruligi", - "ekceli", - "ekde", - "ekesti", - "ekfirmao", - "ekgliti", - "ekhavi", - "ekipi", - "ekkapti", - "eklezio", - "ekmalsati", - "ekonomio", - "ekpluvi", - "ekrano", - "ekster", - "ektiri", - "ekumeno", - "ekvilibro", - "ekzemplo", - "elasta", - "elbalai", - "elcento", - "eldoni", - "elektro", - "elfari", - "elgliti", - "elhaki", - "elipso", - "elkovi", - "ellasi", - "elmeti", - "elnutri", - "elokventa", - "elparoli", - "elrevigi", - "elstari", - "elteni", - "eluzita", - "elvoki", - "elzasa", - "emajlo", - "embaraso", - "emerito", - "emfazo", - "eminenta", - "emocio", - "empiria", - "emulsio", - "enarkivigi", - "enboteligi", - "enciklopedio", - "endorfino", - "energio", - "enfermi", - "engluti", - "enhavo", - "enigmo", - "enjekcio", - "enketi", - "enlanda", - "enmeti", - "enorma", - "enplanti", - "enradiki", - "enspezo", - "entrepreni", - "enui", - "envolvi", - "enzimo", - "eono", - "eosto", - "epitafo", - "epoko", - "epriskribebla", - "epsilono", - "erari", - "erbio", - "erco", - "erekti", - "ergonomia", - "erikejo", - "ermito", - "erotika", - "erpilo", - "erupcio", - "esameno", - "escepti", - "esenco", - "eskapi", - "esotera", - "esperi", - "estonto", - "etapo", - "etendi", - "etfingro", - "etikedo", - "etlitero", - "etmakleristo", - "etnika", - "etoso", - "etradio", - "etskala", - "etullernejo", - "evakui", - "evento", - "eviti", - "evolui", - "ezoko", - "fabriko", - "facila", - "fadeno", - "fagoto", - "fajro", - "fakto", - "fali", - "familio", - "fanatiko", - "farbo", - "fasko", - "fatala", - "favora", - "fazeolo", - "febro", - "federacio", - "feino", - "fekunda", - "felo", - "femuro", - "fenestro", - "fermi", - "festi", - "fetora", - "fezo", - "fiasko", - "fibro", - "fidela", - "fiera", - "fifama", - "figuro", - "fiherbo", - "fiinsekto", - "fiksa", - "filmo", - "fimensa", - "finalo", - "fiolo", - "fiparoli", - "firmao", - "fisko", - "fitingo", - "fiuzanto", - "fivorto", - "fiziko", - "fjordo", - "flago", - "flegi", - "flirti", - "floro", - "flugi", - "fobio", - "foceno", - "foirejo", - "fojfoje", - "fokuso", - "folio", - "fomenti", - "fonto", - "formulo", - "fosforo", - "fotografi", - "fratino", - "fremda", - "friti", - "frosto", - "frua", - "ftizo", - "fuelo", - "fugo", - "fuksia", - "fulmilo", - "fumanto", - "fundamento", - "fuorto", - "furioza", - "fusilo", - "futbalo", - "fuzio", - "gabardino", - "gado", - "gaela", - "gafo", - "gagato", - "gaja", - "gaki", - "galanta", - "gamao", - "ganto", - "gapulo", - "gardi", - "gasto", - "gavio", - "gazeto", - "geamantoj", - "gebani", - "geedzeco", - "gefratoj", - "geheno", - "gejsero", - "geko", - "gelateno", - "gemisto", - "geniulo", - "geografio", - "gepardo", - "geranio", - "gestolingvo", - "geto", - "geumo", - "gibono", - "giganta", - "gildo", - "gimnastiko", - "ginekologo", - "gipsi", - "girlando", - "gistfungo", - "gitaro", - "glazuro", - "glebo", - "gliti", - "globo", - "gluti", - "gnafalio", - "gnejso", - "gnomo", - "gnuo", - "gobio", - "godetio", - "goeleto", - "gojo", - "golfludejo", - "gombo", - "gondolo", - "gorilo", - "gospelo", - "gotika", - "granda", - "greno", - "griza", - "groto", - "grupo", - "guano", - "gubernatoro", - "gudrotuko", - "gufo", - "gujavo", - "guldeno", - "gumi", - "gupio", - "guruo", - "gusto", - "guto", - "guvernistino", - "gvardio", - "gverilo", - "gvidanto", - "habitato", - "hadito", - "hafnio", - "hagiografio", - "haitiano", - "hajlo", - "hakbloko", - "halti", - "hamstro", - "hangaro", - "hapalo", - "haro", - "hasta", - "hati", - "havebla", - "hazardo", - "hebrea", - "hedero", - "hegemonio", - "hejmo", - "hektaro", - "helpi", - "hemisfero", - "heni", - "hepato", - "herbo", - "hesa", - "heterogena", - "heziti", - "hiacinto", - "hibrida", - "hidrogeno", - "hieroglifo", - "higieno", - "hihii", - "hilumo", - "himno", - "hindino", - "hiperteksto", - "hirundo", - "historio", - "hobio", - "hojli", - "hokeo", - "hologramo", - "homido", - "honesta", - "hopi", - "horizonto", - "hospitalo", - "hotelo", - "huadi", - "hubo", - "hufumo", - "hugenoto", - "hukero", - "huligano", - "humana", - "hundo", - "huoj", - "hupilo", - "hurai", - "husaro", - "hutuo", - "huzo", - "iafoje", - "iagrade", - "iamaniere", - "iarelate", - "iaspeca", - "ibekso", - "ibiso", - "idaro", - "ideala", - "idiomo", - "idolo", - "iele", - "igluo", - "ignori", - "iguamo", - "igvano", - "ikono", - "iksodo", - "ikto", - "iliaflanke", - "ilkomputilo", - "ilobreto", - "ilremedo", - "ilumini", - "imagi", - "imitado", - "imperio", - "imuna", - "incidento", - "industrio", - "inerta", - "infano", - "ingenra", - "inhali", - "iniciati", - "injekti", - "inklino", - "inokuli", - "insekto", - "inteligenta", - "inundi", - "inviti", - "ioma", - "ionosfero", - "iperito", - "ipomeo", - "irana", - "irejo", - "irigacio", - "ironio", - "isato", - "islamo", - "istempo", - "itinero", - "itrio", - "iuloke", - "iumaniere", - "iutempe", - "izolita", - "jado", - "jaguaro", - "jakto", - "jama", - "januaro", - "japano", - "jarringo", - "jazo", - "jenoj", - "jesulo", - "jetavio", - "jezuito", - "jodli", - "joviala", - "juano", - "jubileo", - "judismo", - "jufto", - "juki", - "julio", - "juneca", - "jupo", - "juristo", - "juste", - "juvelo", - "kabineto", - "kadrato", - "kafo", - "kahelo", - "kajako", - "kakao", - "kalkuli", - "kampo", - "kanti", - "kapitalo", - "karaktero", - "kaserolo", - "katapulto", - "kaverna", - "kazino", - "kebabo", - "kefiro", - "keglo", - "kejlo", - "kekso", - "kelka", - "kemio", - "kerno", - "kesto", - "kiamaniere", - "kibuco", - "kidnapi", - "kielo", - "kikero", - "kilogramo", - "kimono", - "kinejo", - "kiosko", - "kirurgo", - "kisi", - "kitelo", - "kivio", - "klavaro", - "klerulo", - "klini", - "klopodi", - "klubo", - "knabo", - "knedi", - "koalo", - "kobalto", - "kodigi", - "kofro", - "kohera", - "koincidi", - "kojoto", - "kokoso", - "koloro", - "komenci", - "kontrakto", - "kopio", - "korekte", - "kosti", - "kotono", - "kovri", - "krajono", - "kredi", - "krii", - "krom", - "kruco", - "ksantino", - "ksenono", - "ksilofono", - "ksosa", - "kubuto", - "kudri", - "kuglo", - "kuiri", - "kuko", - "kulero", - "kumuluso", - "kuneco", - "kupro", - "kuri", - "kuseno", - "kutimo", - "kuvo", - "kuzino", - "kvalito", - "kverko", - "kvin", - "kvoto", - "labori", - "laculo", - "ladbotelo", - "lafo", - "laguno", - "laikino", - "laktobovino", - "lampolumo", - "landkarto", - "laosa", - "lapono", - "larmoguto", - "lastjare", - "latitudo", - "lavejo", - "lazanjo", - "leciono", - "ledosako", - "leganto", - "lekcio", - "lemura", - "lentuga", - "leopardo", - "leporo", - "lerni", - "lesivo", - "letero", - "levilo", - "lezi", - "liano", - "libera", - "liceo", - "lieno", - "lifto", - "ligilo", - "likvoro", - "lila", - "limono", - "lingvo", - "lipo", - "lirika", - "listo", - "literatura", - "liveri", - "lobio", - "logika", - "lojala", - "lokalo", - "longa", - "lordo", - "lotado", - "loza", - "luanto", - "lubriki", - "lucida", - "ludema", - "luigi", - "lukso", - "luli", - "lumbilda", - "lunde", - "lupago", - "lustro", - "lutilo", - "luzerno", - "maato", - "maceri", - "madono", - "mafiano", - "magazeno", - "mahometano", - "maizo", - "majstro", - "maketo", - "malgranda", - "mamo", - "mandareno", - "maorio", - "mapigi", - "marini", - "masko", - "mateno", - "mazuto", - "meandro", - "meblo", - "mecenato", - "medialo", - "mefito", - "megafono", - "mejlo", - "mekanika", - "melodia", - "membro", - "mendi", - "mergi", - "mespilo", - "metoda", - "mevo", - "mezuri", - "miaflanke", - "micelio", - "mielo", - "migdalo", - "mikrofilmo", - "militi", - "mimiko", - "mineralo", - "miopa", - "miri", - "mistera", - "mitralo", - "mizeri", - "mjelo", - "mnemoniko", - "mobilizi", - "mocio", - "moderna", - "mohajro", - "mokadi", - "molaro", - "momento", - "monero", - "mopso", - "mordi", - "moskito", - "motoro", - "movimento", - "mozaiko", - "mueli", - "mukozo", - "muldi", - "mumio", - "munti", - "muro", - "muskolo", - "mutacio", - "muzikisto", - "nabo", - "nacio", - "nadlo", - "nafto", - "naiva", - "najbaro", - "nanometro", - "napo", - "narciso", - "naski", - "naturo", - "navigi", - "naztruo", - "neatendite", - "nebulo", - "necesa", - "nedankinde", - "neebla", - "nefari", - "negoco", - "nehavi", - "neimagebla", - "nektaro", - "nelonga", - "nematura", - "nenia", - "neordinara", - "nepra", - "nervuro", - "nesto", - "nete", - "neulo", - "nevino", - "nifo", - "nigra", - "nihilisto", - "nikotino", - "nilono", - "nimfeo", - "nitrogeno", - "nivelo", - "nobla", - "nocio", - "nodozo", - "nokto", - "nomkarto", - "norda", - "nostalgio", - "notbloko", - "novico", - "nuanco", - "nuboza", - "nuda", - "nugato", - "nuklea", - "nuligi", - "numero", - "nuntempe", - "nupto", - "nura", - "nutri", - "oazo", - "obei", - "objekto", - "oblikva", - "obolo", - "observi", - "obtuza", - "obuso", - "oceano", - "odekolono", - "odori", - "oferti", - "oficiala", - "ofsajdo", - "ofte", - "ogivo", - "ogro", - "ojstredoj", - "okaze", - "okcidenta", - "okro", - "oksido", - "oktobro", - "okulo", - "oldulo", - "oleo", - "olivo", - "omaro", - "ombro", - "omego", - "omikrono", - "omleto", - "omnibuso", - "onagro", - "ondo", - "oneco", - "onidire", - "onklino", - "onlajna", - "onomatopeo", - "ontologio", - "opaka", - "operacii", - "opinii", - "oportuna", - "opresi", - "optimisto", - "oratoro", - "orbito", - "ordinara", - "orelo", - "orfino", - "organizi", - "orienta", - "orkestro", - "orlo", - "orminejo", - "ornami", - "ortangulo", - "orumi", - "oscedi", - "osmozo", - "ostocerbo", - "ovalo", - "ovingo", - "ovoblanko", - "ovri", - "ovulado", - "ozono", - "pacama", - "padeli", - "pafilo", - "pagigi", - "pajlo", - "paketo", - "palaco", - "pampelmo", - "pantalono", - "papero", - "paroli", - "pasejo", - "patro", - "pavimo", - "peco", - "pedalo", - "peklita", - "pelikano", - "pensiono", - "peplomo", - "pesilo", - "petanto", - "pezoforto", - "piano", - "picejo", - "piede", - "pigmento", - "pikema", - "pilkoludo", - "pimento", - "pinglo", - "pioniro", - "pipromento", - "pirato", - "pistolo", - "pitoreska", - "piulo", - "pivoti", - "pizango", - "planko", - "plektita", - "plibonigi", - "ploradi", - "plurlingva", - "pobo", - "podio", - "poeto", - "pogranda", - "pohora", - "pokalo", - "politekniko", - "pomarbo", - "ponevosto", - "populara", - "porcelana", - "postkompreno", - "poteto", - "poviga", - "pozitiva", - "prapatroj", - "precize", - "pridemandi", - "probable", - "pruntanto", - "psalmo", - "psikologio", - "psoriazo", - "pterido", - "publiko", - "pudro", - "pufo", - "pugnobato", - "pulovero", - "pumpi", - "punkto", - "pupo", - "pureo", - "puso", - "putrema", - "puzlo", - "rabate", - "racionala", - "radiko", - "rafinado", - "raguo", - "rajto", - "rakonti", - "ralio", - "rampi", - "rando", - "rapida", - "rastruma", - "ratifiki", - "raviolo", - "razeno", - "reakcio", - "rebildo", - "recepto", - "redakti", - "reenigi", - "reformi", - "regiono", - "rehavi", - "reinspekti", - "rejesi", - "reklamo", - "relativa", - "rememori", - "renkonti", - "reorganizado", - "reprezenti", - "respondi", - "retumilo", - "reuzebla", - "revidi", - "rezulti", - "rialo", - "ribeli", - "ricevi", - "ridiga", - "rifuginto", - "rigardi", - "rikolti", - "rilati", - "rimarki", - "rinocero", - "ripozi", - "riski", - "ritmo", - "rivero", - "rizokampo", - "roboto", - "rododendro", - "rojo", - "rokmuziko", - "rolvorto", - "romantika", - "ronroni", - "rosino", - "rotondo", - "rovero", - "rozeto", - "rubando", - "rudimenta", - "rufa", - "rugbeo", - "ruino", - "ruleto", - "rumoro", - "runo", - "rupio", - "rura", - "rustimuna", - "ruzulo", - "sabato", - "sadismo", - "safario", - "sagaca", - "sakfluto", - "salti", - "samtage", - "sandalo", - "sapejo", - "sarongo", - "satelito", - "savano", - "sbiro", - "sciado", - "seanco", - "sebo", - "sedativo", - "segligno", - "sekretario", - "selektiva", - "semajno", - "senpeza", - "separeo", - "servilo", - "sesangulo", - "setli", - "seurigi", - "severa", - "sezono", - "sfagno", - "sfero", - "sfinkso", - "siatempe", - "siblado", - "sidejo", - "siesto", - "sifono", - "signalo", - "siklo", - "silenti", - "simpla", - "sinjoro", - "siropo", - "sistemo", - "situacio", - "siverto", - "sizifa", - "skatolo", - "skemo", - "skianto", - "sklavo", - "skorpio", - "skribisto", - "skulpti", - "skvamo", - "slango", - "sledeto", - "sliparo", - "smeraldo", - "smirgi", - "smokingo", - "smuto", - "snoba", - "snufegi", - "sobra", - "sociano", - "sodakvo", - "sofo", - "soifi", - "sojlo", - "soklo", - "soldato", - "somero", - "sonilo", - "sopiri", - "sorto", - "soulo", - "soveto", - "sparkado", - "speciala", - "spiri", - "splito", - "sporto", - "sprita", - "spuro", - "stabila", - "stelfiguro", - "stimulo", - "stomako", - "strato", - "studanto", - "subgrupo", - "suden", - "suferanta", - "sugesti", - "suito", - "sukero", - "sulko", - "sume", - "sunlumo", - "super", - "surskribeto", - "suspekti", - "suturo", - "svati", - "svenfali", - "svingi", - "svopo", - "tabako", - "taglumo", - "tajloro", - "taksimetro", - "talento", - "tamen", - "tanko", - "taoismo", - "tapioko", - "tarifo", - "tasko", - "tatui", - "taverno", - "teatro", - "tedlaboro", - "tegmento", - "tehoro", - "teknika", - "telefono", - "tempo", - "tenisejo", - "teorie", - "teraso", - "testudo", - "tetablo", - "teujo", - "tezo", - "tialo", - "tibio", - "tielnomata", - "tifono", - "tigro", - "tikli", - "timida", - "tinkturo", - "tiom", - "tiparo", - "tirkesto", - "titolo", - "tiutempe", - "tizano", - "tobogano", - "tofeo", - "togo", - "toksa", - "tolerema", - "tombolo", - "tondri", - "topografio", - "tordeti", - "tosti", - "totalo", - "traduko", - "tredi", - "triangulo", - "tropika", - "trumpeto", - "tualeto", - "tubisto", - "tufgrebo", - "tuja", - "tukano", - "tulipo", - "tumulto", - "tunelo", - "turisto", - "tusi", - "tutmonda", - "tvisto", - "udono", - "uesto", - "ukazo", - "ukelelo", - "ulcero", - "ulmo", - "ultimato", - "ululi", - "umbiliko", - "unco", - "ungego", - "uniformo", - "unkti", - "unukolora", - "uragano", - "urbano", - "uretro", - "urino", - "ursido", - "uskleco", - "usonigi", - "utero", - "utila", - "utopia", - "uverturo", - "uzadi", - "uzeblo", - "uzino", - "uzkutimo", - "uzofini", - "uzurpi", - "uzvaloro", - "vadejo", - "vafleto", - "vagono", - "vahabismo", - "vajco", - "vakcino", - "valoro", - "vampiro", - "vangharoj", - "vaporo", - "varma", - "vasta", - "vato", - "vazaro", - "veaspekta", - "vedismo", - "vegetalo", - "vehiklo", - "vejno", - "vekita", - "velstango", - "vemieno", - "vendi", - "vepro", - "verando", - "vespero", - "veturi", - "veziko", - "viando", - "vibri", - "vico", - "videbla", - "vifio", - "vigla", - "viktimo", - "vila", - "vimeno", - "vintro", - "violo", - "vippuno", - "virtuala", - "viskoza", - "vitro", - "viveca", - "viziti", - "vobli", - "vodko", - "vojeto", - "vokegi", - "volbo", - "vomema", - "vono", - "vortaro", - "vosto", - "voti", - "vrako", - "vringi", - "vualo", - "vulkano", - "vundo", - "vuvuzelo", - "zamenhofa", - "zapi", - "zebro", - "zefiro", - "zeloto", - "zenismo", - "zeolito", - "zepelino", - "zeto", - "zigzagi", - "zinko", - "zipo", - "zirkonio", - "zodiako", - "zoeto", - "zombio", - "zono", - "zoologio", - "zorgi", - "zukino", - "zumilo" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/es.rs b/networks/monero/wallet/seed/src/words/es.rs deleted file mode 100644 index 09fb346df..000000000 --- a/networks/monero/wallet/seed/src/words/es.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "ábaco", - "abdomen", - "abeja", - "abierto", - "abogado", - "abono", - "aborto", - "abrazo", - "abrir", - "abuelo", - "abuso", - "acabar", - "academia", - "acceso", - "acción", - "aceite", - "acelga", - "acento", - "aceptar", - "ácido", - "aclarar", - "acné", - "acoger", - "acoso", - "activo", - "acto", - "actriz", - "actuar", - "acudir", - "acuerdo", - "acusar", - "adicto", - "admitir", - "adoptar", - "adorno", - "aduana", - "adulto", - "aéreo", - "afectar", - "afición", - "afinar", - "afirmar", - "ágil", - "agitar", - "agonía", - "agosto", - "agotar", - "agregar", - "agrio", - "agua", - "agudo", - "águila", - "aguja", - "ahogo", - "ahorro", - "aire", - "aislar", - "ajedrez", - "ajeno", - "ajuste", - "alacrán", - "alambre", - "alarma", - "alba", - "álbum", - "alcalde", - "aldea", - "alegre", - "alejar", - "alerta", - "aleta", - "alfiler", - "alga", - "algodón", - "aliado", - "aliento", - "alivio", - "alma", - "almeja", - "almíbar", - "altar", - "alteza", - "altivo", - "alto", - "altura", - "alumno", - "alzar", - "amable", - "amante", - "amapola", - "amargo", - "amasar", - "ámbar", - "ámbito", - "ameno", - "amigo", - "amistad", - "amor", - "amparo", - "amplio", - "ancho", - "anciano", - "ancla", - "andar", - "andén", - "anemia", - "ángulo", - "anillo", - "ánimo", - "anís", - "anotar", - "antena", - "antiguo", - "antojo", - "anual", - "anular", - "anuncio", - "añadir", - "añejo", - "año", - "apagar", - "aparato", - "apetito", - "apio", - "aplicar", - "apodo", - "aporte", - "apoyo", - "aprender", - "aprobar", - "apuesta", - "apuro", - "arado", - "araña", - "arar", - "árbitro", - "árbol", - "arbusto", - "archivo", - "arco", - "arder", - "ardilla", - "arduo", - "área", - "árido", - "aries", - "armonía", - "arnés", - "aroma", - "arpa", - "arpón", - "arreglo", - "arroz", - "arruga", - "arte", - "artista", - "asa", - "asado", - "asalto", - "ascenso", - "asegurar", - "aseo", - "asesor", - "asiento", - "asilo", - "asistir", - "asno", - "asombro", - "áspero", - "astilla", - "astro", - "astuto", - "asumir", - "asunto", - "atajo", - "ataque", - "atar", - "atento", - "ateo", - "ático", - "atleta", - "átomo", - "atraer", - "atroz", - "atún", - "audaz", - "audio", - "auge", - "aula", - "aumento", - "ausente", - "autor", - "aval", - "avance", - "avaro", - "ave", - "avellana", - "avena", - "avestruz", - "avión", - "aviso", - "ayer", - "ayuda", - "ayuno", - "azafrán", - "azar", - "azote", - "azúcar", - "azufre", - "azul", - "baba", - "babor", - "bache", - "bahía", - "baile", - "bajar", - "balanza", - "balcón", - "balde", - "bambú", - "banco", - "banda", - "baño", - "barba", - "barco", - "barniz", - "barro", - "báscula", - "bastón", - "basura", - "batalla", - "batería", - "batir", - "batuta", - "baúl", - "bazar", - "bebé", - "bebida", - "bello", - "besar", - "beso", - "bestia", - "bicho", - "bien", - "bingo", - "blanco", - "bloque", - "blusa", - "boa", - "bobina", - "bobo", - "boca", - "bocina", - "boda", - "bodega", - "boina", - "bola", - "bolero", - "bolsa", - "bomba", - "bondad", - "bonito", - "bono", - "bonsái", - "borde", - "borrar", - "bosque", - "bote", - "botín", - "bóveda", - "bozal", - "bravo", - "brazo", - "brecha", - "breve", - "brillo", - "brinco", - "brisa", - "broca", - "broma", - "bronce", - "brote", - "bruja", - "brusco", - "bruto", - "buceo", - "bucle", - "bueno", - "buey", - "bufanda", - "bufón", - "búho", - "buitre", - "bulto", - "burbuja", - "burla", - "burro", - "buscar", - "butaca", - "buzón", - "caballo", - "cabeza", - "cabina", - "cabra", - "cacao", - "cadáver", - "cadena", - "caer", - "café", - "caída", - "caimán", - "caja", - "cajón", - "cal", - "calamar", - "calcio", - "caldo", - "calidad", - "calle", - "calma", - "calor", - "calvo", - "cama", - "cambio", - "camello", - "camino", - "campo", - "cáncer", - "candil", - "canela", - "canguro", - "canica", - "canto", - "caña", - "cañón", - "caoba", - "caos", - "capaz", - "capitán", - "capote", - "captar", - "capucha", - "cara", - "carbón", - "cárcel", - "careta", - "carga", - "cariño", - "carne", - "carpeta", - "carro", - "carta", - "casa", - "casco", - "casero", - "caspa", - "castor", - "catorce", - "catre", - "caudal", - "causa", - "cazo", - "cebolla", - "ceder", - "cedro", - "celda", - "célebre", - "celoso", - "célula", - "cemento", - "ceniza", - "centro", - "cerca", - "cerdo", - "cereza", - "cero", - "cerrar", - "certeza", - "césped", - "cetro", - "chacal", - "chaleco", - "champú", - "chancla", - "chapa", - "charla", - "chico", - "chiste", - "chivo", - "choque", - "choza", - "chuleta", - "chupar", - "ciclón", - "ciego", - "cielo", - "cien", - "cierto", - "cifra", - "cigarro", - "cima", - "cinco", - "cine", - "cinta", - "ciprés", - "circo", - "ciruela", - "cisne", - "cita", - "ciudad", - "clamor", - "clan", - "claro", - "clase", - "clave", - "cliente", - "clima", - "clínica", - "cobre", - "cocción", - "cochino", - "cocina", - "coco", - "código", - "codo", - "cofre", - "coger", - "cohete", - "cojín", - "cojo", - "cola", - "colcha", - "colegio", - "colgar", - "colina", - "collar", - "colmo", - "columna", - "combate", - "comer", - "comida", - "cómodo", - "compra", - "conde", - "conejo", - "conga", - "conocer", - "consejo", - "contar", - "copa", - "copia", - "corazón", - "corbata", - "corcho", - "cordón", - "corona", - "correr", - "coser", - "cosmos", - "costa", - "cráneo", - "cráter", - "crear", - "crecer", - "creído", - "crema", - "cría", - "crimen", - "cripta", - "crisis", - "cromo", - "crónica", - "croqueta", - "crudo", - "cruz", - "cuadro", - "cuarto", - "cuatro", - "cubo", - "cubrir", - "cuchara", - "cuello", - "cuento", - "cuerda", - "cuesta", - "cueva", - "cuidar", - "culebra", - "culpa", - "culto", - "cumbre", - "cumplir", - "cuna", - "cuneta", - "cuota", - "cupón", - "cúpula", - "curar", - "curioso", - "curso", - "curva", - "cutis", - "dama", - "danza", - "dar", - "dardo", - "dátil", - "deber", - "débil", - "década", - "decir", - "dedo", - "defensa", - "definir", - "dejar", - "delfín", - "delgado", - "delito", - "demora", - "denso", - "dental", - "deporte", - "derecho", - "derrota", - "desayuno", - "deseo", - "desfile", - "desnudo", - "destino", - "desvío", - "detalle", - "detener", - "deuda", - "día", - "diablo", - "diadema", - "diamante", - "diana", - "diario", - "dibujo", - "dictar", - "diente", - "dieta", - "diez", - "difícil", - "digno", - "dilema", - "diluir", - "dinero", - "directo", - "dirigir", - "disco", - "diseño", - "disfraz", - "diva", - "divino", - "doble", - "doce", - "dolor", - "domingo", - "don", - "donar", - "dorado", - "dormir", - "dorso", - "dos", - "dosis", - "dragón", - "droga", - "ducha", - "duda", - "duelo", - "dueño", - "dulce", - "dúo", - "duque", - "durar", - "dureza", - "duro", - "ébano", - "ebrio", - "echar", - "eco", - "ecuador", - "edad", - "edición", - "edificio", - "editor", - "educar", - "efecto", - "eficaz", - "eje", - "ejemplo", - "elefante", - "elegir", - "elemento", - "elevar", - "elipse", - "élite", - "elixir", - "elogio", - "eludir", - "embudo", - "emitir", - "emoción", - "empate", - "empeño", - "empleo", - "empresa", - "enano", - "encargo", - "enchufe", - "encía", - "enemigo", - "enero", - "enfado", - "enfermo", - "engaño", - "enigma", - "enlace", - "enorme", - "enredo", - "ensayo", - "enseñar", - "entero", - "entrar", - "envase", - "envío", - "época", - "equipo", - "erizo", - "escala", - "escena", - "escolar", - "escribir", - "escudo", - "esencia", - "esfera", - "esfuerzo", - "espada", - "espejo", - "espía", - "esposa", - "espuma", - "esquí", - "estar", - "este", - "estilo", - "estufa", - "etapa", - "eterno", - "ética", - "etnia", - "evadir", - "evaluar", - "evento", - "evitar", - "exacto", - "examen", - "exceso", - "excusa", - "exento", - "exigir", - "exilio", - "existir", - "éxito", - "experto", - "explicar", - "exponer", - "extremo", - "fábrica", - "fábula", - "fachada", - "fácil", - "factor", - "faena", - "faja", - "falda", - "fallo", - "falso", - "faltar", - "fama", - "familia", - "famoso", - "faraón", - "farmacia", - "farol", - "farsa", - "fase", - "fatiga", - "fauna", - "favor", - "fax", - "febrero", - "fecha", - "feliz", - "feo", - "feria", - "feroz", - "fértil", - "fervor", - "festín", - "fiable", - "fianza", - "fiar", - "fibra", - "ficción", - "ficha", - "fideo", - "fiebre", - "fiel", - "fiera", - "fiesta", - "figura", - "fijar", - "fijo", - "fila", - "filete", - "filial", - "filtro", - "fin", - "finca", - "fingir", - "finito", - "firma", - "flaco", - "flauta", - "flecha", - "flor", - "flota", - "fluir", - "flujo", - "flúor", - "fobia", - "foca", - "fogata", - "fogón", - "folio", - "folleto", - "fondo", - "forma", - "forro", - "fortuna", - "forzar", - "fosa", - "foto", - "fracaso", - "frágil", - "franja", - "frase", - "fraude", - "freír", - "freno", - "fresa", - "frío", - "frito", - "fruta", - "fuego", - "fuente", - "fuerza", - "fuga", - "fumar", - "función", - "funda", - "furgón", - "furia", - "fusil", - "fútbol", - "futuro", - "gacela", - "gafas", - "gaita", - "gajo", - "gala", - "galería", - "gallo", - "gamba", - "ganar", - "gancho", - "ganga", - "ganso", - "garaje", - "garza", - "gasolina", - "gastar", - "gato", - "gavilán", - "gemelo", - "gemir", - "gen", - "género", - "genio", - "gente", - "geranio", - "gerente", - "germen", - "gesto", - "gigante", - "gimnasio", - "girar", - "giro", - "glaciar", - "globo", - "gloria", - "gol", - "golfo", - "goloso", - "golpe", - "goma", - "gordo", - "gorila", - "gorra", - "gota", - "goteo", - "gozar", - "grada", - "gráfico", - "grano", - "grasa", - "gratis", - "grave", - "grieta", - "grillo", - "gripe", - "gris", - "grito", - "grosor", - "grúa", - "grueso", - "grumo", - "grupo", - "guante", - "guapo", - "guardia", - "guerra", - "guía", - "guiño", - "guion", - "guiso", - "guitarra", - "gusano", - "gustar", - "haber", - "hábil", - "hablar", - "hacer", - "hacha", - "hada", - "hallar", - "hamaca", - "harina", - "haz", - "hazaña", - "hebilla", - "hebra", - "hecho", - "helado", - "helio", - "hembra", - "herir", - "hermano", - "héroe", - "hervir", - "hielo", - "hierro", - "hígado", - "higiene", - "hijo", - "himno", - "historia", - "hocico", - "hogar", - "hoguera", - "hoja", - "hombre", - "hongo", - "honor", - "honra", - "hora", - "hormiga", - "horno", - "hostil", - "hoyo", - "hueco", - "huelga", - "huerta", - "hueso", - "huevo", - "huida", - "huir", - "humano", - "húmedo", - "humilde", - "humo", - "hundir", - "huracán", - "hurto", - "icono", - "ideal", - "idioma", - "ídolo", - "iglesia", - "iglú", - "igual", - "ilegal", - "ilusión", - "imagen", - "imán", - "imitar", - "impar", - "imperio", - "imponer", - "impulso", - "incapaz", - "índice", - "inerte", - "infiel", - "informe", - "ingenio", - "inicio", - "inmenso", - "inmune", - "innato", - "insecto", - "instante", - "interés", - "íntimo", - "intuir", - "inútil", - "invierno", - "ira", - "iris", - "ironía", - "isla", - "islote", - "jabalí", - "jabón", - "jamón", - "jarabe", - "jardín", - "jarra", - "jaula", - "jazmín", - "jefe", - "jeringa", - "jinete", - "jornada", - "joroba", - "joven", - "joya", - "juerga", - "jueves", - "juez", - "jugador", - "jugo", - "juguete", - "juicio", - "junco", - "jungla", - "junio", - "juntar", - "júpiter", - "jurar", - "justo", - "juvenil", - "juzgar", - "kilo", - "koala", - "labio", - "lacio", - "lacra", - "lado", - "ladrón", - "lagarto", - "lágrima", - "laguna", - "laico", - "lamer", - "lámina", - "lámpara", - "lana", - "lancha", - "langosta", - "lanza", - "lápiz", - "largo", - "larva", - "lástima", - "lata", - "látex", - "latir", - "laurel", - "lavar", - "lazo", - "leal", - "lección", - "leche", - "lector", - "leer", - "legión", - "legumbre", - "lejano", - "lengua", - "lento", - "leña", - "león", - "leopardo", - "lesión", - "letal", - "letra", - "leve", - "leyenda", - "libertad", - "libro", - "licor", - "líder", - "lidiar", - "lienzo", - "liga", - "ligero", - "lima", - "límite", - "limón", - "limpio", - "lince", - "lindo", - "línea", - "lingote", - "lino", - "linterna", - "líquido", - "liso", - "lista", - "litera", - "litio", - "litro", - "llaga", - "llama", - "llanto", - "llave", - "llegar", - "llenar", - "llevar", - "llorar", - "llover", - "lluvia", - "lobo", - "loción", - "loco", - "locura", - "lógica", - "logro", - "lombriz", - "lomo", - "lonja", - "lote", - "lucha", - "lucir", - "lugar", - "lujo", - "luna", - "lunes", - "lupa", - "lustro", - "luto", - "luz", - "maceta", - "macho", - "madera", - "madre", - "maduro", - "maestro", - "mafia", - "magia", - "mago", - "maíz", - "maldad", - "maleta", - "malla", - "malo", - "mamá", - "mambo", - "mamut", - "manco", - "mando", - "manejar", - "manga", - "maniquí", - "manjar", - "mano", - "manso", - "manta", - "mañana", - "mapa", - "máquina", - "mar", - "marco", - "marea", - "marfil", - "margen", - "marido", - "mármol", - "marrón", - "martes", - "marzo", - "masa", - "máscara", - "masivo", - "matar", - "materia", - "matiz", - "matriz", - "máximo", - "mayor", - "mazorca", - "mecha", - "medalla", - "medio", - "médula", - "mejilla", - "mejor", - "melena", - "melón", - "memoria", - "menor", - "mensaje", - "mente", - "menú", - "mercado", - "merengue", - "mérito", - "mes", - "mesón", - "meta", - "meter", - "método", - "metro", - "mezcla", - "miedo", - "miel", - "miembro", - "miga", - "mil", - "milagro", - "militar", - "millón", - "mimo", - "mina", - "minero", - "mínimo", - "minuto", - "miope", - "mirar", - "misa", - "miseria", - "misil", - "mismo", - "mitad", - "mito", - "mochila", - "moción", - "moda", - "modelo", - "moho", - "mojar", - "molde", - "moler", - "molino", - "momento", - "momia", - "monarca", - "moneda", - "monja", - "monto", - "moño", - "morada", - "morder", - "moreno", - "morir", - "morro", - "morsa", - "mortal", - "mosca", - "mostrar", - "motivo", - "mover", - "móvil", - "mozo", - "mucho", - "mudar", - "mueble", - "muela", - "muerte", - "muestra", - "mugre", - "mujer", - "mula", - "muleta", - "multa", - "mundo", - "muñeca", - "mural", - "muro", - "músculo", - "museo", - "musgo", - "música", - "muslo", - "nácar", - "nación", - "nadar", - "naipe", - "naranja", - "nariz", - "narrar", - "nasal", - "natal", - "nativo", - "natural", - "náusea", - "naval", - "nave", - "navidad", - "necio", - "néctar", - "negar", - "negocio", - "negro", - "neón", - "nervio", - "neto", - "neutro", - "nevar", - "nevera", - "nicho", - "nido", - "niebla", - "nieto", - "niñez", - "niño", - "nítido", - "nivel", - "nobleza", - "noche", - "nómina", - "noria", - "norma", - "norte", - "nota", - "noticia", - "novato", - "novela", - "novio", - "nube", - "nuca", - "núcleo", - "nudillo", - "nudo", - "nuera", - "nueve", - "nuez", - "nulo", - "número", - "nutria", - "oasis", - "obeso", - "obispo", - "objeto", - "obra", - "obrero", - "observar", - "obtener", - "obvio", - "oca", - "ocaso", - "océano", - "ochenta", - "ocho", - "ocio", - "ocre", - "octavo", - "octubre", - "oculto", - "ocupar", - "ocurrir", - "odiar", - "odio", - "odisea", - "oeste", - "ofensa", - "oferta", - "oficio", - "ofrecer", - "ogro", - "oído", - "oír", - "ojo", - "ola", - "oleada", - "olfato", - "olivo", - "olla", - "olmo", - "olor", - "olvido", - "ombligo", - "onda", - "onza", - "opaco", - "opción", - "ópera", - "opinar", - "oponer", - "optar", - "óptica", - "opuesto", - "oración", - "orador", - "oral", - "órbita", - "orca", - "orden", - "oreja", - "órgano", - "orgía", - "orgullo", - "oriente", - "origen", - "orilla", - "oro", - "orquesta", - "oruga", - "osadía", - "oscuro", - "osezno", - "oso", - "ostra", - "otoño", - "otro", - "oveja", - "óvulo", - "óxido", - "oxígeno", - "oyente", - "ozono", - "pacto", - "padre", - "paella", - "página", - "pago", - "país", - "pájaro", - "palabra", - "palco", - "paleta", - "pálido", - "palma", - "paloma", - "palpar", - "pan", - "panal", - "pánico", - "pantera", - "pañuelo", - "papá", - "papel", - "papilla", - "paquete", - "parar", - "parcela", - "pared", - "parir", - "paro", - "párpado", - "parque", - "párrafo", - "parte", - "pasar", - "paseo", - "pasión", - "paso", - "pasta", - "pata", - "patio", - "patria", - "pausa", - "pauta", - "pavo", - "payaso", - "peatón", - "pecado", - "pecera", - "pecho", - "pedal", - "pedir", - "pegar", - "peine", - "pelar", - "peldaño", - "pelea", - "peligro", - "pellejo", - "pelo", - "peluca", - "pena", - "pensar", - "peñón", - "peón", - "peor", - "pepino", - "pequeño", - "pera", - "percha", - "perder", - "pereza", - "perfil", - "perico", - "perla", - "permiso", - "perro", - "persona", - "pesa", - "pesca", - "pésimo", - "pestaña", - "pétalo", - "petróleo", - "pez", - "pezuña", - "picar", - "pichón", - "pie", - "piedra", - "pierna", - "pieza", - "pijama", - "pilar", - "piloto", - "pimienta", - "pino", - "pintor", - "pinza", - "piña", - "piojo", - "pipa", - "pirata", - "pisar", - "piscina", - "piso", - "pista", - "pitón", - "pizca", - "placa", - "plan", - "plata", - "playa", - "plaza", - "pleito", - "pleno", - "plomo", - "pluma", - "plural", - "pobre", - "poco", - "poder", - "podio", - "poema", - "poesía", - "poeta", - "polen", - "policía", - "pollo", - "polvo", - "pomada", - "pomelo", - "pomo", - "pompa", - "poner", - "porción", - "portal", - "posada", - "poseer", - "posible", - "poste", - "potencia", - "potro", - "pozo", - "prado", - "precoz", - "pregunta", - "premio", - "prensa", - "preso", - "previo", - "primo", - "príncipe", - "prisión", - "privar", - "proa", - "probar", - "proceso", - "producto", - "proeza", - "profesor", - "programa", - "prole", - "promesa", - "pronto", - "propio", - "próximo", - "prueba", - "público", - "puchero", - "pudor", - "pueblo", - "puerta", - "puesto", - "pulga", - "pulir", - "pulmón", - "pulpo", - "pulso", - "puma", - "punto", - "puñal", - "puño", - "pupa", - "pupila", - "puré", - "quedar", - "queja", - "quemar", - "querer", - "queso", - "quieto", - "química", - "quince", - "quitar", - "rábano", - "rabia", - "rabo", - "ración", - "radical", - "raíz", - "rama", - "rampa", - "rancho", - "rango", - "rapaz", - "rápido", - "rapto", - "rasgo", - "raspa", - "rato", - "rayo", - "raza", - "razón", - "reacción", - "realidad", - "rebaño", - "rebote", - "recaer", - "receta", - "rechazo", - "recoger", - "recreo", - "recto", - "recurso", - "red", - "redondo", - "reducir", - "reflejo", - "reforma", - "refrán", - "refugio", - "regalo", - "regir", - "regla", - "regreso", - "rehén", - "reino", - "reír", - "reja", - "relato", - "relevo", - "relieve", - "relleno", - "reloj", - "remar", - "remedio", - "remo", - "rencor", - "rendir", - "renta", - "reparto", - "repetir", - "reposo", - "reptil", - "res", - "rescate", - "resina", - "respeto", - "resto", - "resumen", - "retiro", - "retorno", - "retrato", - "reunir", - "revés", - "revista", - "rey", - "rezar", - "rico", - "riego", - "rienda", - "riesgo", - "rifa", - "rígido", - "rigor", - "rincón", - "riñón", - "río", - "riqueza", - "risa", - "ritmo", - "rito" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/fr.rs b/networks/monero/wallet/seed/src/words/fr.rs deleted file mode 100644 index 338eeb387..000000000 --- a/networks/monero/wallet/seed/src/words/fr.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "abandon", - "abattre", - "aboi", - "abolir", - "aborder", - "abri", - "absence", - "absolu", - "abuser", - "acacia", - "acajou", - "accent", - "accord", - "accrocher", - "accuser", - "acerbe", - "achat", - "acheter", - "acide", - "acier", - "acquis", - "acte", - "action", - "adage", - "adepte", - "adieu", - "admettre", - "admis", - "adorer", - "adresser", - "aduler", - "affaire", - "affirmer", - "afin", - "agacer", - "agent", - "agir", - "agiter", - "agonie", - "agrafe", - "agrume", - "aider", - "aigle", - "aigre", - "aile", - "ailleurs", - "aimant", - "aimer", - "ainsi", - "aise", - "ajouter", - "alarme", - "album", - "alcool", - "alerte", - "algue", - "alibi", - "aller", - "allumer", - "alors", - "amande", - "amener", - "amie", - "amorcer", - "amour", - "ample", - "amuser", - "ananas", - "ancien", - "anglais", - "angoisse", - "animal", - "anneau", - "annoncer", - "apercevoir", - "apparence", - "appel", - "apporter", - "apprendre", - "appuyer", - "arbre", - "arcade", - "arceau", - "arche", - "ardeur", - "argent", - "argile", - "aride", - "arme", - "armure", - "arracher", - "arriver", - "article", - "asile", - "aspect", - "assaut", - "assez", - "assister", - "assurer", - "astre", - "astuce", - "atlas", - "atroce", - "attacher", - "attente", - "attirer", - "aube", - "aucun", - "audace", - "auparavant", - "auquel", - "aurore", - "aussi", - "autant", - "auteur", - "autoroute", - "autre", - "aval", - "avant", - "avec", - "avenir", - "averse", - "aveu", - "avide", - "avion", - "avis", - "avoir", - "avouer", - "avril", - "azote", - "azur", - "badge", - "bagage", - "bague", - "bain", - "baisser", - "balai", - "balcon", - "balise", - "balle", - "bambou", - "banane", - "banc", - "bandage", - "banjo", - "banlieue", - "bannir", - "banque", - "baobab", - "barbe", - "barque", - "barrer", - "bassine", - "bataille", - "bateau", - "battre", - "baver", - "bavoir", - "bazar", - "beau", - "beige", - "berger", - "besoin", - "beurre", - "biais", - "biceps", - "bidule", - "bien", - "bijou", - "bilan", - "billet", - "blanc", - "blason", - "bleu", - "bloc", - "blond", - "bocal", - "boire", - "boiserie", - "boiter", - "bonbon", - "bondir", - "bonheur", - "bordure", - "borgne", - "borner", - "bosse", - "bouche", - "bouder", - "bouger", - "boule", - "bourse", - "bout", - "boxe", - "brader", - "braise", - "branche", - "braquer", - "bras", - "brave", - "brebis", - "brevet", - "brider", - "briller", - "brin", - "brique", - "briser", - "broche", - "broder", - "bronze", - "brosser", - "brouter", - "bruit", - "brute", - "budget", - "buffet", - "bulle", - "bureau", - "buriner", - "buste", - "buter", - "butiner", - "cabas", - "cabinet", - "cabri", - "cacao", - "cacher", - "cadeau", - "cadre", - "cage", - "caisse", - "caler", - "calme", - "camarade", - "camion", - "campagne", - "canal", - "canif", - "capable", - "capot", - "carat", - "caresser", - "carie", - "carpe", - "cartel", - "casier", - "casque", - "casserole", - "cause", - "cavale", - "cave", - "ceci", - "cela", - "celui", - "cendre", - "cent", - "cependant", - "cercle", - "cerise", - "cerner", - "certes", - "cerveau", - "cesser", - "chacun", - "chair", - "chaleur", - "chamois", - "chanson", - "chaque", - "charge", - "chasse", - "chat", - "chaud", - "chef", - "chemin", - "cheveu", - "chez", - "chicane", - "chien", - "chiffre", - "chiner", - "chiot", - "chlore", - "choc", - "choix", - "chose", - "chou", - "chute", - "cibler", - "cidre", - "ciel", - "cigale", - "cinq", - "cintre", - "cirage", - "cirque", - "ciseau", - "citation", - "citer", - "citron", - "civet", - "clairon", - "clan", - "classe", - "clavier", - "clef", - "climat", - "cloche", - "cloner", - "clore", - "clos", - "clou", - "club", - "cobra", - "cocon", - "coiffer", - "coin", - "colline", - "colon", - "combat", - "comme", - "compte", - "conclure", - "conduire", - "confier", - "connu", - "conseil", - "contre", - "convenir", - "copier", - "cordial", - "cornet", - "corps", - "cosmos", - "coton", - "couche", - "coude", - "couler", - "coupure", - "cour", - "couteau", - "couvrir", - "crabe", - "crainte", - "crampe", - "cran", - "creuser", - "crever", - "crier", - "crime", - "crin", - "crise", - "crochet", - "croix", - "cruel", - "cuisine", - "cuite", - "culot", - "culte", - "cumul", - "cure", - "curieux", - "cuve", - "dame", - "danger", - "dans", - "davantage", - "debout", - "dedans", - "dehors", - "delta", - "demain", - "demeurer", - "demi", - "dense", - "dent", - "depuis", - "dernier", - "descendre", - "dessus", - "destin", - "dette", - "deuil", - "deux", - "devant", - "devenir", - "devin", - "devoir", - "dicton", - "dieu", - "difficile", - "digestion", - "digue", - "diluer", - "dimanche", - "dinde", - "diode", - "dire", - "diriger", - "discours", - "disposer", - "distance", - "divan", - "divers", - "docile", - "docteur", - "dodu", - "dogme", - "doigt", - "dominer", - "donation", - "donjon", - "donner", - "dopage", - "dorer", - "dormir", - "doseur", - "douane", - "double", - "douche", - "douleur", - "doute", - "doux", - "douzaine", - "draguer", - "drame", - "drap", - "dresser", - "droit", - "duel", - "dune", - "duper", - "durant", - "durcir", - "durer", - "eaux", - "effacer", - "effet", - "effort", - "effrayant", - "elle", - "embrasser", - "emmener", - "emparer", - "empire", - "employer", - "emporter", - "enclos", - "encore", - "endive", - "endormir", - "endroit", - "enduit", - "enfant", - "enfermer", - "enfin", - "enfler", - "enfoncer", - "enfuir", - "engager", - "engin", - "enjeu", - "enlever", - "ennemi", - "ennui", - "ensemble", - "ensuite", - "entamer", - "entendre", - "entier", - "entourer", - "entre", - "envelopper", - "envie", - "envoyer", - "erreur", - "escalier", - "espace", - "espoir", - "esprit", - "essai", - "essor", - "essuyer", - "estimer", - "exact", - "examiner", - "excuse", - "exemple", - "exiger", - "exil", - "exister", - "exode", - "expliquer", - "exposer", - "exprimer", - "extase", - "fable", - "facette", - "facile", - "fade", - "faible", - "faim", - "faire", - "fait", - "falloir", - "famille", - "faner", - "farce", - "farine", - "fatigue", - "faucon", - "faune", - "faute", - "faux", - "faveur", - "favori", - "faxer", - "feinter", - "femme", - "fendre", - "fente", - "ferme", - "festin", - "feuille", - "feutre", - "fiable", - "fibre", - "ficher", - "fier", - "figer", - "figure", - "filet", - "fille", - "filmer", - "fils", - "filtre", - "final", - "finesse", - "finir", - "fiole", - "firme", - "fixe", - "flacon", - "flair", - "flamme", - "flan", - "flaque", - "fleur", - "flocon", - "flore", - "flot", - "flou", - "fluide", - "fluor", - "flux", - "focus", - "foin", - "foire", - "foison", - "folie", - "fonction", - "fondre", - "fonte", - "force", - "forer", - "forger", - "forme", - "fort", - "fosse", - "fouet", - "fouine", - "foule", - "four", - "foyer", - "frais", - "franc", - "frapper", - "freiner", - "frimer", - "friser", - "frite", - "froid", - "froncer", - "fruit", - "fugue", - "fuir", - "fuite", - "fumer", - "fureur", - "furieux", - "fuser", - "fusil", - "futile", - "futur", - "gagner", - "gain", - "gala", - "galet", - "galop", - "gamme", - "gant", - "garage", - "garde", - "garer", - "gauche", - "gaufre", - "gaule", - "gaver", - "gazon", - "geler", - "genou", - "genre", - "gens", - "gercer", - "germer", - "geste", - "gibier", - "gicler", - "gilet", - "girafe", - "givre", - "glace", - "glisser", - "globe", - "gloire", - "gluant", - "gober", - "golf", - "gommer", - "gorge", - "gosier", - "goutte", - "grain", - "gramme", - "grand", - "gras", - "grave", - "gredin", - "griffure", - "griller", - "gris", - "gronder", - "gros", - "grotte", - "groupe", - "grue", - "guerrier", - "guetter", - "guider", - "guise", - "habiter", - "hache", - "haie", - "haine", - "halte", - "hamac", - "hanche", - "hangar", - "hanter", - "haras", - "hareng", - "harpe", - "hasard", - "hausse", - "haut", - "havre", - "herbe", - "heure", - "hibou", - "hier", - "histoire", - "hiver", - "hochet", - "homme", - "honneur", - "honte", - "horde", - "horizon", - "hormone", - "houle", - "housse", - "hublot", - "huile", - "huit", - "humain", - "humble", - "humide", - "humour", - "hurler", - "idole", - "igloo", - "ignorer", - "illusion", - "image", - "immense", - "immobile", - "imposer", - "impression", - "incapable", - "inconnu", - "index", - "indiquer", - "infime", - "injure", - "inox", - "inspirer", - "instant", - "intention", - "intime", - "inutile", - "inventer", - "inviter", - "iode", - "iris", - "issue", - "ivre", - "jade", - "jadis", - "jamais", - "jambe", - "janvier", - "jardin", - "jauge", - "jaunisse", - "jeter", - "jeton", - "jeudi", - "jeune", - "joie", - "joindre", - "joli", - "joueur", - "journal", - "judo", - "juge", - "juillet", - "juin", - "jument", - "jungle", - "jupe", - "jupon", - "jurer", - "juron", - "jury", - "jusque", - "juste", - "kayak", - "ketchup", - "kilo", - "kiwi", - "koala", - "label", - "lacet", - "lacune", - "laine", - "laisse", - "lait", - "lame", - "lancer", - "lande", - "laque", - "lard", - "largeur", - "larme", - "larve", - "lasso", - "laver", - "lendemain", - "lentement", - "lequel", - "lettre", - "leur", - "lever", - "levure", - "liane", - "libre", - "lien", - "lier", - "lieutenant", - "ligne", - "ligoter", - "liguer", - "limace", - "limer", - "limite", - "lingot", - "lion", - "lire", - "lisser", - "litre", - "livre", - "lobe", - "local", - "logis", - "loin", - "loisir", - "long", - "loque", - "lors", - "lotus", - "louer", - "loup", - "lourd", - "louve", - "loyer", - "lubie", - "lucide", - "lueur", - "luge", - "luire", - "lundi", - "lune", - "lustre", - "lutin", - "lutte", - "luxe", - "machine", - "madame", - "magie", - "magnifique", - "magot", - "maigre", - "main", - "mairie", - "maison", - "malade", - "malheur", - "malin", - "manche", - "manger", - "manier", - "manoir", - "manquer", - "marche", - "mardi", - "marge", - "mariage", - "marquer", - "mars", - "masque", - "masse", - "matin", - "mauvais", - "meilleur", - "melon", - "membre", - "menacer", - "mener", - "mensonge", - "mentir", - "menu", - "merci", - "merlu", - "mesure", - "mettre", - "meuble", - "meunier", - "meute", - "miche", - "micro", - "midi", - "miel", - "miette", - "mieux", - "milieu", - "mille", - "mimer", - "mince", - "mineur", - "ministre", - "minute", - "mirage", - "miroir", - "miser", - "mite", - "mixte", - "mobile", - "mode", - "module", - "moins", - "mois", - "moment", - "momie", - "monde", - "monsieur", - "monter", - "moquer", - "moral", - "morceau", - "mordre", - "morose", - "morse", - "mortier", - "morue", - "motif", - "motte", - "moudre", - "moule", - "mourir", - "mousse", - "mouton", - "mouvement", - "moyen", - "muer", - "muette", - "mugir", - "muguet", - "mulot", - "multiple", - "munir", - "muret", - "muse", - "musique", - "muter", - "nacre", - "nager", - "nain", - "naissance", - "narine", - "narrer", - "naseau", - "nasse", - "nation", - "nature", - "naval", - "navet", - "naviguer", - "navrer", - "neige", - "nerf", - "nerveux", - "neuf", - "neutre", - "neuve", - "neveu", - "niche", - "nier", - "niveau", - "noble", - "noce", - "nocif", - "noir", - "nomade", - "nombre", - "nommer", - "nord", - "norme", - "notaire", - "notice", - "notre", - "nouer", - "nougat", - "nourrir", - "nous", - "nouveau", - "novice", - "noyade", - "noyer", - "nuage", - "nuance", - "nuire", - "nuit", - "nulle", - "nuque", - "oasis", - "objet", - "obliger", - "obscur", - "observer", - "obtenir", - "obus", - "occasion", - "occuper", - "ocre", - "octet", - "odeur", - "odorat", - "offense", - "officier", - "offrir", - "ogive", - "oiseau", - "olive", - "ombre", - "onctueux", - "onduler", - "ongle", - "onze", - "opter", - "option", - "orageux", - "oral", - "orange", - "orbite", - "ordinaire", - "ordre", - "oreille", - "organe", - "orgie", - "orgueil", - "orient", - "origan", - "orner", - "orteil", - "ortie", - "oser", - "osselet", - "otage", - "otarie", - "ouate", - "oublier", - "ouest", - "ours", - "outil", - "outre", - "ouvert", - "ouvrir", - "ovale", - "ozone", - "pacte", - "page", - "paille", - "pain", - "paire", - "paix", - "palace", - "palissade", - "palmier", - "palpiter", - "panda", - "panneau", - "papa", - "papier", - "paquet", - "parc", - "pardi", - "parfois", - "parler", - "parmi", - "parole", - "partir", - "parvenir", - "passer", - "pastel", - "patin", - "patron", - "paume", - "pause", - "pauvre", - "paver", - "pavot", - "payer", - "pays", - "peau", - "peigne", - "peinture", - "pelage", - "pelote", - "pencher", - "pendre", - "penser", - "pente", - "percer", - "perdu", - "perle", - "permettre", - "personne", - "perte", - "peser", - "pesticide", - "petit", - "peuple", - "peur", - "phase", - "photo", - "phrase", - "piano", - "pied", - "pierre", - "pieu", - "pile", - "pilier", - "pilote", - "pilule", - "piment", - "pincer", - "pinson", - "pinte", - "pion", - "piquer", - "pirate", - "pire", - "piste", - "piton", - "pitre", - "pivot", - "pizza", - "placer", - "plage", - "plaire", - "plan", - "plaque", - "plat", - "plein", - "pleurer", - "pliage", - "plier", - "plonger", - "plot", - "pluie", - "plume", - "plus", - "pneu", - "poche", - "podium", - "poids", - "poil", - "point", - "poire", - "poison", - "poitrine", - "poivre", - "police", - "pollen", - "pomme", - "pompier", - "poncer", - "pondre", - "pont", - "portion", - "poser", - "position", - "possible", - "poste", - "potage", - "potin", - "pouce", - "poudre", - "poulet", - "poumon", - "poupe", - "pour", - "pousser", - "poutre", - "pouvoir", - "prairie", - "premier", - "prendre", - "presque", - "preuve", - "prier", - "primeur", - "prince", - "prison", - "priver", - "prix", - "prochain", - "produire", - "profond", - "proie", - "projet", - "promener", - "prononcer", - "propre", - "prose", - "prouver", - "prune", - "public", - "puce", - "pudeur", - "puiser", - "pull", - "pulpe", - "puma", - "punir", - "purge", - "putois", - "quand", - "quartier", - "quasi", - "quatre", - "quel", - "question", - "queue", - "quiche", - "quille", - "quinze", - "quitter", - "quoi", - "rabais", - "raboter", - "race", - "racheter", - "racine", - "racler", - "raconter", - "radar", - "radio", - "rafale", - "rage", - "ragot", - "raideur", - "raie", - "rail", - "raison", - "ramasser", - "ramener", - "rampe", - "rance", - "rang", - "rapace", - "rapide", - "rapport", - "rarement", - "rasage", - "raser", - "rasoir", - "rassurer", - "rater", - "ratio", - "rature", - "ravage", - "ravir", - "rayer", - "rayon", - "rebond", - "recevoir", - "recherche", - "record", - "reculer", - "redevenir", - "refuser", - "regard", - "regretter", - "rein", - "rejeter", - "rejoindre", - "relation", - "relever", - "religion", - "remarquer", - "remettre", - "remise", - "remonter", - "remplir", - "remuer", - "rencontre", - "rendre", - "renier", - "renoncer", - "rentrer", - "renverser", - "repas", - "repli", - "reposer", - "reproche", - "requin", - "respect", - "ressembler", - "reste", - "retard", - "retenir", - "retirer", - "retour", - "retrouver", - "revenir", - "revoir", - "revue", - "rhume", - "ricaner", - "riche", - "rideau", - "ridicule", - "rien", - "rigide", - "rincer", - "rire", - "risquer", - "rituel", - "rivage", - "rive", - "robe", - "robot", - "robuste", - "rocade", - "roche", - "rodeur", - "rogner", - "roman", - "rompre", - "ronce", - "rondeur", - "ronger", - "roque", - "rose", - "rosir", - "rotation", - "rotule", - "roue", - "rouge", - "rouler", - "route", - "ruban", - "rubis", - "ruche", - "rude", - "ruelle", - "ruer", - "rugby", - "rugir", - "ruine", - "rumeur", - "rural", - "ruse", - "rustre", - "sable", - "sabot", - "sabre", - "sacre", - "sage", - "saint", - "saisir", - "salade", - "salive", - "salle", - "salon", - "salto", - "salut", - "salve", - "samba", - "sandale", - "sanguin", - "sapin", - "sarcasme", - "satisfaire", - "sauce", - "sauf", - "sauge", - "saule", - "sauna", - "sauter", - "sauver", - "savoir", - "science", - "scoop", - "score", - "second", - "secret", - "secte", - "seigneur", - "sein", - "seize", - "selle", - "selon", - "semaine", - "sembler", - "semer", - "semis", - "sensuel", - "sentir", - "sept", - "serpe", - "serrer", - "sertir", - "service", - "seuil", - "seulement", - "short", - "sien", - "sigle", - "signal", - "silence", - "silo", - "simple", - "singe", - "sinon", - "sinus", - "sioux", - "sirop", - "site", - "situation", - "skier", - "snob", - "sobre", - "social", - "socle", - "sodium", - "soigner", - "soir", - "soixante", - "soja", - "solaire", - "soldat", - "soleil", - "solide", - "solo", - "solvant", - "sombre", - "somme", - "somnoler", - "sondage", - "songeur", - "sonner", - "sorte", - "sosie", - "sottise", - "souci", - "soudain", - "souffrir", - "souhaiter", - "soulever", - "soumettre", - "soupe", - "sourd", - "soustraire", - "soutenir", - "souvent", - "soyeux", - "spectacle", - "sport", - "stade", - "stagiaire", - "stand", - "star", - "statue", - "stock", - "stop", - "store", - "style", - "suave", - "subir", - "sucre", - "suer", - "suffire", - "suie", - "suite", - "suivre", - "sujet", - "sulfite", - "supposer", - "surf", - "surprendre", - "surtout", - "surveiller", - "tabac", - "table", - "tabou", - "tache", - "tacler", - "tacot", - "tact", - "taie", - "taille", - "taire", - "talon", - "talus", - "tandis", - "tango", - "tanin", - "tant", - "taper", - "tapis", - "tard", - "tarif", - "tarot", - "tarte", - "tasse", - "taureau", - "taux", - "taverne", - "taxer", - "taxi", - "tellement", - "temple", - "tendre", - "tenir", - "tenter", - "tenu", - "terme", - "ternir", - "terre", - "test", - "texte", - "thym", - "tibia", - "tiers", - "tige", - "tipi", - "tique", - "tirer", - "tissu", - "titre", - "toast", - "toge", - "toile", - "toiser", - "toiture", - "tomber", - "tome", - "tonne", - "tonte", - "toque", - "torse", - "tortue", - "totem", - "toucher", - "toujours", - "tour", - "tousser", - "tout", - "toux", - "trace", - "train", - "trame", - "tranquille", - "travail", - "trembler", - "trente", - "tribu", - "trier", - "trio", - "tripe", - "triste", - "troc", - "trois", - "tromper", - "tronc", - "trop", - "trotter", - "trouer", - "truc", - "truite", - "tuba", - "tuer", - "tuile", - "turbo", - "tutu", - "tuyau", - "type", - "union", - "unique", - "unir", - "unisson", - "untel", - "urne", - "usage", - "user", - "usiner", - "usure", - "utile", - "vache", - "vague", - "vaincre", - "valeur", - "valoir", - "valser", - "valve", - "vampire", - "vaseux", - "vaste", - "veau", - "veille", - "veine", - "velours", - "velu", - "vendre", - "venir", - "vent", - "venue", - "verbe", - "verdict", - "version", - "vertige", - "verve", - "veste", - "veto", - "vexer", - "vice", - "victime", - "vide", - "vieil", - "vieux", - "vigie", - "vigne", - "ville", - "vingt", - "violent", - "virer", - "virus", - "visage", - "viser", - "visite", - "visuel", - "vitamine", - "vitrine", - "vivant", - "vivre", - "vocal", - "vodka", - "vogue", - "voici", - "voile", - "voir", - "voisin", - "voiture", - "volaille", - "volcan", - "voler", - "volt", - "votant", - "votre", - "vouer", - "vouloir", - "vous", - "voyage", - "voyou", - "vrac", - "vrai", - "yacht", - "yeti", - "yeux", - "yoga", - "zeste", - "zinc", - "zone", - "zoom" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/it.rs b/networks/monero/wallet/seed/src/words/it.rs deleted file mode 100644 index 343984e6c..000000000 --- a/networks/monero/wallet/seed/src/words/it.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "abbinare", - "abbonato", - "abisso", - "abitare", - "abominio", - "accadere", - "accesso", - "acciaio", - "accordo", - "accumulo", - "acido", - "acqua", - "acrobata", - "acustico", - "adattare", - "addetto", - "addio", - "addome", - "adeguato", - "aderire", - "adorare", - "adottare", - "adozione", - "adulto", - "aereo", - "aerobica", - "affare", - "affetto", - "affidare", - "affogato", - "affronto", - "africano", - "afrodite", - "agenzia", - "aggancio", - "aggeggio", - "aggiunta", - "agio", - "agire", - "agitare", - "aglio", - "agnello", - "agosto", - "aiutare", - "albero", - "albo", - "alce", - "alchimia", - "alcool", - "alfabeto", - "algebra", - "alimento", - "allarme", - "alleanza", - "allievo", - "alloggio", - "alluce", - "alpi", - "alterare", - "altro", - "aluminio", - "amante", - "amarezza", - "ambiente", - "ambrosia", - "america", - "amico", - "ammalare", - "ammirare", - "amnesia", - "amnistia", - "amore", - "ampliare", - "amputare", - "analisi", - "anamnesi", - "ananas", - "anarchia", - "anatra", - "anca", - "ancorato", - "andare", - "androide", - "aneddoto", - "anello", - "angelo", - "angolino", - "anguilla", - "anidride", - "anima", - "annegare", - "anno", - "annuncio", - "anomalia", - "antenna", - "anticipo", - "aperto", - "apostolo", - "appalto", - "appello", - "appiglio", - "applauso", - "appoggio", - "appurare", - "aprile", - "aquila", - "arabo", - "arachidi", - "aragosta", - "arancia", - "arbitrio", - "archivio", - "arco", - "argento", - "argilla", - "aria", - "ariete", - "arma", - "armonia", - "aroma", - "arrivare", - "arrosto", - "arsenale", - "arte", - "artiglio", - "asfalto", - "asfissia", - "asino", - "asparagi", - "aspirina", - "assalire", - "assegno", - "assolto", - "assurdo", - "asta", - "astratto", - "atlante", - "atletica", - "atomo", - "atropina", - "attacco", - "attesa", - "attico", - "atto", - "attrarre", - "auguri", - "aula", - "aumento", - "aurora", - "auspicio", - "autista", - "auto", - "autunno", - "avanzare", - "avarizia", - "avere", - "aviatore", - "avido", - "avorio", - "avvenire", - "avviso", - "avvocato", - "azienda", - "azione", - "azzardo", - "azzurro", - "babbuino", - "bacio", - "badante", - "baffi", - "bagaglio", - "bagliore", - "bagno", - "balcone", - "balena", - "ballare", - "balordo", - "balsamo", - "bambola", - "bancomat", - "banda", - "barato", - "barba", - "barista", - "barriera", - "basette", - "basilico", - "bassista", - "bastare", - "battello", - "bavaglio", - "beccare", - "beduino", - "bellezza", - "bene", - "benzina", - "berretto", - "bestia", - "bevitore", - "bianco", - "bibbia", - "biberon", - "bibita", - "bici", - "bidone", - "bilancia", - "biliardo", - "binario", - "binocolo", - "biologia", - "biondina", - "biopsia", - "biossido", - "birbante", - "birra", - "biscotto", - "bisogno", - "bistecca", - "bivio", - "blindare", - "bloccare", - "bocca", - "bollire", - "bombola", - "bonifico", - "borghese", - "borsa", - "bottino", - "botulino", - "braccio", - "bradipo", - "branco", - "bravo", - "bresaola", - "bretelle", - "brevetto", - "briciola", - "brigante", - "brillare", - "brindare", - "brivido", - "broccoli", - "brontolo", - "bruciare", - "brufolo", - "bucare", - "buddista", - "budino", - "bufera", - "buffo", - "bugiardo", - "buio", - "buono", - "burrone", - "bussola", - "bustina", - "buttare", - "cabernet", - "cabina", - "cacao", - "cacciare", - "cactus", - "cadavere", - "caffe", - "calamari", - "calcio", - "caldaia", - "calmare", - "calunnia", - "calvario", - "calzone", - "cambiare", - "camera", - "camion", - "cammello", - "campana", - "canarino", - "cancello", - "candore", - "cane", - "canguro", - "cannone", - "canoa", - "cantare", - "canzone", - "caos", - "capanna", - "capello", - "capire", - "capo", - "capperi", - "capra", - "capsula", - "caraffa", - "carbone", - "carciofo", - "cardigan", - "carenza", - "caricare", - "carota", - "carrello", - "carta", - "casa", - "cascare", - "caserma", - "cashmere", - "casino", - "cassetta", - "castello", - "catalogo", - "catena", - "catorcio", - "cattivo", - "causa", - "cauzione", - "cavallo", - "caverna", - "caviglia", - "cavo", - "cazzotto", - "celibato", - "cemento", - "cenare", - "centrale", - "ceramica", - "cercare", - "ceretta", - "cerniera", - "certezza", - "cervello", - "cessione", - "cestino", - "cetriolo", - "chiave", - "chiedere", - "chilo", - "chimera", - "chiodo", - "chirurgo", - "chitarra", - "chiudere", - "ciabatta", - "ciao", - "cibo", - "ciccia", - "cicerone", - "ciclone", - "cicogna", - "cielo", - "cifra", - "cigno", - "ciliegia", - "cimitero", - "cinema", - "cinque", - "cintura", - "ciondolo", - "ciotola", - "cipolla", - "cippato", - "circuito", - "cisterna", - "citofono", - "ciuccio", - "civetta", - "civico", - "clausola", - "cliente", - "clima", - "clinica", - "cobra", - "coccole", - "cocktail", - "cocomero", - "codice", - "coesione", - "cogliere", - "cognome", - "colla", - "colomba", - "colpire", - "coltello", - "comando", - "comitato", - "commedia", - "comodino", - "compagna", - "comune", - "concerto", - "condotto", - "conforto", - "congiura", - "coniglio", - "consegna", - "conto", - "convegno", - "coperta", - "copia", - "coprire", - "corazza", - "corda", - "corleone", - "cornice", - "corona", - "corpo", - "corrente", - "corsa", - "cortesia", - "corvo", - "coso", - "costume", - "cotone", - "cottura", - "cozza", - "crampo", - "cratere", - "cravatta", - "creare", - "credere", - "crema", - "crescere", - "crimine", - "criterio", - "croce", - "crollare", - "cronaca", - "crostata", - "croupier", - "cubetto", - "cucciolo", - "cucina", - "cultura", - "cuoco", - "cuore", - "cupido", - "cupola", - "cura", - "curva", - "cuscino", - "custode", - "danzare", - "data", - "decennio", - "decidere", - "decollo", - "dedicare", - "dedurre", - "definire", - "delegare", - "delfino", - "delitto", - "demone", - "dentista", - "denuncia", - "deposito", - "derivare", - "deserto", - "designer", - "destino", - "detonare", - "dettagli", - "diagnosi", - "dialogo", - "diamante", - "diario", - "diavolo", - "dicembre", - "difesa", - "digerire", - "digitare", - "diluvio", - "dinamica", - "dipinto", - "diploma", - "diramare", - "dire", - "dirigere", - "dirupo", - "discesa", - "disdetta", - "disegno", - "disporre", - "dissenso", - "distacco", - "dito", - "ditta", - "diva", - "divenire", - "dividere", - "divorare", - "docente", - "dolcetto", - "dolore", - "domatore", - "domenica", - "dominare", - "donatore", - "donna", - "dorato", - "dormire", - "dorso", - "dosaggio", - "dottore", - "dovere", - "download", - "dragone", - "dramma", - "dubbio", - "dubitare", - "duetto", - "durata", - "ebbrezza", - "eccesso", - "eccitare", - "eclissi", - "economia", - "edera", - "edificio", - "editore", - "edizione", - "educare", - "effetto", - "egitto", - "egiziano", - "elastico", - "elefante", - "eleggere", - "elemento", - "elenco", - "elezione", - "elmetto", - "elogio", - "embrione", - "emergere", - "emettere", - "eminenza", - "emisfero", - "emozione", - "empatia", - "energia", - "enfasi", - "enigma", - "entrare", - "enzima", - "epidemia", - "epilogo", - "episodio", - "epoca", - "equivoco", - "erba", - "erede", - "eroe", - "erotico", - "errore", - "eruzione", - "esaltare", - "esame", - "esaudire", - "eseguire", - "esempio", - "esigere", - "esistere", - "esito", - "esperto", - "espresso", - "essere", - "estasi", - "esterno", - "estrarre", - "eterno", - "etica", - "euforico", - "europa", - "evacuare", - "evasione", - "evento", - "evidenza", - "evitare", - "evolvere", - "fabbrica", - "facciata", - "fagiano", - "fagotto", - "falco", - "fame", - "famiglia", - "fanale", - "fango", - "fantasia", - "farfalla", - "farmacia", - "faro", - "fase", - "fastidio", - "faticare", - "fatto", - "favola", - "febbre", - "femmina", - "femore", - "fenomeno", - "fermata", - "feromoni", - "ferrari", - "fessura", - "festa", - "fiaba", - "fiamma", - "fianco", - "fiat", - "fibbia", - "fidare", - "fieno", - "figa", - "figlio", - "figura", - "filetto", - "filmato", - "filosofo", - "filtrare", - "finanza", - "finestra", - "fingere", - "finire", - "finta", - "finzione", - "fiocco", - "fioraio", - "firewall", - "firmare", - "fisico", - "fissare", - "fittizio", - "fiume", - "flacone", - "flagello", - "flirtare", - "flusso", - "focaccia", - "foglio", - "fognario", - "follia", - "fonderia", - "fontana", - "forbici", - "forcella", - "foresta", - "forgiare", - "formare", - "fornace", - "foro", - "fortuna", - "forzare", - "fosforo", - "fotoni", - "fracasso", - "fragola", - "frantumi", - "fratello", - "frazione", - "freccia", - "freddo", - "frenare", - "fresco", - "friggere", - "frittata", - "frivolo", - "frizione", - "fronte", - "frullato", - "frumento", - "frusta", - "frutto", - "fucile", - "fuggire", - "fulmine", - "fumare", - "funzione", - "fuoco", - "furbizia", - "furgone", - "furia", - "furore", - "fusibile", - "fuso", - "futuro", - "gabbiano", - "galassia", - "gallina", - "gamba", - "gancio", - "garanzia", - "garofano", - "gasolio", - "gatto", - "gazebo", - "gazzetta", - "gelato", - "gemelli", - "generare", - "genitori", - "gennaio", - "geologia", - "germania", - "gestire", - "gettare", - "ghepardo", - "ghiaccio", - "giaccone", - "giaguaro", - "giallo", - "giappone", - "giardino", - "gigante", - "gioco", - "gioiello", - "giorno", - "giovane", - "giraffa", - "giudizio", - "giurare", - "giusto", - "globo", - "gloria", - "glucosio", - "gnocca", - "gocciola", - "godere", - "gomito", - "gomma", - "gonfiare", - "gorilla", - "governo", - "gradire", - "graffiti", - "granchio", - "grappolo", - "grasso", - "grattare", - "gridare", - "grissino", - "grondaia", - "grugnito", - "gruppo", - "guadagno", - "guaio", - "guancia", - "guardare", - "gufo", - "guidare", - "guscio", - "gusto", - "icona", - "idea", - "identico", - "idolo", - "idoneo", - "idrante", - "idrogeno", - "igiene", - "ignoto", - "imbarco", - "immagine", - "immobile", - "imparare", - "impedire", - "impianto", - "importo", - "impresa", - "impulso", - "incanto", - "incendio", - "incidere", - "incontro", - "incrocia", - "incubo", - "indagare", - "indice", - "indotto", - "infanzia", - "inferno", - "infinito", - "infranto", - "ingerire", - "inglese", - "ingoiare", - "ingresso", - "iniziare", - "innesco", - "insalata", - "inserire", - "insicuro", - "insonnia", - "insulto", - "interno", - "introiti", - "invasori", - "inverno", - "invito", - "invocare", - "ipnosi", - "ipocrita", - "ipotesi", - "ironia", - "irrigare", - "iscritto", - "isola", - "ispirare", - "isterico", - "istinto", - "istruire", - "italiano", - "jazz", - "labbra", - "labrador", - "ladro", - "lago", - "lamento", - "lampone", - "lancetta", - "lanterna", - "lapide", - "larva", - "lasagne", - "lasciare", - "lastra", - "latte", - "laurea", - "lavagna", - "lavorare", - "leccare", - "legare", - "leggere", - "lenzuolo", - "leone", - "lepre", - "letargo", - "lettera", - "levare", - "levitare", - "lezione", - "liberare", - "libidine", - "libro", - "licenza", - "lievito", - "limite", - "lince", - "lingua", - "liquore", - "lire", - "listino", - "litigare", - "litro", - "locale", - "lottare", - "lucciola", - "lucidare", - "luglio", - "luna", - "macchina", - "madama", - "madre", - "maestro", - "maggio", - "magico", - "maglione", - "magnolia", - "mago", - "maialino", - "maionese", - "malattia", - "male", - "malloppo", - "mancare", - "mandorla", - "mangiare", - "manico", - "manopola", - "mansarda", - "mantello", - "manubrio", - "manzo", - "mappa", - "mare", - "margine", - "marinaio", - "marmotta", - "marocco", - "martello", - "marzo", - "maschera", - "matrice", - "maturare", - "mazzetta", - "meandri", - "medaglia", - "medico", - "medusa", - "megafono", - "melone", - "membrana", - "menta", - "mercato", - "meritare", - "merluzzo", - "mese", - "mestiere", - "metafora", - "meteo", - "metodo", - "mettere", - "miele", - "miglio", - "miliardo", - "mimetica", - "minatore", - "minuto", - "miracolo", - "mirtillo", - "missile", - "mistero", - "misura", - "mito", - "mobile", - "moda", - "moderare", - "moglie", - "molecola", - "molle", - "momento", - "moneta", - "mongolia", - "monologo", - "montagna", - "morale", - "morbillo", - "mordere", - "mosaico", - "mosca", - "mostro", - "motivare", - "moto", - "mulino", - "mulo", - "muovere", - "muraglia", - "muscolo", - "museo", - "musica", - "mutande", - "nascere", - "nastro", - "natale", - "natura", - "nave", - "navigare", - "negare", - "negozio", - "nemico", - "nero", - "nervo", - "nessuno", - "nettare", - "neutroni", - "neve", - "nevicare", - "nicotina", - "nido", - "nipote", - "nocciola", - "noleggio", - "nome", - "nonno", - "norvegia", - "notare", - "notizia", - "nove", - "nucleo", - "nuda", - "nuotare", - "nutrire", - "obbligo", - "occhio", - "occupare", - "oceano", - "odissea", - "odore", - "offerta", - "officina", - "offrire", - "oggetto", - "oggi", - "olfatto", - "olio", - "oliva", - "ombelico", - "ombrello", - "omuncolo", - "ondata", - "onore", - "opera", - "opinione", - "opuscolo", - "opzione", - "orario", - "orbita", - "orchidea", - "ordine", - "orecchio", - "orgasmo", - "orgoglio", - "origine", - "orologio", - "oroscopo", - "orso", - "oscurare", - "ospedale", - "ospite", - "ossigeno", - "ostacolo", - "ostriche", - "ottenere", - "ottimo", - "ottobre", - "ovest", - "pacco", - "pace", - "pacifico", - "padella", - "pagare", - "pagina", - "pagnotta", - "palazzo", - "palestra", - "palpebre", - "pancetta", - "panfilo", - "panino", - "pannello", - "panorama", - "papa", - "paperino", - "paradiso", - "parcella", - "parente", - "parlare", - "parodia", - "parrucca", - "partire", - "passare", - "pasta", - "patata", - "patente", - "patogeno", - "patriota", - "pausa", - "pazienza", - "peccare", - "pecora", - "pedalare", - "pelare", - "pena", - "pendenza", - "penisola", - "pennello", - "pensare", - "pentirsi", - "percorso", - "perdono", - "perfetto", - "perizoma", - "perla", - "permesso", - "persona", - "pesare", - "pesce", - "peso", - "petardo", - "petrolio", - "pezzo", - "piacere", - "pianeta", - "piastra", - "piatto", - "piazza", - "piccolo", - "piede", - "piegare", - "pietra", - "pigiama", - "pigliare", - "pigrizia", - "pilastro", - "pilota", - "pinguino", - "pioggia", - "piombo", - "pionieri", - "piovra", - "pipa", - "pirata", - "pirolisi", - "piscina", - "pisolino", - "pista", - "pitone", - "piumino", - "pizza", - "plastica", - "platino", - "poesia", - "poiana", - "polaroid", - "polenta", - "polimero", - "pollo", - "polmone", - "polpetta", - "poltrona", - "pomodoro", - "pompa", - "popolo", - "porco", - "porta", - "porzione", - "possesso", - "postino", - "potassio", - "potere", - "poverino", - "pranzo", - "prato", - "prefisso", - "prelievo", - "premio", - "prendere", - "prestare", - "pretesa", - "prezzo", - "primario", - "privacy", - "problema", - "processo", - "prodotto", - "profeta", - "progetto", - "promessa", - "pronto", - "proposta", - "proroga", - "prossimo", - "proteina", - "prova", - "prudenza", - "pubblico", - "pudore", - "pugilato", - "pulire", - "pulsante", - "puntare", - "pupazzo", - "puzzle", - "quaderno", - "qualcuno", - "quarzo", - "quercia", - "quintale", - "rabbia", - "racconto", - "radice", - "raffica", - "ragazza", - "ragione", - "rammento", - "ramo", - "rana", - "randagio", - "rapace", - "rapinare", - "rapporto", - "rasatura", - "ravioli", - "reagire", - "realista", - "reattore", - "reazione", - "recitare", - "recluso", - "record", - "recupero", - "redigere", - "regalare", - "regina", - "regola", - "relatore", - "reliquia", - "remare", - "rendere", - "reparto", - "resina", - "resto", - "rete", - "retorica", - "rettile", - "revocare", - "riaprire", - "ribadire", - "ribelle", - "ricambio", - "ricetta", - "richiamo", - "ricordo", - "ridurre", - "riempire", - "riferire", - "riflesso", - "righello", - "rilancio", - "rilevare", - "rilievo", - "rimanere", - "rimborso", - "rinforzo", - "rinuncia", - "riparo", - "ripetere", - "riposare", - "ripulire", - "risalita", - "riscatto", - "riserva", - "riso", - "rispetto", - "ritaglio", - "ritmo", - "ritorno", - "ritratto", - "rituale", - "riunione", - "riuscire", - "riva", - "robotica", - "rondine", - "rosa", - "rospo", - "rosso", - "rotonda", - "rotta", - "roulotte", - "rubare", - "rubrica", - "ruffiano", - "rumore", - "ruota", - "ruscello", - "sabbia", - "sacco", - "saggio", - "sale", - "salire", - "salmone", - "salto", - "salutare", - "salvia", - "sangue", - "sanzioni", - "sapere", - "sapienza", - "sarcasmo", - "sardine", - "sartoria", - "sbalzo", - "sbarcare", - "sberla", - "sborsare", - "scadenza", - "scafo", - "scala", - "scambio", - "scappare", - "scarpa", - "scatola", - "scelta", - "scena", - "sceriffo", - "scheggia", - "schiuma", - "sciarpa", - "scienza", - "scimmia", - "sciopero", - "scivolo", - "sclerare", - "scolpire", - "sconto", - "scopa", - "scordare", - "scossa", - "scrivere", - "scrupolo", - "scuderia", - "scultore", - "scuola", - "scusare", - "sdraiare", - "secolo", - "sedativo", - "sedere", - "sedia", - "segare", - "segreto", - "seguire", - "semaforo", - "seme", - "senape", - "seno", - "sentiero", - "separare", - "sepolcro", - "sequenza", - "serata", - "serpente", - "servizio", - "sesso", - "seta", - "settore", - "sfamare", - "sfera", - "sfidare", - "sfiorare", - "sfogare", - "sgabello", - "sicuro", - "siepe", - "sigaro", - "silenzio", - "silicone", - "simbiosi", - "simpatia", - "simulare", - "sinapsi", - "sindrome", - "sinergia", - "sinonimo", - "sintonia", - "sirena", - "siringa", - "sistema", - "sito", - "smalto", - "smentire", - "smontare", - "soccorso", - "socio", - "soffitto", - "software", - "soggetto", - "sogliola", - "sognare", - "soldi", - "sole", - "sollievo", - "solo", - "sommario", - "sondare", - "sonno", - "sorpresa", - "sorriso", - "sospiro", - "sostegno", - "sovrano", - "spaccare", - "spada", - "spagnolo", - "spalla", - "sparire", - "spavento", - "spazio", - "specchio", - "spedire", - "spegnere", - "spendere", - "speranza", - "spessore", - "spezzare", - "spiaggia", - "spiccare", - "spiegare", - "spiffero", - "spingere", - "sponda", - "sporcare", - "spostare", - "spremuta", - "spugna", - "spumante", - "spuntare", - "squadra", - "squillo", - "staccare", - "stadio", - "stagione", - "stallone", - "stampa", - "stancare", - "starnuto", - "statura", - "stella", - "stendere", - "sterzo", - "stilista", - "stimolo", - "stinco", - "stiva", - "stoffa", - "storia", - "strada", - "stregone", - "striscia", - "studiare", - "stufa", - "stupendo", - "subire", - "successo", - "sudare", - "suono", - "superare", - "supporto", - "surfista", - "sussurro", - "svelto", - "svenire", - "sviluppo", - "svolta", - "svuotare", - "tabacco", - "tabella", - "tabu", - "tacchino", - "tacere", - "taglio", - "talento", - "tangente", - "tappeto", - "tartufo", - "tassello", - "tastiera", - "tavolo", - "tazza", - "teatro", - "tedesco", - "telaio", - "telefono", - "tema", - "temere", - "tempo", - "tendenza", - "tenebre", - "tensione", - "tentare", - "teologia", - "teorema", - "termica", - "terrazzo", - "teschio", - "tesi", - "tesoro", - "tessera", - "testa", - "thriller", - "tifoso", - "tigre", - "timbrare", - "timido", - "tinta", - "tirare", - "tisana", - "titano", - "titolo", - "toccare", - "togliere", - "topolino", - "torcia", - "torrente", - "tovaglia", - "traffico", - "tragitto", - "training", - "tramonto", - "transito", - "trapezio", - "trasloco", - "trattore", - "trazione", - "treccia", - "tregua", - "treno", - "triciclo", - "tridente", - "trilogia", - "tromba", - "troncare", - "trota", - "trovare", - "trucco", - "tubo", - "tulipano", - "tumulto", - "tunisia", - "tuono", - "turista", - "tuta", - "tutelare", - "tutore", - "ubriaco", - "uccello", - "udienza", - "udito", - "uffa", - "umanoide", - "umore", - "unghia", - "unguento", - "unicorno", - "unione", - "universo", - "uomo", - "uragano", - "uranio", - "urlare", - "uscire", - "utente", - "utilizzo", - "vacanza", - "vacca", - "vaglio", - "vagonata", - "valle", - "valore", - "valutare", - "valvola", - "vampiro", - "vaniglia", - "vanto", - "vapore", - "variante", - "vasca", - "vaselina", - "vassoio", - "vedere", - "vegetale", - "veglia", - "veicolo", - "vela", - "veleno", - "velivolo", - "velluto", - "vendere", - "venerare", - "venire", - "vento", - "veranda", - "verbo", - "verdura", - "vergine", - "verifica", - "vernice", - "vero", - "verruca", - "versare", - "vertebra", - "vescica", - "vespaio", - "vestito", - "vesuvio", - "veterano", - "vetro", - "vetta", - "viadotto", - "viaggio", - "vibrare", - "vicenda", - "vichingo", - "vietare", - "vigilare", - "vigneto", - "villa", - "vincere", - "violino", - "vipera", - "virgola", - "virtuoso", - "visita", - "vita", - "vitello", - "vittima", - "vivavoce", - "vivere", - "viziato", - "voglia", - "volare", - "volpe", - "volto", - "volume", - "vongole", - "voragine", - "vortice", - "votare", - "vulcano", - "vuotare", - "zabaione", - "zaffiro", - "zainetto", - "zampa", - "zanzara", - "zattera", - "zavorra", - "zenzero", - "zero", - "zingaro", - "zittire", - "zoccolo", - "zolfo", - "zombie", - "zucchero" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/ja.rs b/networks/monero/wallet/seed/src/words/ja.rs deleted file mode 100644 index da2d9fb60..000000000 --- a/networks/monero/wallet/seed/src/words/ja.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "あいこくしん", - "あいさつ", - "あいだ", - "あおぞら", - "あかちゃん", - "あきる", - "あけがた", - "あける", - "あこがれる", - "あさい", - "あさひ", - "あしあと", - "あじわう", - "あずかる", - "あずき", - "あそぶ", - "あたえる", - "あたためる", - "あたりまえ", - "あたる", - "あつい", - "あつかう", - "あっしゅく", - "あつまり", - "あつめる", - "あてな", - "あてはまる", - "あひる", - "あぶら", - "あぶる", - "あふれる", - "あまい", - "あまど", - "あまやかす", - "あまり", - "あみもの", - "あめりか", - "あやまる", - "あゆむ", - "あらいぐま", - "あらし", - "あらすじ", - "あらためる", - "あらゆる", - "あらわす", - "ありがとう", - "あわせる", - "あわてる", - "あんい", - "あんがい", - "あんこ", - "あんぜん", - "あんてい", - "あんない", - "あんまり", - "いいだす", - "いおん", - "いがい", - "いがく", - "いきおい", - "いきなり", - "いきもの", - "いきる", - "いくじ", - "いくぶん", - "いけばな", - "いけん", - "いこう", - "いこく", - "いこつ", - "いさましい", - "いさん", - "いしき", - "いじゅう", - "いじょう", - "いじわる", - "いずみ", - "いずれ", - "いせい", - "いせえび", - "いせかい", - "いせき", - "いぜん", - "いそうろう", - "いそがしい", - "いだい", - "いだく", - "いたずら", - "いたみ", - "いたりあ", - "いちおう", - "いちじ", - "いちど", - "いちば", - "いちぶ", - "いちりゅう", - "いつか", - "いっしゅん", - "いっせい", - "いっそう", - "いったん", - "いっち", - "いってい", - "いっぽう", - "いてざ", - "いてん", - "いどう", - "いとこ", - "いない", - "いなか", - "いねむり", - "いのち", - "いのる", - "いはつ", - "いばる", - "いはん", - "いびき", - "いひん", - "いふく", - "いへん", - "いほう", - "いみん", - "いもうと", - "いもたれ", - "いもり", - "いやがる", - "いやす", - "いよかん", - "いよく", - "いらい", - "いらすと", - "いりぐち", - "いりょう", - "いれい", - "いれもの", - "いれる", - "いろえんぴつ", - "いわい", - "いわう", - "いわかん", - "いわば", - "いわゆる", - "いんげんまめ", - "いんさつ", - "いんしょう", - "いんよう", - "うえき", - "うえる", - "うおざ", - "うがい", - "うかぶ", - "うかべる", - "うきわ", - "うくらいな", - "うくれれ", - "うけたまわる", - "うけつけ", - "うけとる", - "うけもつ", - "うける", - "うごかす", - "うごく", - "うこん", - "うさぎ", - "うしなう", - "うしろがみ", - "うすい", - "うすぎ", - "うすぐらい", - "うすめる", - "うせつ", - "うちあわせ", - "うちがわ", - "うちき", - "うちゅう", - "うっかり", - "うつくしい", - "うったえる", - "うつる", - "うどん", - "うなぎ", - "うなじ", - "うなずく", - "うなる", - "うねる", - "うのう", - "うぶげ", - "うぶごえ", - "うまれる", - "うめる", - "うもう", - "うやまう", - "うよく", - "うらがえす", - "うらぐち", - "うらない", - "うりあげ", - "うりきれ", - "うるさい", - "うれしい", - "うれゆき", - "うれる", - "うろこ", - "うわき", - "うわさ", - "うんこう", - "うんちん", - "うんてん", - "うんどう", - "えいえん", - "えいが", - "えいきょう", - "えいご", - "えいせい", - "えいぶん", - "えいよう", - "えいわ", - "えおり", - "えがお", - "えがく", - "えきたい", - "えくせる", - "えしゃく", - "えすて", - "えつらん", - "えのぐ", - "えほうまき", - "えほん", - "えまき", - "えもじ", - "えもの", - "えらい", - "えらぶ", - "えりあ", - "えんえん", - "えんかい", - "えんぎ", - "えんげき", - "えんしゅう", - "えんぜつ", - "えんそく", - "えんちょう", - "えんとつ", - "おいかける", - "おいこす", - "おいしい", - "おいつく", - "おうえん", - "おうさま", - "おうじ", - "おうせつ", - "おうたい", - "おうふく", - "おうべい", - "おうよう", - "おえる", - "おおい", - "おおう", - "おおどおり", - "おおや", - "おおよそ", - "おかえり", - "おかず", - "おがむ", - "おかわり", - "おぎなう", - "おきる", - "おくさま", - "おくじょう", - "おくりがな", - "おくる", - "おくれる", - "おこす", - "おこなう", - "おこる", - "おさえる", - "おさない", - "おさめる", - "おしいれ", - "おしえる", - "おじぎ", - "おじさん", - "おしゃれ", - "おそらく", - "おそわる", - "おたがい", - "おたく", - "おだやか", - "おちつく", - "おっと", - "おつり", - "おでかけ", - "おとしもの", - "おとなしい", - "おどり", - "おどろかす", - "おばさん", - "おまいり", - "おめでとう", - "おもいで", - "おもう", - "おもたい", - "おもちゃ", - "おやつ", - "おやゆび", - "およぼす", - "おらんだ", - "おろす", - "おんがく", - "おんけい", - "おんしゃ", - "おんせん", - "おんだん", - "おんちゅう", - "おんどけい", - "かあつ", - "かいが", - "がいき", - "がいけん", - "がいこう", - "かいさつ", - "かいしゃ", - "かいすいよく", - "かいぜん", - "かいぞうど", - "かいつう", - "かいてん", - "かいとう", - "かいふく", - "がいへき", - "かいほう", - "かいよう", - "がいらい", - "かいわ", - "かえる", - "かおり", - "かかえる", - "かがく", - "かがし", - "かがみ", - "かくご", - "かくとく", - "かざる", - "がぞう", - "かたい", - "かたち", - "がちょう", - "がっきゅう", - "がっこう", - "がっさん", - "がっしょう", - "かなざわし", - "かのう", - "がはく", - "かぶか", - "かほう", - "かほご", - "かまう", - "かまぼこ", - "かめれおん", - "かゆい", - "かようび", - "からい", - "かるい", - "かろう", - "かわく", - "かわら", - "がんか", - "かんけい", - "かんこう", - "かんしゃ", - "かんそう", - "かんたん", - "かんち", - "がんばる", - "きあい", - "きあつ", - "きいろ", - "ぎいん", - "きうい", - "きうん", - "きえる", - "きおう", - "きおく", - "きおち", - "きおん", - "きかい", - "きかく", - "きかんしゃ", - "ききて", - "きくばり", - "きくらげ", - "きけんせい", - "きこう", - "きこえる", - "きこく", - "きさい", - "きさく", - "きさま", - "きさらぎ", - "ぎじかがく", - "ぎしき", - "ぎじたいけん", - "ぎじにってい", - "ぎじゅつしゃ", - "きすう", - "きせい", - "きせき", - "きせつ", - "きそう", - "きぞく", - "きぞん", - "きたえる", - "きちょう", - "きつえん", - "ぎっちり", - "きつつき", - "きつね", - "きてい", - "きどう", - "きどく", - "きない", - "きなが", - "きなこ", - "きぬごし", - "きねん", - "きのう", - "きのした", - "きはく", - "きびしい", - "きひん", - "きふく", - "きぶん", - "きぼう", - "きほん", - "きまる", - "きみつ", - "きむずかしい", - "きめる", - "きもだめし", - "きもち", - "きもの", - "きゃく", - "きやく", - "ぎゅうにく", - "きよう", - "きょうりゅう", - "きらい", - "きらく", - "きりん", - "きれい", - "きれつ", - "きろく", - "ぎろん", - "きわめる", - "ぎんいろ", - "きんかくじ", - "きんじょ", - "きんようび", - "ぐあい", - "くいず", - "くうかん", - "くうき", - "くうぐん", - "くうこう", - "ぐうせい", - "くうそう", - "ぐうたら", - "くうふく", - "くうぼ", - "くかん", - "くきょう", - "くげん", - "ぐこう", - "くさい", - "くさき", - "くさばな", - "くさる", - "くしゃみ", - "くしょう", - "くすのき", - "くすりゆび", - "くせげ", - "くせん", - "ぐたいてき", - "くださる", - "くたびれる", - "くちこみ", - "くちさき", - "くつした", - "ぐっすり", - "くつろぐ", - "くとうてん", - "くどく", - "くなん", - "くねくね", - "くのう", - "くふう", - "くみあわせ", - "くみたてる", - "くめる", - "くやくしょ", - "くらす", - "くらべる", - "くるま", - "くれる", - "くろう", - "くわしい", - "ぐんかん", - "ぐんしょく", - "ぐんたい", - "ぐんて", - "けあな", - "けいかく", - "けいけん", - "けいこ", - "けいさつ", - "げいじゅつ", - "けいたい", - "げいのうじん", - "けいれき", - "けいろ", - "けおとす", - "けおりもの", - "げきか", - "げきげん", - "げきだん", - "げきちん", - "げきとつ", - "げきは", - "げきやく", - "げこう", - "げこくじょう", - "げざい", - "けさき", - "げざん", - "けしき", - "けしごむ", - "けしょう", - "げすと", - "けたば", - "けちゃっぷ", - "けちらす", - "けつあつ", - "けつい", - "けつえき", - "けっこん", - "けつじょ", - "けっせき", - "けってい", - "けつまつ", - "げつようび", - "げつれい", - "けつろん", - "げどく", - "けとばす", - "けとる", - "けなげ", - "けなす", - "けなみ", - "けぬき", - "げねつ", - "けねん", - "けはい", - "げひん", - "けぶかい", - "げぼく", - "けまり", - "けみかる", - "けむし", - "けむり", - "けもの", - "けらい", - "けろけろ", - "けわしい", - "けんい", - "けんえつ", - "けんお", - "けんか", - "げんき", - "けんげん", - "けんこう", - "けんさく", - "けんしゅう", - "けんすう", - "げんそう", - "けんちく", - "けんてい", - "けんとう", - "けんない", - "けんにん", - "げんぶつ", - "けんま", - "けんみん", - "けんめい", - "けんらん", - "けんり", - "こあくま", - "こいぬ", - "こいびと", - "ごうい", - "こうえん", - "こうおん", - "こうかん", - "ごうきゅう", - "ごうけい", - "こうこう", - "こうさい", - "こうじ", - "こうすい", - "ごうせい", - "こうそく", - "こうたい", - "こうちゃ", - "こうつう", - "こうてい", - "こうどう", - "こうない", - "こうはい", - "ごうほう", - "ごうまん", - "こうもく", - "こうりつ", - "こえる", - "こおり", - "ごかい", - "ごがつ", - "ごかん", - "こくご", - "こくさい", - "こくとう", - "こくない", - "こくはく", - "こぐま", - "こけい", - "こける", - "ここのか", - "こころ", - "こさめ", - "こしつ", - "こすう", - "こせい", - "こせき", - "こぜん", - "こそだて", - "こたい", - "こたえる", - "こたつ", - "こちょう", - "こっか", - "こつこつ", - "こつばん", - "こつぶ", - "こてい", - "こてん", - "ことがら", - "ことし", - "ことば", - "ことり", - "こなごな", - "こねこね", - "このまま", - "このみ", - "このよ", - "ごはん", - "こひつじ", - "こふう", - "こふん", - "こぼれる", - "ごまあぶら", - "こまかい", - "ごますり", - "こまつな", - "こまる", - "こむぎこ", - "こもじ", - "こもち", - "こもの", - "こもん", - "こやく", - "こやま", - "こゆう", - "こゆび", - "こよい", - "こよう", - "こりる", - "これくしょん", - "ころっけ", - "こわもて", - "こわれる", - "こんいん", - "こんかい", - "こんき", - "こんしゅう", - "こんすい", - "こんだて", - "こんとん", - "こんなん", - "こんびに", - "こんぽん", - "こんまけ", - "こんや", - "こんれい", - "こんわく", - "ざいえき", - "さいかい", - "さいきん", - "ざいげん", - "ざいこ", - "さいしょ", - "さいせい", - "ざいたく", - "ざいちゅう", - "さいてき", - "ざいりょう", - "さうな", - "さかいし", - "さがす", - "さかな", - "さかみち", - "さがる", - "さぎょう", - "さくし", - "さくひん", - "さくら", - "さこく", - "さこつ", - "さずかる", - "ざせき", - "さたん", - "さつえい", - "ざつおん", - "ざっか", - "ざつがく", - "さっきょく", - "ざっし", - "さつじん", - "ざっそう", - "さつたば", - "さつまいも", - "さてい", - "さといも", - "さとう", - "さとおや", - "さとし", - "さとる", - "さのう", - "さばく", - "さびしい", - "さべつ", - "さほう", - "さほど", - "さます", - "さみしい", - "さみだれ", - "さむけ", - "さめる", - "さやえんどう", - "さゆう", - "さよう", - "さよく", - "さらだ", - "ざるそば", - "さわやか", - "さわる", - "さんいん", - "さんか", - "さんきゃく", - "さんこう", - "さんさい", - "ざんしょ", - "さんすう", - "さんせい", - "さんそ", - "さんち", - "さんま", - "さんみ", - "さんらん", - "しあい", - "しあげ", - "しあさって", - "しあわせ", - "しいく", - "しいん", - "しうち", - "しえい", - "しおけ", - "しかい", - "しかく", - "じかん", - "しごと", - "しすう", - "じだい", - "したうけ", - "したぎ", - "したて", - "したみ", - "しちょう", - "しちりん", - "しっかり", - "しつじ", - "しつもん", - "してい", - "してき", - "してつ", - "じてん", - "じどう", - "しなぎれ", - "しなもの", - "しなん", - "しねま", - "しねん", - "しのぐ", - "しのぶ", - "しはい", - "しばかり", - "しはつ", - "しはらい", - "しはん", - "しひょう", - "しふく", - "じぶん", - "しへい", - "しほう", - "しほん", - "しまう", - "しまる", - "しみん", - "しむける", - "じむしょ", - "しめい", - "しめる", - "しもん", - "しゃいん", - "しゃうん", - "しゃおん", - "じゃがいも", - "しやくしょ", - "しゃくほう", - "しゃけん", - "しゃこ", - "しゃざい", - "しゃしん", - "しゃせん", - "しゃそう", - "しゃたい", - "しゃちょう", - "しゃっきん", - "じゃま", - "しゃりん", - "しゃれい", - "じゆう", - "じゅうしょ", - "しゅくはく", - "じゅしん", - "しゅっせき", - "しゅみ", - "しゅらば", - "じゅんばん", - "しょうかい", - "しょくたく", - "しょっけん", - "しょどう", - "しょもつ", - "しらせる", - "しらべる", - "しんか", - "しんこう", - "じんじゃ", - "しんせいじ", - "しんちく", - "しんりん", - "すあげ", - "すあし", - "すあな", - "ずあん", - "すいえい", - "すいか", - "すいとう", - "ずいぶん", - "すいようび", - "すうがく", - "すうじつ", - "すうせん", - "すおどり", - "すきま", - "すくう", - "すくない", - "すける", - "すごい", - "すこし", - "ずさん", - "すずしい", - "すすむ", - "すすめる", - "すっかり", - "ずっしり", - "ずっと", - "すてき", - "すてる", - "すねる", - "すのこ", - "すはだ", - "すばらしい", - "ずひょう", - "ずぶぬれ", - "すぶり", - "すふれ", - "すべて", - "すべる", - "ずほう", - "すぼん", - "すまい", - "すめし", - "すもう", - "すやき", - "すらすら", - "するめ", - "すれちがう", - "すろっと", - "すわる", - "すんぜん", - "すんぽう", - "せあぶら", - "せいかつ", - "せいげん", - "せいじ", - "せいよう", - "せおう", - "せかいかん", - "せきにん", - "せきむ", - "せきゆ", - "せきらんうん", - "せけん", - "せこう", - "せすじ", - "せたい", - "せたけ", - "せっかく", - "せっきゃく", - "ぜっく", - "せっけん", - "せっこつ", - "せっさたくま", - "せつぞく", - "せつだん", - "せつでん", - "せっぱん", - "せつび", - "せつぶん", - "せつめい", - "せつりつ", - "せなか", - "せのび", - "せはば", - "せびろ", - "せぼね", - "せまい", - "せまる", - "せめる", - "せもたれ", - "せりふ", - "ぜんあく", - "せんい", - "せんえい", - "せんか", - "せんきょ", - "せんく", - "せんげん", - "ぜんご", - "せんさい", - "せんしゅ", - "せんすい", - "せんせい", - "せんぞ", - "せんたく", - "せんちょう", - "せんてい", - "せんとう", - "せんぬき", - "せんねん", - "せんぱい", - "ぜんぶ", - "ぜんぽう", - "せんむ", - "せんめんじょ", - "せんもん", - "せんやく", - "せんゆう", - "せんよう", - "ぜんら", - "ぜんりゃく", - "せんれい", - "せんろ", - "そあく", - "そいとげる", - "そいね", - "そうがんきょう", - "そうき", - "そうご", - "そうしん", - "そうだん", - "そうなん", - "そうび", - "そうめん", - "そうり", - "そえもの", - "そえん", - "そがい", - "そげき", - "そこう", - "そこそこ", - "そざい", - "そしな", - "そせい", - "そせん", - "そそぐ", - "そだてる", - "そつう", - "そつえん", - "そっかん", - "そつぎょう", - "そっけつ", - "そっこう", - "そっせん", - "そっと", - "そとがわ", - "そとづら", - "そなえる", - "そなた", - "そふぼ", - "そぼく", - "そぼろ", - "そまつ", - "そまる", - "そむく", - "そむりえ", - "そめる", - "そもそも", - "そよかぜ", - "そらまめ", - "そろう", - "そんかい", - "そんけい", - "そんざい", - "そんしつ", - "そんぞく", - "そんちょう", - "ぞんび", - "ぞんぶん", - "そんみん", - "たあい", - "たいいん", - "たいうん", - "たいえき", - "たいおう", - "だいがく", - "たいき", - "たいぐう", - "たいけん", - "たいこ", - "たいざい", - "だいじょうぶ", - "だいすき", - "たいせつ", - "たいそう", - "だいたい", - "たいちょう", - "たいてい", - "だいどころ", - "たいない", - "たいねつ", - "たいのう", - "たいはん", - "だいひょう", - "たいふう", - "たいへん", - "たいほ", - "たいまつばな", - "たいみんぐ", - "たいむ", - "たいめん", - "たいやき", - "たいよう", - "たいら", - "たいりょく", - "たいる", - "たいわん", - "たうえ", - "たえる", - "たおす", - "たおる", - "たおれる", - "たかい", - "たかね", - "たきび", - "たくさん", - "たこく", - "たこやき", - "たさい", - "たしざん", - "だじゃれ", - "たすける", - "たずさわる", - "たそがれ", - "たたかう", - "たたく", - "ただしい", - "たたみ", - "たちばな", - "だっかい", - "だっきゃく", - "だっこ", - "だっしゅつ", - "だったい", - "たてる", - "たとえる", - "たなばた", - "たにん", - "たぬき", - "たのしみ", - "たはつ", - "たぶん", - "たべる", - "たぼう", - "たまご", - "たまる", - "だむる", - "ためいき", - "ためす", - "ためる", - "たもつ", - "たやすい", - "たよる", - "たらす", - "たりきほんがん", - "たりょう", - "たりる", - "たると", - "たれる", - "たれんと", - "たろっと", - "たわむれる", - "だんあつ", - "たんい", - "たんおん", - "たんか", - "たんき", - "たんけん", - "たんご", - "たんさん", - "たんじょうび", - "だんせい", - "たんそく", - "たんたい", - "だんち", - "たんてい", - "たんとう", - "だんな", - "たんにん", - "だんねつ", - "たんのう", - "たんぴん", - "だんぼう", - "たんまつ", - "たんめい", - "だんれつ", - "だんろ", - "だんわ", - "ちあい", - "ちあん", - "ちいき", - "ちいさい", - "ちえん", - "ちかい", - "ちから", - "ちきゅう", - "ちきん", - "ちけいず", - "ちけん", - "ちこく", - "ちさい", - "ちしき", - "ちしりょう", - "ちせい", - "ちそう", - "ちたい", - "ちたん", - "ちちおや", - "ちつじょ", - "ちてき", - "ちてん", - "ちぬき", - "ちぬり", - "ちのう", - "ちひょう", - "ちへいせん", - "ちほう", - "ちまた", - "ちみつ", - "ちみどろ", - "ちめいど", - "ちゃんこなべ", - "ちゅうい", - "ちゆりょく", - "ちょうし", - "ちょさくけん", - "ちらし", - "ちらみ", - "ちりがみ", - "ちりょう", - "ちるど", - "ちわわ", - "ちんたい", - "ちんもく", - "ついか", - "ついたち", - "つうか", - "つうじょう", - "つうはん", - "つうわ", - "つかう", - "つかれる", - "つくね", - "つくる", - "つけね", - "つける", - "つごう", - "つたえる", - "つづく", - "つつじ", - "つつむ", - "つとめる", - "つながる", - "つなみ", - "つねづね", - "つのる", - "つぶす", - "つまらない", - "つまる", - "つみき", - "つめたい", - "つもり", - "つもる", - "つよい", - "つるぼ", - "つるみく", - "つわもの", - "つわり", - "てあし", - "てあて", - "てあみ", - "ていおん", - "ていか", - "ていき", - "ていけい", - "ていこく", - "ていさつ", - "ていし", - "ていせい", - "ていたい", - "ていど", - "ていねい", - "ていひょう", - "ていへん", - "ていぼう", - "てうち", - "ておくれ", - "てきとう", - "てくび", - "でこぼこ", - "てさぎょう", - "てさげ", - "てすり", - "てそう", - "てちがい", - "てちょう", - "てつがく", - "てつづき", - "でっぱ", - "てつぼう", - "てつや", - "でぬかえ", - "てぬき", - "てぬぐい", - "てのひら", - "てはい", - "てぶくろ", - "てふだ", - "てほどき", - "てほん", - "てまえ", - "てまきずし", - "てみじか", - "てみやげ", - "てらす", - "てれび", - "てわけ", - "てわたし", - "でんあつ", - "てんいん", - "てんかい", - "てんき", - "てんぐ", - "てんけん", - "てんごく", - "てんさい", - "てんし", - "てんすう", - "でんち", - "てんてき", - "てんとう", - "てんない", - "てんぷら", - "てんぼうだい", - "てんめつ", - "てんらんかい", - "でんりょく", - "でんわ", - "どあい", - "といれ", - "どうかん", - "とうきゅう", - "どうぐ", - "とうし", - "とうむぎ", - "とおい", - "とおか", - "とおく", - "とおす", - "とおる", - "とかい", - "とかす", - "ときおり", - "ときどき", - "とくい", - "とくしゅう", - "とくてん", - "とくに", - "とくべつ", - "とけい", - "とける", - "とこや", - "とさか", - "としょかん", - "とそう", - "とたん", - "とちゅう", - "とっきゅう", - "とっくん", - "とつぜん", - "とつにゅう", - "とどける", - "ととのえる", - "とない", - "となえる", - "となり", - "とのさま", - "とばす", - "どぶがわ", - "とほう", - "とまる", - "とめる", - "ともだち", - "ともる", - "どようび", - "とらえる", - "とんかつ", - "どんぶり", - "ないかく", - "ないこう", - "ないしょ", - "ないす", - "ないせん", - "ないそう", - "なおす", - "ながい", - "なくす", - "なげる", - "なこうど", - "なさけ", - "なたでここ", - "なっとう", - "なつやすみ", - "ななおし", - "なにごと", - "なにもの", - "なにわ", - "なのか", - "なふだ", - "なまいき", - "なまえ", - "なまみ", - "なみだ", - "なめらか", - "なめる", - "なやむ", - "ならう", - "ならび", - "ならぶ", - "なれる", - "なわとび", - "なわばり", - "にあう", - "にいがた", - "にうけ", - "におい", - "にかい", - "にがて", - "にきび", - "にくしみ", - "にくまん", - "にげる", - "にさんかたんそ", - "にしき", - "にせもの", - "にちじょう", - "にちようび", - "にっか", - "にっき", - "にっけい", - "にっこう", - "にっさん", - "にっしょく", - "にっすう", - "にっせき", - "にってい", - "になう", - "にほん", - "にまめ", - "にもつ", - "にやり", - "にゅういん", - "にりんしゃ", - "にわとり", - "にんい", - "にんか", - "にんき", - "にんげん", - "にんしき", - "にんずう", - "にんそう", - "にんたい", - "にんち", - "にんてい", - "にんにく", - "にんぷ", - "にんまり", - "にんむ", - "にんめい", - "にんよう", - "ぬいくぎ", - "ぬかす", - "ぬぐいとる", - "ぬぐう", - "ぬくもり", - "ぬすむ", - "ぬまえび", - "ぬめり", - "ぬらす", - "ぬんちゃく", - "ねあげ", - "ねいき", - "ねいる", - "ねいろ", - "ねぐせ", - "ねくたい", - "ねくら", - "ねこぜ", - "ねこむ", - "ねさげ", - "ねすごす", - "ねそべる", - "ねだん", - "ねつい", - "ねっしん", - "ねつぞう", - "ねったいぎょ", - "ねぶそく", - "ねふだ", - "ねぼう", - "ねほりはほり", - "ねまき", - "ねまわし", - "ねみみ", - "ねむい", - "ねむたい", - "ねもと", - "ねらう", - "ねわざ", - "ねんいり", - "ねんおし", - "ねんかん", - "ねんきん", - "ねんぐ", - "ねんざ", - "ねんし", - "ねんちゃく", - "ねんど", - "ねんぴ", - "ねんぶつ", - "ねんまつ", - "ねんりょう", - "ねんれい", - "のいず", - "のおづま", - "のがす", - "のきなみ", - "のこぎり", - "のこす", - "のこる", - "のせる", - "のぞく", - "のぞむ", - "のたまう", - "のちほど", - "のっく", - "のばす", - "のはら", - "のべる", - "のぼる", - "のみもの", - "のやま", - "のらいぬ", - "のらねこ", - "のりもの", - "のりゆき", - "のれん", - "のんき", - "ばあい", - "はあく", - "ばあさん", - "ばいか", - "ばいく", - "はいけん", - "はいご", - "はいしん", - "はいすい", - "はいせん", - "はいそう", - "はいち", - "ばいばい", - "はいれつ", - "はえる", - "はおる", - "はかい", - "ばかり", - "はかる", - "はくしゅ", - "はけん", - "はこぶ", - "はさみ", - "はさん", - "はしご", - "ばしょ", - "はしる", - "はせる", - "ぱそこん", - "はそん", - "はたん", - "はちみつ", - "はつおん", - "はっかく", - "はづき", - "はっきり", - "はっくつ", - "はっけん", - "はっこう", - "はっさん", - "はっしん", - "はったつ", - "はっちゅう", - "はってん", - "はっぴょう", - "はっぽう", - "はなす", - "はなび", - "はにかむ", - "はぶらし", - "はみがき", - "はむかう", - "はめつ", - "はやい", - "はやし", - "はらう", - "はろうぃん", - "はわい", - "はんい", - "はんえい", - "はんおん", - "はんかく", - "はんきょう", - "ばんぐみ", - "はんこ", - "はんしゃ", - "はんすう", - "はんだん", - "ぱんち", - "ぱんつ", - "はんてい", - "はんとし", - "はんのう", - "はんぱ", - "はんぶん", - "はんぺん", - "はんぼうき", - "はんめい", - "はんらん", - "はんろん", - "ひいき", - "ひうん", - "ひえる", - "ひかく", - "ひかり", - "ひかる", - "ひかん", - "ひくい", - "ひけつ", - "ひこうき", - "ひこく", - "ひさい", - "ひさしぶり", - "ひさん", - "びじゅつかん", - "ひしょ" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/jbo.rs b/networks/monero/wallet/seed/src/words/jbo.rs deleted file mode 100644 index a58f8d11a..000000000 --- a/networks/monero/wallet/seed/src/words/jbo.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "backi", - "bacru", - "badna", - "badri", - "bajra", - "bakfu", - "bakni", - "bakri", - "baktu", - "balji", - "balni", - "balre", - "balvi", - "bambu", - "bancu", - "bandu", - "banfi", - "bangu", - "banli", - "banro", - "banxa", - "banzu", - "bapli", - "barda", - "bargu", - "barja", - "barna", - "bartu", - "basfa", - "basna", - "basti", - "batci", - "batke", - "bavmi", - "baxso", - "bebna", - "bekpi", - "bemro", - "bende", - "bengo", - "benji", - "benre", - "benzo", - "bergu", - "bersa", - "berti", - "besna", - "besto", - "betfu", - "betri", - "bevri", - "bidju", - "bifce", - "bikla", - "bilga", - "bilma", - "bilni", - "bindo", - "binra", - "binxo", - "birje", - "birka", - "birti", - "bisli", - "bitmu", - "bitni", - "blabi", - "blaci", - "blanu", - "bliku", - "bloti", - "bolci", - "bongu", - "boske", - "botpi", - "boxfo", - "boxna", - "bradi", - "brano", - "bratu", - "brazo", - "bredi", - "bridi", - "brife", - "briju", - "brito", - "brivo", - "broda", - "bruna", - "budjo", - "bukpu", - "bumru", - "bunda", - "bunre", - "burcu", - "burna", - "cabna", - "cabra", - "cacra", - "cadga", - "cadzu", - "cafne", - "cagna", - "cakla", - "calku", - "calse", - "canci", - "cando", - "cange", - "canja", - "canko", - "canlu", - "canpa", - "canre", - "canti", - "carce", - "carfu", - "carmi", - "carna", - "cartu", - "carvi", - "casnu", - "catke", - "catlu", - "catni", - "catra", - "caxno", - "cecla", - "cecmu", - "cedra", - "cenba", - "censa", - "centi", - "cerda", - "cerni", - "certu", - "cevni", - "cfale", - "cfari", - "cfika", - "cfila", - "cfine", - "cfipu", - "ciblu", - "cicna", - "cidja", - "cidni", - "cidro", - "cifnu", - "cigla", - "cikna", - "cikre", - "ciksi", - "cilce", - "cilfu", - "cilmo", - "cilre", - "cilta", - "cimde", - "cimni", - "cinba", - "cindu", - "cinfo", - "cinje", - "cinki", - "cinla", - "cinmo", - "cinri", - "cinse", - "cinta", - "cinza", - "cipni", - "cipra", - "cirko", - "cirla", - "ciska", - "cisma", - "cisni", - "ciste", - "citka", - "citno", - "citri", - "citsi", - "civla", - "cizra", - "ckabu", - "ckafi", - "ckaji", - "ckana", - "ckape", - "ckasu", - "ckeji", - "ckiku", - "ckilu", - "ckini", - "ckire", - "ckule", - "ckunu", - "cladu", - "clani", - "claxu", - "cletu", - "clika", - "clinu", - "clira", - "clite", - "cliva", - "clupa", - "cmaci", - "cmalu", - "cmana", - "cmavo", - "cmene", - "cmeta", - "cmevo", - "cmila", - "cmima", - "cmoni", - "cnano", - "cnebo", - "cnemu", - "cnici", - "cnino", - "cnisa", - "cnita", - "cokcu", - "condi", - "conka", - "corci", - "cortu", - "cpacu", - "cpana", - "cpare", - "cpedu", - "cpina", - "cradi", - "crane", - "creka", - "crepu", - "cribe", - "crida", - "crino", - "cripu", - "crisa", - "critu", - "ctaru", - "ctebi", - "cteki", - "ctile", - "ctino", - "ctuca", - "cukla", - "cukre", - "cukta", - "culno", - "cumki", - "cumla", - "cunmi", - "cunso", - "cuntu", - "cupra", - "curmi", - "curnu", - "curve", - "cusku", - "cusna", - "cutci", - "cutne", - "cuxna", - "dacru", - "dacti", - "dadjo", - "dakfu", - "dakli", - "damba", - "damri", - "dandu", - "danfu", - "danlu", - "danmo", - "danre", - "dansu", - "danti", - "daplu", - "dapma", - "darca", - "dargu", - "darlu", - "darno", - "darsi", - "darxi", - "daski", - "dasni", - "daspo", - "dasri", - "datka", - "datni", - "datro", - "decti", - "degji", - "dejni", - "dekpu", - "dekto", - "delno", - "dembi", - "denci", - "denmi", - "denpa", - "dertu", - "derxi", - "desku", - "detri", - "dicma", - "dicra", - "didni", - "digno", - "dikca", - "diklo", - "dikni", - "dilcu", - "dilma", - "dilnu", - "dimna", - "dindi", - "dinju", - "dinko", - "dinso", - "dirba", - "dirce", - "dirgo", - "disko", - "ditcu", - "divzi", - "dizlo", - "djacu", - "djedi", - "djica", - "djine", - "djuno", - "donri", - "dotco", - "draci", - "drani", - "drata", - "drudi", - "dugri", - "dukse", - "dukti", - "dunda", - "dunja", - "dunku", - "dunli", - "dunra", - "dutso", - "dzena", - "dzipo", - "facki", - "fadni", - "fagri", - "falnu", - "famti", - "fancu", - "fange", - "fanmo", - "fanri", - "fanta", - "fanva", - "fanza", - "fapro", - "farka", - "farlu", - "farna", - "farvi", - "fasnu", - "fatci", - "fatne", - "fatri", - "febvi", - "fegli", - "femti", - "fendi", - "fengu", - "fenki", - "fenra", - "fenso", - "fepni", - "fepri", - "ferti", - "festi", - "fetsi", - "figre", - "filso", - "finpe", - "finti", - "firca", - "fisli", - "fizbu", - "flaci", - "flalu", - "flani", - "flecu", - "flese", - "fliba", - "flira", - "foldi", - "fonmo", - "fonxa", - "forca", - "forse", - "fraso", - "frati", - "fraxu", - "frica", - "friko", - "frili", - "frinu", - "friti", - "frumu", - "fukpi", - "fulta", - "funca", - "fusra", - "fuzme", - "gacri", - "gadri", - "galfi", - "galtu", - "galxe", - "ganlo", - "ganra", - "ganse", - "ganti", - "ganxo", - "ganzu", - "gapci", - "gapru", - "garna", - "gasnu", - "gaspo", - "gasta", - "genja", - "gento", - "genxu", - "gerku", - "gerna", - "gidva", - "gigdo", - "ginka", - "girzu", - "gismu", - "glare", - "gleki", - "gletu", - "glico", - "glife", - "glosa", - "gluta", - "gocti", - "gomsi", - "gotro", - "gradu", - "grafu", - "grake", - "grana", - "grasu", - "grava", - "greku", - "grusi", - "grute", - "gubni", - "gugde", - "gugle", - "gumri", - "gundi", - "gunka", - "gunma", - "gunro", - "gunse", - "gunta", - "gurni", - "guska", - "gusni", - "gusta", - "gutci", - "gutra", - "guzme", - "jabre", - "jadni", - "jakne", - "jalge", - "jalna", - "jalra", - "jamfu", - "jamna", - "janbe", - "janco", - "janli", - "jansu", - "janta", - "jarbu", - "jarco", - "jarki", - "jaspu", - "jatna", - "javni", - "jbama", - "jbari", - "jbena", - "jbera", - "jbini", - "jdari", - "jdice", - "jdika", - "jdima", - "jdini", - "jduli", - "jecta", - "jeftu", - "jegvo", - "jelca", - "jemna", - "jenca", - "jendu", - "jenmi", - "jensi", - "jerna", - "jersi", - "jerxo", - "jesni", - "jetce", - "jetnu", - "jgalu", - "jganu", - "jgari", - "jgena", - "jgina", - "jgira", - "jgita", - "jibni", - "jibri", - "jicla", - "jicmu", - "jijnu", - "jikca", - "jikfi", - "jikni", - "jikru", - "jilka", - "jilra", - "jimca", - "jimpe", - "jimte", - "jinci", - "jinda", - "jinga", - "jinku", - "jinme", - "jinru", - "jinsa", - "jinto", - "jinvi", - "jinzi", - "jipci", - "jipno", - "jirna", - "jisra", - "jitfa", - "jitro", - "jivbu", - "jivna", - "jmaji", - "jmifa", - "jmina", - "jmive", - "jonse", - "jordo", - "jorne", - "jubme", - "judri", - "jufra", - "jukni", - "jukpa", - "julne", - "julro", - "jundi", - "jungo", - "junla", - "junri", - "junta", - "jurme", - "jursa", - "jutsi", - "juxre", - "jvinu", - "jviso", - "kabri", - "kacma", - "kadno", - "kafke", - "kagni", - "kajde", - "kajna", - "kakne", - "kakpa", - "kalci", - "kalri", - "kalsa", - "kalte", - "kamju", - "kamni", - "kampu", - "kamre", - "kanba", - "kancu", - "kandi", - "kanji", - "kanla", - "kanpe", - "kanro", - "kansa", - "kantu", - "kanxe", - "karbi", - "karce", - "karda", - "kargu", - "karli", - "karni", - "katci", - "katna", - "kavbu", - "kazra", - "kecti", - "kekli", - "kelci", - "kelvo", - "kenka", - "kenra", - "kensa", - "kerfa", - "kerlo", - "kesri", - "ketco", - "ketsu", - "kevna", - "kibro", - "kicne", - "kijno", - "kilto", - "kinda", - "kinli", - "kisto", - "klaji", - "klaku", - "klama", - "klani", - "klesi", - "kliki", - "klina", - "kliru", - "kliti", - "klupe", - "kluza", - "kobli", - "kogno", - "kojna", - "kokso", - "kolme", - "komcu", - "konju", - "korbi", - "korcu", - "korka", - "korvo", - "kosmu", - "kosta", - "krali", - "kramu", - "krasi", - "krati", - "krefu", - "krici", - "krili", - "krinu", - "krixa", - "kruca", - "kruji", - "kruvi", - "kubli", - "kucli", - "kufra", - "kukte", - "kulnu", - "kumfa", - "kumte", - "kunra", - "kunti", - "kurfa", - "kurji", - "kurki", - "kuspe", - "kusru", - "labno", - "lacni", - "lacpu", - "lacri", - "ladru", - "lafti", - "lakne", - "lakse", - "laldo", - "lalxu", - "lamji", - "lanbi", - "lanci", - "landa", - "lanka", - "lanli", - "lanme", - "lante", - "lanxe", - "lanzu", - "larcu", - "larva", - "lasna", - "lastu", - "latmo", - "latna", - "lazni", - "lebna", - "lelxe", - "lenga", - "lenjo", - "lenku", - "lerci", - "lerfu", - "libjo", - "lidne", - "lifri", - "lijda", - "limfa", - "limna", - "lince", - "lindi", - "linga", - "linji", - "linsi", - "linto", - "lisri", - "liste", - "litce", - "litki", - "litru", - "livga", - "livla", - "logji", - "loglo", - "lojbo", - "loldi", - "lorxu", - "lubno", - "lujvo", - "luksi", - "lumci", - "lunbe", - "lunra", - "lunsa", - "luska", - "lusto", - "mabla", - "mabru", - "macnu", - "majga", - "makcu", - "makfa", - "maksi", - "malsi", - "mamta", - "manci", - "manfo", - "mango", - "manku", - "manri", - "mansa", - "manti", - "mapku", - "mapni", - "mapra", - "mapti", - "marbi", - "marce", - "marde", - "margu", - "marji", - "marna", - "marxa", - "masno", - "masti", - "matci", - "matli", - "matne", - "matra", - "mavji", - "maxri", - "mebri", - "megdo", - "mekso", - "melbi", - "meljo", - "melmi", - "menli", - "menre", - "mensi", - "mentu", - "merko", - "merli", - "metfo", - "mexno", - "midju", - "mifra", - "mikce", - "mikri", - "milti", - "milxe", - "minde", - "minji", - "minli", - "minra", - "mintu", - "mipri", - "mirli", - "misno", - "misro", - "mitre", - "mixre", - "mlana", - "mlatu", - "mleca", - "mledi", - "mluni", - "mogle", - "mokca", - "moklu", - "molki", - "molro", - "morji", - "morko", - "morna", - "morsi", - "mosra", - "mraji", - "mrilu", - "mruli", - "mucti", - "mudri", - "mugle", - "mukti", - "mulno", - "munje", - "mupli", - "murse", - "murta", - "muslo", - "mutce", - "muvdu", - "muzga", - "nabmi", - "nakni", - "nalci", - "namcu", - "nanba", - "nanca", - "nandu", - "nanla", - "nanmu", - "nanvi", - "narge", - "narju", - "natfe", - "natmi", - "natsi", - "navni", - "naxle", - "nazbi", - "nejni", - "nelci", - "nenri", - "nerde", - "nibli", - "nicfa", - "nicte", - "nikle", - "nilce", - "nimre", - "ninja", - "ninmu", - "nirna", - "nitcu", - "nivji", - "nixli", - "nobli", - "norgo", - "notci", - "nudle", - "nukni", - "nunmu", - "nupre", - "nurma", - "nusna", - "nutka", - "nutli", - "nuzba", - "nuzlo", - "pacna", - "pagbu", - "pagre", - "pajni", - "palci", - "palku", - "palma", - "palne", - "palpi", - "palta", - "pambe", - "pamga", - "panci", - "pandi", - "panje", - "panka", - "panlo", - "panpi", - "panra", - "pante", - "panzi", - "papri", - "parbi", - "pardu", - "parji", - "pastu", - "patfu", - "patlu", - "patxu", - "paznu", - "pelji", - "pelxu", - "pemci", - "penbi", - "pencu", - "pendo", - "penmi", - "pensi", - "pentu", - "perli", - "pesxu", - "petso", - "pevna", - "pezli", - "picti", - "pijne", - "pikci", - "pikta", - "pilda", - "pilji", - "pilka", - "pilno", - "pimlu", - "pinca", - "pindi", - "pinfu", - "pinji", - "pinka", - "pinsi", - "pinta", - "pinxe", - "pipno", - "pixra", - "plana", - "platu", - "pleji", - "plibu", - "plini", - "plipe", - "plise", - "plita", - "plixa", - "pluja", - "pluka", - "pluta", - "pocli", - "polje", - "polno", - "ponjo", - "ponse", - "poplu", - "porpi", - "porsi", - "porto", - "prali", - "prami", - "prane", - "preja", - "prenu", - "preri", - "preti", - "prije", - "prina", - "pritu", - "proga", - "prosa", - "pruce", - "pruni", - "pruri", - "pruxi", - "pulce", - "pulji", - "pulni", - "punji", - "punli", - "pupsu", - "purci", - "purdi", - "purmo", - "racli", - "ractu", - "radno", - "rafsi", - "ragbi", - "ragve", - "rakle", - "rakso", - "raktu", - "ralci", - "ralju", - "ralte", - "randa", - "rango", - "ranji", - "ranmi", - "ransu", - "ranti", - "ranxi", - "rapli", - "rarna", - "ratcu", - "ratni", - "rebla", - "rectu", - "rekto", - "remna", - "renro", - "renvi", - "respa", - "rexsa", - "ricfu", - "rigni", - "rijno", - "rilti", - "rimni", - "rinci", - "rindo", - "rinju", - "rinka", - "rinsa", - "rirci", - "rirni", - "rirxe", - "rismi", - "risna", - "ritli", - "rivbi", - "rokci", - "romge", - "romlo", - "ronte", - "ropno", - "rorci", - "rotsu", - "rozgu", - "ruble", - "rufsu", - "runme", - "runta", - "rupnu", - "rusko", - "rutni", - "sabji", - "sabnu", - "sacki", - "saclu", - "sadjo", - "sakci", - "sakli", - "sakta", - "salci", - "salpo", - "salri", - "salta", - "samcu", - "sampu", - "sanbu", - "sance", - "sanga", - "sanji", - "sanli", - "sanmi", - "sanso", - "santa", - "sarcu", - "sarji", - "sarlu", - "sarni", - "sarxe", - "saske", - "satci", - "satre", - "savru", - "sazri", - "sefsi", - "sefta", - "sekre", - "selci", - "selfu", - "semto", - "senci", - "sengi", - "senpi", - "senta", - "senva", - "sepli", - "serti", - "sesre", - "setca", - "sevzi", - "sfani", - "sfasa", - "sfofa", - "sfubu", - "sibli", - "siclu", - "sicni", - "sicpi", - "sidbo", - "sidju", - "sigja", - "sigma", - "sikta", - "silka", - "silna", - "simlu", - "simsa", - "simxu", - "since", - "sinma", - "sinso", - "sinxa", - "sipna", - "sirji", - "sirxo", - "sisku", - "sisti", - "sitna", - "sivni", - "skaci", - "skami", - "skapi", - "skari", - "skicu", - "skiji", - "skina", - "skori", - "skoto", - "skuba", - "skuro", - "slabu", - "slaka", - "slami", - "slanu", - "slari", - "slasi", - "sligu", - "slilu", - "sliri", - "slovo", - "sluji", - "sluni", - "smacu", - "smadi", - "smaji", - "smaka", - "smani", - "smela", - "smoka", - "smuci", - "smuni", - "smusu", - "snada", - "snanu", - "snidu", - "snime", - "snipa", - "snuji", - "snura", - "snuti", - "sobde", - "sodna", - "sodva", - "softo", - "solji", - "solri", - "sombo", - "sonci", - "sorcu", - "sorgu", - "sorni", - "sorta", - "sovda", - "spaji", - "spali", - "spano", - "spati", - "speni", - "spero", - "spisa", - "spita", - "spofu", - "spoja", - "spuda", - "sputu", - "sraji", - "sraku", - "sralo", - "srana", - "srasu", - "srera", - "srito", - "sruma", - "sruri", - "stace", - "stagi", - "staku", - "stali", - "stani", - "stapa", - "stasu", - "stati", - "steba", - "steci", - "stedu", - "stela", - "stero", - "stici", - "stidi", - "stika", - "stizu", - "stodi", - "stuna", - "stura", - "stuzi", - "sucta", - "sudga", - "sufti", - "suksa", - "sumji", - "sumne", - "sumti", - "sunga", - "sunla", - "surla", - "sutra", - "tabno", - "tabra", - "tadji", - "tadni", - "tagji", - "taksi", - "talsa", - "tamca", - "tamji", - "tamne", - "tanbo", - "tance", - "tanjo", - "tanko", - "tanru", - "tansi", - "tanxe", - "tapla", - "tarbi", - "tarci", - "tarla", - "tarmi", - "tarti", - "taske", - "tasmi", - "tasta", - "tatpi", - "tatru", - "tavla", - "taxfu", - "tcaci", - "tcadu", - "tcana", - "tcati", - "tcaxe", - "tcena", - "tcese", - "tcica", - "tcidu", - "tcika", - "tcila", - "tcima", - "tcini", - "tcita", - "temci", - "temse", - "tende", - "tenfa", - "tengu", - "terdi", - "terpa", - "terto", - "tifri", - "tigni", - "tigra", - "tikpa", - "tilju", - "tinbe", - "tinci", - "tinsa", - "tirna", - "tirse", - "tirxu", - "tisna", - "titla", - "tivni", - "tixnu", - "toknu", - "toldi", - "tonga", - "tordu", - "torni", - "torso", - "traji", - "trano", - "trati", - "trene", - "tricu", - "trina", - "trixe", - "troci", - "tsaba", - "tsali", - "tsani", - "tsapi", - "tsiju", - "tsina", - "tsuku", - "tubnu", - "tubra", - "tugni", - "tujli", - "tumla", - "tunba", - "tunka", - "tunlo", - "tunta", - "tuple", - "turko", - "turni", - "tutci", - "tutle", - "tutra", - "vacri", - "vajni", - "valsi", - "vamji", - "vamtu", - "vanbi", - "vanci", - "vanju", - "vasru", - "vasxu", - "vecnu", - "vedli", - "venfu", - "vensa", - "vente", - "vepre", - "verba", - "vibna", - "vidni", - "vidru", - "vifne", - "vikmi", - "viknu", - "vimcu", - "vindu", - "vinji", - "vinta", - "vipsi", - "virnu", - "viska", - "vitci", - "vitke", - "vitno", - "vlagi", - "vlile", - "vlina", - "vlipa", - "vofli", - "voksa", - "volve", - "vorme", - "vraga", - "vreji", - "vreta", - "vrici", - "vrude", - "vrusi", - "vubla", - "vujnu", - "vukna", - "vukro", - "xabju", - "xadba", - "xadji", - "xadni", - "xagji", - "xagri", - "xajmi", - "xaksu", - "xalbo", - "xalka", - "xalni", - "xamgu", - "xampo", - "xamsi", - "xance", - "xango", - "xanka", - "xanri", - "xansa", - "xanto", - "xarci", - "xarju", - "xarnu", - "xasli", - "xasne", - "xatra", - "xatsi", - "xazdo", - "xebni", - "xebro", - "xecto", - "xedja", - "xekri", - "xelso", - "xendo", - "xenru", - "xexso", - "xigzo", - "xindo", - "xinmo", - "xirma", - "xislu", - "xispo", - "xlali", - "xlura", - "xorbo", - "xorlo", - "xotli", - "xrabo", - "xrani", - "xriso", - "xrotu", - "xruba", - "xruki", - "xrula", - "xruti", - "xukmi", - "xulta", - "xunre", - "xurdo", - "xusra", - "xutla", - "zabna", - "zajba", - "zalvi", - "zanru", - "zarci", - "zargu", - "zasni", - "zasti", - "zbabu", - "zbani", - "zbasu", - "zbepi", - "zdani", - "zdile", - "zekri", - "zenba", - "zepti", - "zetro", - "zevla", - "zgadi", - "zgana", - "zgike", - "zifre", - "zinki", - "zirpu", - "zivle", - "zmadu", - "zmiku", - "zucna", - "zukte", - "zumri", - "zungi", - "zunle", - "zunti", - "zutse", - "zvati", - "zviki", - "jbobau", - "jbopre", - "karsna", - "cabdei", - "zunsna", - "gendra", - "glibau", - "nintadni", - "pavyseljirna", - "vlaste", - "selbri", - "latro'a", - "zdakemkulgu'a", - "mriste", - "selsku", - "fu'ivla", - "tolmo'i", - "snavei", - "xagmau", - "retsku", - "ckupau", - "skudji", - "smudra", - "prulamdei", - "vokta'a", - "tinju'i", - "jefyfa'o", - "bavlamdei", - "kinzga", - "jbocre", - "jbovla", - "xauzma", - "selkei", - "xuncku", - "spusku", - "jbogu'e", - "pampe'o", - "bripre", - "jbosnu", - "zi'evla", - "gimste", - "tolzdi", - "velski", - "samselpla", - "cnegau", - "velcki", - "selja'e", - "fasybau", - "zanfri", - "reisku", - "favgau", - "jbota'a", - "rejgau", - "malgli", - "zilkai", - "keidji", - "tersu'i", - "jbofi'e", - "cnima'o", - "mulgau", - "ningau", - "ponbau", - "mrobi'o", - "rarbau", - "zmanei", - "famyma'o", - "vacysai", - "jetmlu", - "jbonunsla", - "nunpe'i", - "fa'orma'o", - "crezenzu'e", - "jbojbe", - "cmicu'a", - "zilcmi", - "tolcando", - "zukcfu", - "depybu'i", - "mencre", - "matmau", - "nunctu", - "selma'o", - "titnanba", - "naldra", - "jvajvo", - "nunsnu", - "nerkla", - "cimjvo", - "muvgau", - "zipcpi", - "runbau", - "faumlu", - "terbri", - "balcu'e", - "dragau", - "smuvelcki", - "piksku", - "selpli", - "bregau", - "zvafa'i", - "ci'izra", - "noltruti'u", - "samtci", - "snaxa'a" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/nl.rs b/networks/monero/wallet/seed/src/words/nl.rs deleted file mode 100644 index 0c191e7f0..000000000 --- a/networks/monero/wallet/seed/src/words/nl.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "aalglad", - "aalscholver", - "aambeeld", - "aangeef", - "aanlandig", - "aanvaard", - "aanwakker", - "aapmens", - "aarten", - "abdicatie", - "abnormaal", - "abrikoos", - "accu", - "acuut", - "adjudant", - "admiraal", - "advies", - "afbidding", - "afdracht", - "affaire", - "affiche", - "afgang", - "afkick", - "afknap", - "aflees", - "afmijner", - "afname", - "afpreekt", - "afrader", - "afspeel", - "aftocht", - "aftrek", - "afzijdig", - "ahornboom", - "aktetas", - "akzo", - "alchemist", - "alcohol", - "aldaar", - "alexander", - "alfabet", - "alfredo", - "alice", - "alikruik", - "allrisk", - "altsax", - "alufolie", - "alziend", - "amai", - "ambacht", - "ambieer", - "amina", - "amnestie", - "amok", - "ampul", - "amuzikaal", - "angela", - "aniek", - "antje", - "antwerpen", - "anya", - "aorta", - "apache", - "apekool", - "appelaar", - "arganolie", - "argeloos", - "armoede", - "arrenslee", - "artritis", - "arubaan", - "asbak", - "ascii", - "asgrauw", - "asjes", - "asml", - "aspunt", - "asurn", - "asveld", - "aterling", - "atomair", - "atrium", - "atsma", - "atypisch", - "auping", - "aura", - "avifauna", - "axiaal", - "azoriaan", - "azteek", - "azuur", - "bachelor", - "badderen", - "badhotel", - "badmantel", - "badsteden", - "balie", - "ballans", - "balvers", - "bamibal", - "banneling", - "barracuda", - "basaal", - "batelaan", - "batje", - "beambte", - "bedlamp", - "bedwelmd", - "befaamd", - "begierd", - "begraaf", - "behield", - "beijaard", - "bejaagd", - "bekaaid", - "beks", - "bektas", - "belaad", - "belboei", - "belderbos", - "beloerd", - "beluchten", - "bemiddeld", - "benadeeld", - "benijd", - "berechten", - "beroemd", - "besef", - "besseling", - "best", - "betichten", - "bevind", - "bevochten", - "bevraagd", - "bewust", - "bidplaats", - "biefstuk", - "biemans", - "biezen", - "bijbaan", - "bijeenkom", - "bijfiguur", - "bijkaart", - "bijlage", - "bijpaard", - "bijtgaar", - "bijweg", - "bimmel", - "binck", - "bint", - "biobak", - "biotisch", - "biseks", - "bistro", - "bitter", - "bitumen", - "bizar", - "blad", - "bleken", - "blender", - "bleu", - "blief", - "blijven", - "blozen", - "bock", - "boef", - "boei", - "boks", - "bolder", - "bolus", - "bolvormig", - "bomaanval", - "bombarde", - "bomma", - "bomtapijt", - "bookmaker", - "boos", - "borg", - "bosbes", - "boshuizen", - "bosloop", - "botanicus", - "bougie", - "bovag", - "boxspring", - "braad", - "brasem", - "brevet", - "brigade", - "brinckman", - "bruid", - "budget", - "buffel", - "buks", - "bulgaar", - "buma", - "butaan", - "butler", - "buuf", - "cactus", - "cafeetje", - "camcorder", - "cannabis", - "canyon", - "capoeira", - "capsule", - "carkit", - "casanova", - "catalaan", - "ceintuur", - "celdeling", - "celplasma", - "cement", - "censeren", - "ceramisch", - "cerberus", - "cerebraal", - "cesium", - "cirkel", - "citeer", - "civiel", - "claxon", - "clenbuterol", - "clicheren", - "clijsen", - "coalitie", - "coassistentschap", - "coaxiaal", - "codetaal", - "cofinanciering", - "cognac", - "coltrui", - "comfort", - "commandant", - "condensaat", - "confectie", - "conifeer", - "convector", - "copier", - "corfu", - "correct", - "coup", - "couvert", - "creatie", - "credit", - "crematie", - "cricket", - "croupier", - "cruciaal", - "cruijff", - "cuisine", - "culemborg", - "culinair", - "curve", - "cyrano", - "dactylus", - "dading", - "dagblind", - "dagje", - "daglicht", - "dagprijs", - "dagranden", - "dakdekker", - "dakpark", - "dakterras", - "dalgrond", - "dambord", - "damkat", - "damlengte", - "damman", - "danenberg", - "debbie", - "decibel", - "defect", - "deformeer", - "degelijk", - "degradant", - "dejonghe", - "dekken", - "deppen", - "derek", - "derf", - "derhalve", - "detineren", - "devalueer", - "diaken", - "dicht", - "dictaat", - "dief", - "digitaal", - "dijbreuk", - "dijkmans", - "dimbaar", - "dinsdag", - "diode", - "dirigeer", - "disbalans", - "dobermann", - "doenbaar", - "doerak", - "dogma", - "dokhaven", - "dokwerker", - "doling", - "dolphijn", - "dolven", - "dombo", - "dooraderd", - "dopeling", - "doping", - "draderig", - "drama", - "drenkbak", - "dreumes", - "drol", - "drug", - "duaal", - "dublin", - "duplicaat", - "durven", - "dusdanig", - "dutchbat", - "dutje", - "dutten", - "duur", - "duwwerk", - "dwaal", - "dweil", - "dwing", - "dyslexie", - "ecostroom", - "ecotaks", - "educatie", - "eeckhout", - "eede", - "eemland", - "eencellig", - "eeneiig", - "eenruiter", - "eenwinter", - "eerenberg", - "eerrover", - "eersel", - "eetmaal", - "efteling", - "egaal", - "egtberts", - "eickhoff", - "eidooier", - "eiland", - "eind", - "eisden", - "ekster", - "elburg", - "elevatie", - "elfkoppig", - "elfrink", - "elftal", - "elimineer", - "elleboog", - "elma", - "elodie", - "elsa", - "embleem", - "embolie", - "emoe", - "emonds", - "emplooi", - "enduro", - "enfin", - "engageer", - "entourage", - "entstof", - "epileer", - "episch", - "eppo", - "erasmus", - "erboven", - "erebaan", - "erelijst", - "ereronden", - "ereteken", - "erfhuis", - "erfwet", - "erger", - "erica", - "ermitage", - "erna", - "ernie", - "erts", - "ertussen", - "eruitzien", - "ervaar", - "erven", - "erwt", - "esbeek", - "escort", - "esdoorn", - "essing", - "etage", - "eter", - "ethanol", - "ethicus", - "etholoog", - "eufonisch", - "eurocent", - "evacuatie", - "exact", - "examen", - "executant", - "exen", - "exit", - "exogeen", - "exotherm", - "expeditie", - "expletief", - "expres", - "extase", - "extinctie", - "faal", - "faam", - "fabel", - "facultair", - "fakir", - "fakkel", - "faliekant", - "fallisch", - "famke", - "fanclub", - "fase", - "fatsoen", - "fauna", - "federaal", - "feedback", - "feest", - "feilbaar", - "feitelijk", - "felblauw", - "figurante", - "fiod", - "fitheid", - "fixeer", - "flap", - "fleece", - "fleur", - "flexibel", - "flits", - "flos", - "flow", - "fluweel", - "foezelen", - "fokkelman", - "fokpaard", - "fokvee", - "folder", - "follikel", - "folmer", - "folteraar", - "fooi", - "foolen", - "forfait", - "forint", - "formule", - "fornuis", - "fosfaat", - "foxtrot", - "foyer", - "fragiel", - "frater", - "freak", - "freddie", - "fregat", - "freon", - "frijnen", - "fructose", - "frunniken", - "fuiven", - "funshop", - "furieus", - "fysica", - "gadget", - "galder", - "galei", - "galg", - "galvlieg", - "galzuur", - "ganesh", - "gaswet", - "gaza", - "gazelle", - "geaaid", - "gebiecht", - "gebufferd", - "gedijd", - "geef", - "geflanst", - "gefreesd", - "gegaan", - "gegijzeld", - "gegniffel", - "gegraaid", - "gehikt", - "gehobbeld", - "gehucht", - "geiser", - "geiten", - "gekaakt", - "gekheid", - "gekijf", - "gekmakend", - "gekocht", - "gekskap", - "gekte", - "gelubberd", - "gemiddeld", - "geordend", - "gepoederd", - "gepuft", - "gerda", - "gerijpt", - "geseald", - "geshockt", - "gesierd", - "geslaagd", - "gesnaaid", - "getracht", - "getwijfel", - "geuit", - "gevecht", - "gevlagd", - "gewicht", - "gezaagd", - "gezocht", - "ghanees", - "giebelen", - "giechel", - "giepmans", - "gips", - "giraal", - "gistachtig", - "gitaar", - "glaasje", - "gletsjer", - "gleuf", - "glibberen", - "glijbaan", - "gloren", - "gluipen", - "gluren", - "gluur", - "gnoe", - "goddelijk", - "godgans", - "godschalk", - "godzalig", - "goeierd", - "gogme", - "goklustig", - "gokwereld", - "gonggrijp", - "gonje", - "goor", - "grabbel", - "graf", - "graveer", - "grif", - "grolleman", - "grom", - "groosman", - "grubben", - "gruijs", - "grut", - "guacamole", - "guido", - "guppy", - "haazen", - "hachelijk", - "haex", - "haiku", - "hakhout", - "hakken", - "hanegem", - "hans", - "hanteer", - "harrie", - "hazebroek", - "hedonist", - "heil", - "heineken", - "hekhuis", - "hekman", - "helbig", - "helga", - "helwegen", - "hengelaar", - "herkansen", - "hermafrodiet", - "hertaald", - "hiaat", - "hikspoors", - "hitachi", - "hitparade", - "hobo", - "hoeve", - "holocaust", - "hond", - "honnepon", - "hoogacht", - "hotelbed", - "hufter", - "hugo", - "huilbier", - "hulk", - "humus", - "huwbaar", - "huwelijk", - "hype", - "iconisch", - "idema", - "ideogram", - "idolaat", - "ietje", - "ijker", - "ijkheid", - "ijklijn", - "ijkmaat", - "ijkwezen", - "ijmuiden", - "ijsbox", - "ijsdag", - "ijselijk", - "ijskoud", - "ilse", - "immuun", - "impliceer", - "impuls", - "inbijten", - "inbuigen", - "indijken", - "induceer", - "indy", - "infecteer", - "inhaak", - "inkijk", - "inluiden", - "inmijnen", - "inoefenen", - "inpolder", - "inrijden", - "inslaan", - "invitatie", - "inwaaien", - "ionisch", - "isaac", - "isolatie", - "isotherm", - "isra", - "italiaan", - "ivoor", - "jacobs", - "jakob", - "jammen", - "jampot", - "jarig", - "jehova", - "jenever", - "jezus", - "joana", - "jobdienst", - "josua", - "joule", - "juich", - "jurk", - "juut", - "kaas", - "kabelaar", - "kabinet", - "kagenaar", - "kajuit", - "kalebas", - "kalm", - "kanjer", - "kapucijn", - "karregat", - "kart", - "katvanger", - "katwijk", - "kegelaar", - "keiachtig", - "keizer", - "kenletter", - "kerdijk", - "keus", - "kevlar", - "kezen", - "kickback", - "kieviet", - "kijken", - "kikvors", - "kilheid", - "kilobit", - "kilsdonk", - "kipschnitzel", - "kissebis", - "klad", - "klagelijk", - "klak", - "klapbaar", - "klaver", - "klene", - "klets", - "klijnhout", - "klit", - "klok", - "klonen", - "klotefilm", - "kluif", - "klumper", - "klus", - "knabbel", - "knagen", - "knaven", - "kneedbaar", - "knmi", - "knul", - "knus", - "kokhals", - "komiek", - "komkommer", - "kompaan", - "komrij", - "komvormig", - "koning", - "kopbal", - "kopklep", - "kopnagel", - "koppejan", - "koptekst", - "kopwand", - "koraal", - "kosmisch", - "kostbaar", - "kram", - "kraneveld", - "kras", - "kreling", - "krengen", - "kribbe", - "krik", - "kruid", - "krulbol", - "kuijper", - "kuipbank", - "kuit", - "kuiven", - "kutsmoes", - "kuub", - "kwak", - "kwatong", - "kwetsbaar", - "kwezelaar", - "kwijnen", - "kwik", - "kwinkslag", - "kwitantie", - "lading", - "lakbeits", - "lakken", - "laklaag", - "lakmoes", - "lakwijk", - "lamheid", - "lamp", - "lamsbout", - "lapmiddel", - "larve", - "laser", - "latijn", - "latuw", - "lawaai", - "laxeerpil", - "lebberen", - "ledeboer", - "leefbaar", - "leeman", - "lefdoekje", - "lefhebber", - "legboor", - "legsel", - "leguaan", - "leiplaat", - "lekdicht", - "lekrijden", - "leksteen", - "lenen", - "leraar", - "lesbienne", - "leugenaar", - "leut", - "lexicaal", - "lezing", - "lieten", - "liggeld", - "lijdzaam", - "lijk", - "lijmstang", - "lijnschip", - "likdoorn", - "likken", - "liksteen", - "limburg", - "link", - "linoleum", - "lipbloem", - "lipman", - "lispelen", - "lissabon", - "litanie", - "liturgie", - "lochem", - "loempia", - "loesje", - "logheid", - "lonen", - "lonneke", - "loom", - "loos", - "losbaar", - "loslaten", - "losplaats", - "loting", - "lotnummer", - "lots", - "louie", - "lourdes", - "louter", - "lowbudget", - "luijten", - "luikenaar", - "luilak", - "luipaard", - "luizenbos", - "lulkoek", - "lumen", - "lunzen", - "lurven", - "lutjeboer", - "luttel", - "lutz", - "luuk", - "luwte", - "luyendijk", - "lyceum", - "lynx", - "maakbaar", - "magdalena", - "malheid", - "manchet", - "manfred", - "manhaftig", - "mank", - "mantel", - "marion", - "marxist", - "masmeijer", - "massaal", - "matsen", - "matverf", - "matze", - "maude", - "mayonaise", - "mechanica", - "meifeest", - "melodie", - "meppelink", - "midvoor", - "midweeks", - "midzomer", - "miezel", - "mijnraad", - "minus", - "mirck", - "mirte", - "mispakken", - "misraden", - "miswassen", - "mitella", - "moker", - "molecule", - "mombakkes", - "moonen", - "mopperaar", - "moraal", - "morgana", - "mormel", - "mosselaar", - "motregen", - "mouw", - "mufheid", - "mutueel", - "muzelman", - "naaidoos", - "naald", - "nadeel", - "nadruk", - "nagy", - "nahon", - "naima", - "nairobi", - "napalm", - "napels", - "napijn", - "napoleon", - "narigheid", - "narratief", - "naseizoen", - "nasibal", - "navigatie", - "nawijn", - "negatief", - "nekletsel", - "nekwervel", - "neolatijn", - "neonataal", - "neptunus", - "nerd", - "nest", - "neuzelaar", - "nihiliste", - "nijenhuis", - "nijging", - "nijhoff", - "nijl", - "nijptang", - "nippel", - "nokkenas", - "noordam", - "noren", - "normaal", - "nottelman", - "notulant", - "nout", - "nuance", - "nuchter", - "nudorp", - "nulde", - "nullijn", - "nulmeting", - "nunspeet", - "nylon", - "obelisk", - "object", - "oblie", - "obsceen", - "occlusie", - "oceaan", - "ochtend", - "ockhuizen", - "oerdom", - "oergezond", - "oerlaag", - "oester", - "okhuijsen", - "olifant", - "olijfboer", - "omaans", - "ombudsman", - "omdat", - "omdijken", - "omdoen", - "omgebouwd", - "omkeer", - "omkomen", - "ommegaand", - "ommuren", - "omroep", - "omruil", - "omslaan", - "omsmeden", - "omvaar", - "onaardig", - "onedel", - "onenig", - "onheilig", - "onrecht", - "onroerend", - "ontcijfer", - "onthaal", - "ontvallen", - "ontzadeld", - "onzacht", - "onzin", - "onzuiver", - "oogappel", - "ooibos", - "ooievaar", - "ooit", - "oorarts", - "oorhanger", - "oorijzer", - "oorklep", - "oorschelp", - "oorworm", - "oorzaak", - "opdagen", - "opdien", - "opdweilen", - "opel", - "opgebaard", - "opinie", - "opjutten", - "opkijken", - "opklaar", - "opkuisen", - "opkwam", - "opnaaien", - "opossum", - "opsieren", - "opsmeer", - "optreden", - "opvijzel", - "opvlammen", - "opwind", - "oraal", - "orchidee", - "orkest", - "ossuarium", - "ostendorf", - "oublie", - "oudachtig", - "oudbakken", - "oudnoors", - "oudshoorn", - "oudtante", - "oven", - "over", - "oxidant", - "pablo", - "pacht", - "paktafel", - "pakzadel", - "paljas", - "panharing", - "papfles", - "paprika", - "parochie", - "paus", - "pauze", - "paviljoen", - "peek", - "pegel", - "peigeren", - "pekela", - "pendant", - "penibel", - "pepmiddel", - "peptalk", - "periferie", - "perron", - "pessarium", - "peter", - "petfles", - "petgat", - "peuk", - "pfeifer", - "picknick", - "pief", - "pieneman", - "pijlkruid", - "pijnacker", - "pijpelink", - "pikdonker", - "pikeer", - "pilaar", - "pionier", - "pipet", - "piscine", - "pissebed", - "pitchen", - "pixel", - "plamuren", - "plan", - "plausibel", - "plegen", - "plempen", - "pleonasme", - "plezant", - "podoloog", - "pofmouw", - "pokdalig", - "ponywagen", - "popachtig", - "popidool", - "porren", - "positie", - "potten", - "pralen", - "prezen", - "prijzen", - "privaat", - "proef", - "prooi", - "prozawerk", - "pruik", - "prul", - "publiceer", - "puck", - "puilen", - "pukkelig", - "pulveren", - "pupil", - "puppy", - "purmerend", - "pustjens", - "putemmer", - "puzzelaar", - "queenie", - "quiche", - "raam", - "raar", - "raat", - "raes", - "ralf", - "rally", - "ramona", - "ramselaar", - "ranonkel", - "rapen", - "rapunzel", - "rarekiek", - "rarigheid", - "rattenhol", - "ravage", - "reactie", - "recreant", - "redacteur", - "redster", - "reewild", - "regie", - "reijnders", - "rein", - "replica", - "revanche", - "rigide", - "rijbaan", - "rijdansen", - "rijgen", - "rijkdom", - "rijles", - "rijnwijn", - "rijpma", - "rijstafel", - "rijtaak", - "rijzwepen", - "rioleer", - "ripdeal", - "riphagen", - "riskant", - "rits", - "rivaal", - "robbedoes", - "robot", - "rockact", - "rodijk", - "rogier", - "rohypnol", - "rollaag", - "rolpaal", - "roltafel", - "roof", - "roon", - "roppen", - "rosbief", - "rosharig", - "rosielle", - "rotan", - "rotleven", - "rotten", - "rotvaart", - "royaal", - "royeer", - "rubato", - "ruby", - "ruche", - "rudge", - "ruggetje", - "rugnummer", - "rugpijn", - "rugtitel", - "rugzak", - "ruilbaar", - "ruis", - "ruit", - "rukwind", - "rulijs", - "rumoeren", - "rumsdorp", - "rumtaart", - "runnen", - "russchen", - "ruwkruid", - "saboteer", - "saksisch", - "salade", - "salpeter", - "sambabal", - "samsam", - "satelliet", - "satineer", - "saus", - "scampi", - "scarabee", - "scenario", - "schobben", - "schubben", - "scout", - "secessie", - "secondair", - "seculair", - "sediment", - "seeland", - "settelen", - "setwinst", - "sheriff", - "shiatsu", - "siciliaan", - "sidderaal", - "sigma", - "sijben", - "silvana", - "simkaart", - "sinds", - "situatie", - "sjaak", - "sjardijn", - "sjezen", - "sjor", - "skinhead", - "skylab", - "slamixen", - "sleijpen", - "slijkerig", - "slordig", - "slowaak", - "sluieren", - "smadelijk", - "smiecht", - "smoel", - "smos", - "smukken", - "snackcar", - "snavel", - "sneaker", - "sneu", - "snijdbaar", - "snit", - "snorder", - "soapbox", - "soetekouw", - "soigneren", - "sojaboon", - "solo", - "solvabel", - "somber", - "sommatie", - "soort", - "soppen", - "sopraan", - "soundbar", - "spanen", - "spawater", - "spijgat", - "spinaal", - "spionage", - "spiraal", - "spleet", - "splijt", - "spoed", - "sporen", - "spul", - "spuug", - "spuw", - "stalen", - "standaard", - "star", - "stefan", - "stencil", - "stijf", - "stil", - "stip", - "stopdas", - "stoten", - "stoven", - "straat", - "strobbe", - "strubbel", - "stucadoor", - "stuif", - "stukadoor", - "subhoofd", - "subregent", - "sudoku", - "sukade", - "sulfaat", - "surinaams", - "suus", - "syfilis", - "symboliek", - "sympathie", - "synagoge", - "synchroon", - "synergie", - "systeem", - "taanderij", - "tabak", - "tachtig", - "tackelen", - "taiwanees", - "talman", - "tamheid", - "tangaslip", - "taps", - "tarkan", - "tarwe", - "tasman", - "tatjana", - "taxameter", - "teil", - "teisman", - "telbaar", - "telco", - "telganger", - "telstar", - "tenant", - "tepel", - "terzet", - "testament", - "ticket", - "tiesinga", - "tijdelijk", - "tika", - "tiksel", - "tilleman", - "timbaal", - "tinsteen", - "tiplijn", - "tippelaar", - "tjirpen", - "toezeggen", - "tolbaas", - "tolgeld", - "tolhek", - "tolo", - "tolpoort", - "toltarief", - "tolvrij", - "tomaat", - "tondeuse", - "toog", - "tooi", - "toonbaar", - "toos", - "topclub", - "toppen", - "toptalent", - "topvrouw", - "toque", - "torment", - "tornado", - "tosti", - "totdat", - "toucheer", - "toulouse", - "tournedos", - "tout", - "trabant", - "tragedie", - "trailer", - "traject", - "traktaat", - "trauma", - "tray", - "trechter", - "tred", - "tref", - "treur", - "troebel", - "tros", - "trucage", - "truffel", - "tsaar", - "tucht", - "tuenter", - "tuitelig", - "tukje", - "tuktuk", - "tulp", - "tuma", - "tureluurs", - "twijfel", - "twitteren", - "tyfoon", - "typograaf", - "ugandees", - "uiachtig", - "uier", - "uisnipper", - "ultiem", - "unitair", - "uranium", - "urbaan", - "urendag", - "ursula", - "uurcirkel", - "uurglas", - "uzelf", - "vaat", - "vakantie", - "vakleraar", - "valbijl", - "valpartij", - "valreep", - "valuatie", - "vanmiddag", - "vanonder", - "varaan", - "varken", - "vaten", - "veenbes", - "veeteler", - "velgrem", - "vellekoop", - "velvet", - "veneberg", - "venlo", - "vent", - "venusberg", - "venw", - "veredeld", - "verf", - "verhaaf", - "vermaak", - "vernaaid", - "verraad", - "vers", - "veruit", - "verzaagd", - "vetachtig", - "vetlok", - "vetmesten", - "veto", - "vetrek", - "vetstaart", - "vetten", - "veurink", - "viaduct", - "vibrafoon", - "vicariaat", - "vieux", - "vieveen", - "vijfvoud", - "villa", - "vilt", - "vimmetje", - "vindbaar", - "vips", - "virtueel", - "visdieven", - "visee", - "visie", - "vlaag", - "vleugel", - "vmbo", - "vocht", - "voesenek", - "voicemail", - "voip", - "volg", - "vork", - "vorselaar", - "voyeur", - "vracht", - "vrekkig", - "vreten", - "vrije", - "vrozen", - "vrucht", - "vucht", - "vugt", - "vulkaan", - "vulmiddel", - "vulva", - "vuren", - "waas", - "wacht", - "wadvogel", - "wafel", - "waffel", - "walhalla", - "walnoot", - "walraven", - "wals", - "walvis", - "wandaad", - "wanen", - "wanmolen", - "want", - "warklomp", - "warm", - "wasachtig", - "wasteil", - "watt", - "webhandel", - "weblog", - "webpagina", - "webzine", - "wedereis", - "wedstrijd", - "weeda", - "weert", - "wegmaaien", - "wegscheer", - "wekelijks", - "wekken", - "wekroep", - "wektoon", - "weldaad", - "welwater", - "wendbaar", - "wenkbrauw", - "wens", - "wentelaar", - "wervel", - "wesseling", - "wetboek", - "wetmatig", - "whirlpool", - "wijbrands", - "wijdbeens", - "wijk", - "wijnbes", - "wijting", - "wild", - "wimpelen", - "wingebied", - "winplaats", - "winter", - "winzucht", - "wipstaart", - "wisgerhof", - "withaar", - "witmaker", - "wokkel", - "wolf", - "wonenden", - "woning", - "worden", - "worp", - "wortel", - "wrat", - "wrijf", - "wringen", - "yoghurt", - "ypsilon", - "zaaijer", - "zaak", - "zacharias", - "zakelijk", - "zakkam", - "zakwater", - "zalf", - "zalig", - "zaniken", - "zebracode", - "zeeblauw", - "zeef", - "zeegaand", - "zeeuw", - "zege", - "zegje", - "zeil", - "zesbaans", - "zesenhalf", - "zeskantig", - "zesmaal", - "zetbaas", - "zetpil", - "zeulen", - "ziezo", - "zigzag", - "zijaltaar", - "zijbeuk", - "zijlijn", - "zijmuur", - "zijn", - "zijwaarts", - "zijzelf", - "zilt", - "zimmerman", - "zinledig", - "zinnelijk", - "zionist", - "zitdag", - "zitruimte", - "zitzak", - "zoal", - "zodoende", - "zoekbots", - "zoem", - "zoiets", - "zojuist", - "zondaar", - "zotskap", - "zottebol", - "zucht", - "zuivel", - "zulk", - "zult", - "zuster", - "zuur", - "zweedijk", - "zwendel", - "zwepen", - "zwiep", - "zwijmel", - "zworen" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/pt.rs b/networks/monero/wallet/seed/src/words/pt.rs deleted file mode 100644 index cede0ac54..000000000 --- a/networks/monero/wallet/seed/src/words/pt.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "abaular", - "abdominal", - "abeto", - "abissinio", - "abjeto", - "ablucao", - "abnegar", - "abotoar", - "abrutalhar", - "absurdo", - "abutre", - "acautelar", - "accessorios", - "acetona", - "achocolatado", - "acirrar", - "acne", - "acovardar", - "acrostico", - "actinomicete", - "acustico", - "adaptavel", - "adeus", - "adivinho", - "adjunto", - "admoestar", - "adnominal", - "adotivo", - "adquirir", - "adriatico", - "adsorcao", - "adutora", - "advogar", - "aerossol", - "afazeres", - "afetuoso", - "afixo", - "afluir", - "afortunar", - "afrouxar", - "aftosa", - "afunilar", - "agentes", - "agito", - "aglutinar", - "aiatola", - "aimore", - "aino", - "aipo", - "airoso", - "ajeitar", - "ajoelhar", - "ajudante", - "ajuste", - "alazao", - "albumina", - "alcunha", - "alegria", - "alexandre", - "alforriar", - "alguns", - "alhures", - "alivio", - "almoxarife", - "alotropico", - "alpiste", - "alquimista", - "alsaciano", - "altura", - "aluviao", - "alvura", - "amazonico", - "ambulatorio", - "ametodico", - "amizades", - "amniotico", - "amovivel", - "amurada", - "anatomico", - "ancorar", - "anexo", - "anfora", - "aniversario", - "anjo", - "anotar", - "ansioso", - "anturio", - "anuviar", - "anverso", - "anzol", - "aonde", - "apaziguar", - "apito", - "aplicavel", - "apoteotico", - "aprimorar", - "aprumo", - "apto", - "apuros", - "aquoso", - "arauto", - "arbusto", - "arduo", - "aresta", - "arfar", - "arguto", - "aritmetico", - "arlequim", - "armisticio", - "aromatizar", - "arpoar", - "arquivo", - "arrumar", - "arsenio", - "arturiano", - "aruaque", - "arvores", - "asbesto", - "ascorbico", - "aspirina", - "asqueroso", - "assustar", - "astuto", - "atazanar", - "ativo", - "atletismo", - "atmosferico", - "atormentar", - "atroz", - "aturdir", - "audivel", - "auferir", - "augusto", - "aula", - "aumento", - "aurora", - "autuar", - "avatar", - "avexar", - "avizinhar", - "avolumar", - "avulso", - "axiomatico", - "azerbaijano", - "azimute", - "azoto", - "azulejo", - "bacteriologista", - "badulaque", - "baforada", - "baixote", - "bajular", - "balzaquiana", - "bambuzal", - "banzo", - "baoba", - "baqueta", - "barulho", - "bastonete", - "batuta", - "bauxita", - "bavaro", - "bazuca", - "bcrepuscular", - "beato", - "beduino", - "begonia", - "behaviorista", - "beisebol", - "belzebu", - "bemol", - "benzido", - "beocio", - "bequer", - "berro", - "besuntar", - "betume", - "bexiga", - "bezerro", - "biatlon", - "biboca", - "bicuspide", - "bidirecional", - "bienio", - "bifurcar", - "bigorna", - "bijuteria", - "bimotor", - "binormal", - "bioxido", - "bipolarizacao", - "biquini", - "birutice", - "bisturi", - "bituca", - "biunivoco", - "bivalve", - "bizarro", - "blasfemo", - "blenorreia", - "blindar", - "bloqueio", - "blusao", - "boazuda", - "bofete", - "bojudo", - "bolso", - "bombordo", - "bonzo", - "botina", - "boquiaberto", - "bostoniano", - "botulismo", - "bourbon", - "bovino", - "boximane", - "bravura", - "brevidade", - "britar", - "broxar", - "bruno", - "bruxuleio", - "bubonico", - "bucolico", - "buda", - "budista", - "bueiro", - "buffer", - "bugre", - "bujao", - "bumerangue", - "burundines", - "busto", - "butique", - "buzios", - "caatinga", - "cabuqui", - "cacunda", - "cafuzo", - "cajueiro", - "camurca", - "canudo", - "caquizeiro", - "carvoeiro", - "casulo", - "catuaba", - "cauterizar", - "cebolinha", - "cedula", - "ceifeiro", - "celulose", - "cerzir", - "cesto", - "cetro", - "ceus", - "cevar", - "chavena", - "cheroqui", - "chita", - "chovido", - "chuvoso", - "ciatico", - "cibernetico", - "cicuta", - "cidreira", - "cientistas", - "cifrar", - "cigarro", - "cilio", - "cimo", - "cinzento", - "cioso", - "cipriota", - "cirurgico", - "cisto", - "citrico", - "ciumento", - "civismo", - "clavicula", - "clero", - "clitoris", - "cluster", - "coaxial", - "cobrir", - "cocota", - "codorniz", - "coexistir", - "cogumelo", - "coito", - "colusao", - "compaixao", - "comutativo", - "contentamento", - "convulsivo", - "coordenativa", - "coquetel", - "correto", - "corvo", - "costureiro", - "cotovia", - "covil", - "cozinheiro", - "cretino", - "cristo", - "crivo", - "crotalo", - "cruzes", - "cubo", - "cucuia", - "cueiro", - "cuidar", - "cujo", - "cultural", - "cunilingua", - "cupula", - "curvo", - "custoso", - "cutucar", - "czarismo", - "dablio", - "dacota", - "dados", - "daguerreotipo", - "daiquiri", - "daltonismo", - "damista", - "dantesco", - "daquilo", - "darwinista", - "dasein", - "dativo", - "deao", - "debutantes", - "decurso", - "deduzir", - "defunto", - "degustar", - "dejeto", - "deltoide", - "demover", - "denunciar", - "deputado", - "deque", - "dervixe", - "desvirtuar", - "deturpar", - "deuteronomio", - "devoto", - "dextrose", - "dezoito", - "diatribe", - "dicotomico", - "didatico", - "dietista", - "difuso", - "digressao", - "diluvio", - "diminuto", - "dinheiro", - "dinossauro", - "dioxido", - "diplomatico", - "dique", - "dirimivel", - "disturbio", - "diurno", - "divulgar", - "dizivel", - "doar", - "dobro", - "docura", - "dodoi", - "doer", - "dogue", - "doloso", - "domo", - "donzela", - "doping", - "dorsal", - "dossie", - "dote", - "doutro", - "doze", - "dravidico", - "dreno", - "driver", - "dropes", - "druso", - "dubnio", - "ducto", - "dueto", - "dulija", - "dundum", - "duodeno", - "duquesa", - "durou", - "duvidoso", - "duzia", - "ebano", - "ebrio", - "eburneo", - "echarpe", - "eclusa", - "ecossistema", - "ectoplasma", - "ecumenismo", - "eczema", - "eden", - "editorial", - "edredom", - "edulcorar", - "efetuar", - "efigie", - "efluvio", - "egiptologo", - "egresso", - "egua", - "einsteiniano", - "eira", - "eivar", - "eixos", - "ejetar", - "elastomero", - "eldorado", - "elixir", - "elmo", - "eloquente", - "elucidativo", - "emaranhar", - "embutir", - "emerito", - "emfa", - "emitir", - "emotivo", - "empuxo", - "emulsao", - "enamorar", - "encurvar", - "enduro", - "enevoar", - "enfurnar", - "enguico", - "enho", - "enigmista", - "enlutar", - "enormidade", - "enpreendimento", - "enquanto", - "enriquecer", - "enrugar", - "entusiastico", - "enunciar", - "envolvimento", - "enxuto", - "enzimatico", - "eolico", - "epiteto", - "epoxi", - "epura", - "equivoco", - "erario", - "erbio", - "ereto", - "erguido", - "erisipela", - "ermo", - "erotizar", - "erros", - "erupcao", - "ervilha", - "esburacar", - "escutar", - "esfuziante", - "esguio", - "esloveno", - "esmurrar", - "esoterismo", - "esperanca", - "espirito", - "espurio", - "essencialmente", - "esturricar", - "esvoacar", - "etario", - "eterno", - "etiquetar", - "etnologo", - "etos", - "etrusco", - "euclidiano", - "euforico", - "eugenico", - "eunuco", - "europio", - "eustaquio", - "eutanasia", - "evasivo", - "eventualidade", - "evitavel", - "evoluir", - "exaustor", - "excursionista", - "exercito", - "exfoliado", - "exito", - "exotico", - "expurgo", - "exsudar", - "extrusora", - "exumar", - "fabuloso", - "facultativo", - "fado", - "fagulha", - "faixas", - "fajuto", - "faltoso", - "famoso", - "fanzine", - "fapesp", - "faquir", - "fartura", - "fastio", - "faturista", - "fausto", - "favorito", - "faxineira", - "fazer", - "fealdade", - "febril", - "fecundo", - "fedorento", - "feerico", - "feixe", - "felicidade", - "felpudo", - "feltro", - "femur", - "fenotipo", - "fervura", - "festivo", - "feto", - "feudo", - "fevereiro", - "fezinha", - "fiasco", - "fibra", - "ficticio", - "fiduciario", - "fiesp", - "fifa", - "figurino", - "fijiano", - "filtro", - "finura", - "fiorde", - "fiquei", - "firula", - "fissurar", - "fitoteca", - "fivela", - "fixo", - "flavio", - "flexor", - "flibusteiro", - "flotilha", - "fluxograma", - "fobos", - "foco", - "fofura", - "foguista", - "foie", - "foliculo", - "fominha", - "fonte", - "forum", - "fosso", - "fotossintese", - "foxtrote", - "fraudulento", - "frevo", - "frivolo", - "frouxo", - "frutose", - "fuba", - "fucsia", - "fugitivo", - "fuinha", - "fujao", - "fulustreco", - "fumo", - "funileiro", - "furunculo", - "fustigar", - "futurologo", - "fuxico", - "fuzue", - "gabriel", - "gado", - "gaelico", - "gafieira", - "gaguejo", - "gaivota", - "gajo", - "galvanoplastico", - "gamo", - "ganso", - "garrucha", - "gastronomo", - "gatuno", - "gaussiano", - "gaviao", - "gaxeta", - "gazeteiro", - "gear", - "geiser", - "geminiano", - "generoso", - "genuino", - "geossinclinal", - "gerundio", - "gestual", - "getulista", - "gibi", - "gigolo", - "gilete", - "ginseng", - "giroscopio", - "glaucio", - "glacial", - "gleba", - "glifo", - "glote", - "glutonia", - "gnostico", - "goela", - "gogo", - "goitaca", - "golpista", - "gomo", - "gonzo", - "gorro", - "gostou", - "goticula", - "gourmet", - "governo", - "gozo", - "graxo", - "grevista", - "grito", - "grotesco", - "gruta", - "guaxinim", - "gude", - "gueto", - "guizo", - "guloso", - "gume", - "guru", - "gustativo", - "grelhado", - "gutural", - "habitue", - "haitiano", - "halterofilista", - "hamburguer", - "hanseniase", - "happening", - "harpista", - "hastear", - "haveres", - "hebreu", - "hectometro", - "hedonista", - "hegira", - "helena", - "helminto", - "hemorroidas", - "henrique", - "heptassilabo", - "hertziano", - "hesitar", - "heterossexual", - "heuristico", - "hexagono", - "hiato", - "hibrido", - "hidrostatico", - "hieroglifo", - "hifenizar", - "higienizar", - "hilario", - "himen", - "hino", - "hippie", - "hirsuto", - "historiografia", - "hitlerista", - "hodometro", - "hoje", - "holograma", - "homus", - "honroso", - "hoquei", - "horto", - "hostilizar", - "hotentote", - "huguenote", - "humilde", - "huno", - "hurra", - "hutu", - "iaia", - "ialorixa", - "iambico", - "iansa", - "iaque", - "iara", - "iatista", - "iberico", - "ibis", - "icar", - "iceberg", - "icosagono", - "idade", - "ideologo", - "idiotice", - "idoso", - "iemenita", - "iene", - "igarape", - "iglu", - "ignorar", - "igreja", - "iguaria", - "iidiche", - "ilativo", - "iletrado", - "ilharga", - "ilimitado", - "ilogismo", - "ilustrissimo", - "imaturo", - "imbuzeiro", - "imerso", - "imitavel", - "imovel", - "imputar", - "imutavel", - "inaveriguavel", - "incutir", - "induzir", - "inextricavel", - "infusao", - "ingua", - "inhame", - "iniquo", - "injusto", - "inning", - "inoxidavel", - "inquisitorial", - "insustentavel", - "intumescimento", - "inutilizavel", - "invulneravel", - "inzoneiro", - "iodo", - "iogurte", - "ioio", - "ionosfera", - "ioruba", - "iota", - "ipsilon", - "irascivel", - "iris", - "irlandes", - "irmaos", - "iroques", - "irrupcao", - "isca", - "isento", - "islandes", - "isotopo", - "isqueiro", - "israelita", - "isso", - "isto", - "iterbio", - "itinerario", - "itrio", - "iuane", - "iugoslavo", - "jabuticabeira", - "jacutinga", - "jade", - "jagunco", - "jainista", - "jaleco", - "jambo", - "jantarada", - "japones", - "jaqueta", - "jarro", - "jasmim", - "jato", - "jaula", - "javel", - "jazz", - "jegue", - "jeitoso", - "jejum", - "jenipapo", - "jeova", - "jequitiba", - "jersei", - "jesus", - "jetom", - "jiboia", - "jihad", - "jilo", - "jingle", - "jipe", - "jocoso", - "joelho", - "joguete", - "joio", - "jojoba", - "jorro", - "jota", - "joule", - "joviano", - "jubiloso", - "judoca", - "jugular", - "juizo", - "jujuba", - "juliano", - "jumento", - "junto", - "jururu", - "justo", - "juta", - "juventude", - "labutar", - "laguna", - "laico", - "lajota", - "lanterninha", - "lapso", - "laquear", - "lastro", - "lauto", - "lavrar", - "laxativo", - "lazer", - "leasing", - "lebre", - "lecionar", - "ledo", - "leguminoso", - "leitura", - "lele", - "lemure", - "lento", - "leonardo", - "leopardo", - "lepton", - "leque", - "leste", - "letreiro", - "leucocito", - "levitico", - "lexicologo", - "lhama", - "lhufas", - "liame", - "licoroso", - "lidocaina", - "liliputiano", - "limusine", - "linotipo", - "lipoproteina", - "liquidos", - "lirismo", - "lisura", - "liturgico", - "livros", - "lixo", - "lobulo", - "locutor", - "lodo", - "logro", - "lojista", - "lombriga", - "lontra", - "loop", - "loquaz", - "lorota", - "losango", - "lotus", - "louvor", - "luar", - "lubrificavel", - "lucros", - "lugubre", - "luis", - "luminoso", - "luneta", - "lustroso", - "luto", - "luvas", - "luxuriante", - "luzeiro", - "maduro", - "maestro", - "mafioso", - "magro", - "maiuscula", - "majoritario", - "malvisto", - "mamute", - "manutencao", - "mapoteca", - "maquinista", - "marzipa", - "masturbar", - "matuto", - "mausoleu", - "mavioso", - "maxixe", - "mazurca", - "meandro", - "mecha", - "medusa", - "mefistofelico", - "megera", - "meirinho", - "melro", - "memorizar", - "menu", - "mequetrefe", - "mertiolate", - "mestria", - "metroviario", - "mexilhao", - "mezanino", - "miau", - "microssegundo", - "midia", - "migratorio", - "mimosa", - "minuto", - "miosotis", - "mirtilo", - "misturar", - "mitzvah", - "miudos", - "mixuruca", - "mnemonico", - "moagem", - "mobilizar", - "modulo", - "moer", - "mofo", - "mogno", - "moita", - "molusco", - "monumento", - "moqueca", - "morubixaba", - "mostruario", - "motriz", - "mouse", - "movivel", - "mozarela", - "muarra", - "muculmano", - "mudo", - "mugir", - "muitos", - "mumunha", - "munir", - "muon", - "muquira", - "murros", - "musselina", - "nacoes", - "nado", - "naftalina", - "nago", - "naipe", - "naja", - "nalgum", - "namoro", - "nanquim", - "napolitano", - "naquilo", - "nascimento", - "nautilo", - "navios", - "nazista", - "nebuloso", - "nectarina", - "nefrologo", - "negus", - "nelore", - "nenufar", - "nepotismo", - "nervura", - "neste", - "netuno", - "neutron", - "nevoeiro", - "newtoniano", - "nexo", - "nhenhenhem", - "nhoque", - "nigeriano", - "niilista", - "ninho", - "niobio", - "niponico", - "niquelar", - "nirvana", - "nisto", - "nitroglicerina", - "nivoso", - "nobreza", - "nocivo", - "noel", - "nogueira", - "noivo", - "nojo", - "nominativo", - "nonuplo", - "noruegues", - "nostalgico", - "noturno", - "nouveau", - "nuanca", - "nublar", - "nucleotideo", - "nudista", - "nulo", - "numismatico", - "nunquinha", - "nupcias", - "nutritivo", - "nuvens", - "oasis", - "obcecar", - "obeso", - "obituario", - "objetos", - "oblongo", - "obnoxio", - "obrigatorio", - "obstruir", - "obtuso", - "obus", - "obvio", - "ocaso", - "occipital", - "oceanografo", - "ocioso", - "oclusivo", - "ocorrer", - "ocre", - "octogono", - "odalisca", - "odisseia", - "odorifico", - "oersted", - "oeste", - "ofertar", - "ofidio", - "oftalmologo", - "ogiva", - "ogum", - "oigale", - "oitavo", - "oitocentos", - "ojeriza", - "olaria", - "oleoso", - "olfato", - "olhos", - "oliveira", - "olmo", - "olor", - "olvidavel", - "ombudsman", - "omeleteira", - "omitir", - "omoplata", - "onanismo", - "ondular", - "oneroso", - "onomatopeico", - "ontologico", - "onus", - "onze", - "opalescente", - "opcional", - "operistico", - "opio", - "oposto", - "oprobrio", - "optometrista", - "opusculo", - "oratorio", - "orbital", - "orcar", - "orfao", - "orixa", - "orla", - "ornitologo", - "orquidea", - "ortorrombico", - "orvalho", - "osculo", - "osmotico", - "ossudo", - "ostrogodo", - "otario", - "otite", - "ouro", - "ousar", - "outubro", - "ouvir", - "ovario", - "overnight", - "oviparo", - "ovni", - "ovoviviparo", - "ovulo", - "oxala", - "oxente", - "oxiuro", - "oxossi", - "ozonizar", - "paciente", - "pactuar", - "padronizar", - "paete", - "pagodeiro", - "paixao", - "pajem", - "paludismo", - "pampas", - "panturrilha", - "papudo", - "paquistanes", - "pastoso", - "patua", - "paulo", - "pauzinhos", - "pavoroso", - "paxa", - "pazes", - "peao", - "pecuniario", - "pedunculo", - "pegaso", - "peixinho", - "pejorativo", - "pelvis", - "penuria", - "pequno", - "petunia", - "pezada", - "piauiense", - "pictorico", - "pierro", - "pigmeu", - "pijama", - "pilulas", - "pimpolho", - "pintura", - "piorar", - "pipocar", - "piqueteiro", - "pirulito", - "pistoleiro", - "pituitaria", - "pivotar", - "pixote", - "pizzaria", - "plistoceno", - "plotar", - "pluviometrico", - "pneumonico", - "poco", - "podridao", - "poetisa", - "pogrom", - "pois", - "polvorosa", - "pomposo", - "ponderado", - "pontudo", - "populoso", - "poquer", - "porvir", - "posudo", - "potro", - "pouso", - "povoar", - "prazo", - "prezar", - "privilegios", - "proximo", - "prussiano", - "pseudopode", - "psoriase", - "pterossauros", - "ptialina", - "ptolemaico", - "pudor", - "pueril", - "pufe", - "pugilista", - "puir", - "pujante", - "pulverizar", - "pumba", - "punk", - "purulento", - "pustula", - "putsch", - "puxe", - "quatrocentos", - "quetzal", - "quixotesco", - "quotizavel", - "rabujice", - "racista", - "radonio", - "rafia", - "ragu", - "rajado", - "ralo", - "rampeiro", - "ranzinza", - "raptor", - "raquitismo", - "raro", - "rasurar", - "ratoeira", - "ravioli", - "razoavel", - "reavivar", - "rebuscar", - "recusavel", - "reduzivel", - "reexposicao", - "refutavel", - "regurgitar", - "reivindicavel", - "rejuvenescimento", - "relva", - "remuneravel", - "renunciar", - "reorientar", - "repuxo", - "requisito", - "resumo", - "returno", - "reutilizar", - "revolvido", - "rezonear", - "riacho", - "ribossomo", - "ricota", - "ridiculo", - "rifle", - "rigoroso", - "rijo", - "rimel", - "rins", - "rios", - "riqueza", - "respeito", - "rissole", - "ritualistico", - "rivalizar", - "rixa", - "robusto", - "rococo", - "rodoviario", - "roer", - "rogo", - "rojao", - "rolo", - "rompimento", - "ronronar", - "roqueiro", - "rorqual", - "rosto", - "rotundo", - "rouxinol", - "roxo", - "royal", - "ruas", - "rucula", - "rudimentos", - "ruela", - "rufo", - "rugoso", - "ruivo", - "rule", - "rumoroso", - "runico", - "ruptura", - "rural", - "rustico", - "rutilar", - "saariano", - "sabujo", - "sacudir", - "sadomasoquista", - "safra", - "sagui", - "sais", - "samurai", - "santuario", - "sapo", - "saquear", - "sartriano", - "saturno", - "saude", - "sauva", - "saveiro", - "saxofonista", - "sazonal", - "scherzo", - "script", - "seara", - "seborreia", - "secura", - "seduzir", - "sefardim", - "seguro", - "seja", - "selvas", - "sempre", - "senzala", - "sepultura", - "sequoia", - "sestercio", - "setuplo", - "seus", - "seviciar", - "sezonismo", - "shalom", - "siames", - "sibilante", - "sicrano", - "sidra", - "sifilitico", - "signos", - "silvo", - "simultaneo", - "sinusite", - "sionista", - "sirio", - "sisudo", - "situar", - "sivan", - "slide", - "slogan", - "soar", - "sobrio", - "socratico", - "sodomizar", - "soerguer", - "software", - "sogro", - "soja", - "solver", - "somente", - "sonso", - "sopro", - "soquete", - "sorveteiro", - "sossego", - "soturno", - "sousafone", - "sovinice", - "sozinho", - "suavizar", - "subverter", - "sucursal", - "sudoriparo", - "sufragio", - "sugestoes", - "suite", - "sujo", - "sultao", - "sumula", - "suntuoso", - "suor", - "supurar", - "suruba", - "susto", - "suturar", - "suvenir", - "tabuleta", - "taco", - "tadjique", - "tafeta", - "tagarelice", - "taitiano", - "talvez", - "tampouco", - "tanzaniano", - "taoista", - "tapume", - "taquion", - "tarugo", - "tascar", - "tatuar", - "tautologico", - "tavola", - "taxionomista", - "tchecoslovaco", - "teatrologo", - "tectonismo", - "tedioso", - "teflon", - "tegumento", - "teixo", - "telurio", - "temporas", - "tenue", - "teosofico", - "tepido", - "tequila", - "terrorista", - "testosterona", - "tetrico", - "teutonico", - "teve", - "texugo", - "tiara", - "tibia", - "tiete", - "tifoide", - "tigresa", - "tijolo", - "tilintar", - "timpano", - "tintureiro", - "tiquete", - "tiroteio", - "tisico", - "titulos", - "tive", - "toar", - "toboga", - "tofu", - "togoles", - "toicinho", - "tolueno", - "tomografo", - "tontura", - "toponimo", - "toquio", - "torvelinho", - "tostar", - "toto", - "touro", - "toxina", - "trazer", - "trezentos", - "trivialidade", - "trovoar", - "truta", - "tuaregue", - "tubular", - "tucano", - "tudo", - "tufo", - "tuiste", - "tulipa", - "tumultuoso", - "tunisino", - "tupiniquim", - "turvo", - "tutu", - "ucraniano", - "udenista", - "ufanista", - "ufologo", - "ugaritico", - "uiste", - "uivo", - "ulceroso", - "ulema", - "ultravioleta", - "umbilical", - "umero", - "umido", - "umlaut", - "unanimidade", - "unesco", - "ungulado", - "unheiro", - "univoco", - "untuoso", - "urano", - "urbano", - "urdir", - "uretra", - "urgente", - "urinol", - "urna", - "urologo", - "urro", - "ursulina", - "urtiga", - "urupe", - "usavel", - "usbeque", - "usei", - "usineiro", - "usurpar", - "utero", - "utilizar", - "utopico", - "uvular", - "uxoricidio", - "vacuo", - "vadio", - "vaguear", - "vaivem", - "valvula", - "vampiro", - "vantajoso", - "vaporoso", - "vaquinha", - "varziano", - "vasto", - "vaticinio", - "vaudeville", - "vazio", - "veado", - "vedico", - "veemente", - "vegetativo", - "veio", - "veja", - "veludo", - "venusiano", - "verdade", - "verve", - "vestuario", - "vetusto", - "vexatorio", - "vezes", - "viavel", - "vibratorio", - "victor", - "vicunha", - "vidros", - "vietnamita", - "vigoroso", - "vilipendiar", - "vime", - "vintem", - "violoncelo", - "viquingue", - "virus", - "visualizar", - "vituperio", - "viuvo", - "vivo", - "vizir", - "voar", - "vociferar", - "vodu", - "vogar", - "voile", - "volver", - "vomito", - "vontade", - "vortice", - "vosso", - "voto", - "vovozinha", - "voyeuse", - "vozes", - "vulva", - "vupt", - "western", - "xadrez", - "xale", - "xampu", - "xango", - "xarope", - "xaual", - "xavante", - "xaxim", - "xenonio", - "xepa", - "xerox", - "xicara", - "xifopago", - "xiita", - "xilogravura", - "xinxim", - "xistoso", - "xixi", - "xodo", - "xogum", - "xucro", - "zabumba", - "zagueiro", - "zambiano", - "zanzar", - "zarpar", - "zebu", - "zefiro", - "zeloso", - "zenite", - "zumbi" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/ru.rs b/networks/monero/wallet/seed/src/words/ru.rs deleted file mode 100644 index 609fa4cbe..000000000 --- a/networks/monero/wallet/seed/src/words/ru.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "абажур", - "абзац", - "абонент", - "абрикос", - "абсурд", - "авангард", - "август", - "авиация", - "авоська", - "автор", - "агат", - "агент", - "агитатор", - "агнец", - "агония", - "агрегат", - "адвокат", - "адмирал", - "адрес", - "ажиотаж", - "азарт", - "азбука", - "азот", - "аист", - "айсберг", - "академия", - "аквариум", - "аккорд", - "акробат", - "аксиома", - "актер", - "акула", - "акция", - "алгоритм", - "алебарда", - "аллея", - "алмаз", - "алтарь", - "алфавит", - "алхимик", - "алый", - "альбом", - "алюминий", - "амбар", - "аметист", - "амнезия", - "ампула", - "амфора", - "анализ", - "ангел", - "анекдот", - "анимация", - "анкета", - "аномалия", - "ансамбль", - "антенна", - "апатия", - "апельсин", - "апофеоз", - "аппарат", - "апрель", - "аптека", - "арабский", - "арбуз", - "аргумент", - "арест", - "ария", - "арка", - "армия", - "аромат", - "арсенал", - "артист", - "архив", - "аршин", - "асбест", - "аскетизм", - "аспект", - "ассорти", - "астроном", - "асфальт", - "атака", - "ателье", - "атлас", - "атом", - "атрибут", - "аудитор", - "аукцион", - "аура", - "афера", - "афиша", - "ахинея", - "ацетон", - "аэропорт", - "бабушка", - "багаж", - "бадья", - "база", - "баклажан", - "балкон", - "бампер", - "банк", - "барон", - "бассейн", - "батарея", - "бахрома", - "башня", - "баян", - "бегство", - "бедро", - "бездна", - "бекон", - "белый", - "бензин", - "берег", - "беседа", - "бетонный", - "биатлон", - "библия", - "бивень", - "бигуди", - "бидон", - "бизнес", - "бикини", - "билет", - "бинокль", - "биология", - "биржа", - "бисер", - "битва", - "бицепс", - "благо", - "бледный", - "близкий", - "блок", - "блуждать", - "блюдо", - "бляха", - "бобер", - "богатый", - "бодрый", - "боевой", - "бокал", - "большой", - "борьба", - "босой", - "ботинок", - "боцман", - "бочка", - "боярин", - "брать", - "бревно", - "бригада", - "бросать", - "брызги", - "брюки", - "бублик", - "бугор", - "будущее", - "буква", - "бульвар", - "бумага", - "бунт", - "бурный", - "бусы", - "бутылка", - "буфет", - "бухта", - "бушлат", - "бывалый", - "быль", - "быстрый", - "быть", - "бюджет", - "бюро", - "бюст", - "вагон", - "важный", - "ваза", - "вакцина", - "валюта", - "вампир", - "ванная", - "вариант", - "вассал", - "вата", - "вафля", - "вахта", - "вдова", - "вдыхать", - "ведущий", - "веер", - "вежливый", - "везти", - "веко", - "великий", - "вена", - "верить", - "веселый", - "ветер", - "вечер", - "вешать", - "вещь", - "веяние", - "взаимный", - "взбучка", - "взвод", - "взгляд", - "вздыхать", - "взлетать", - "взмах", - "взнос", - "взор", - "взрыв", - "взывать", - "взятка", - "вибрация", - "визит", - "вилка", - "вино", - "вирус", - "висеть", - "витрина", - "вихрь", - "вишневый", - "включать", - "вкус", - "власть", - "влечь", - "влияние", - "влюблять", - "внешний", - "внимание", - "внук", - "внятный", - "вода", - "воевать", - "вождь", - "воздух", - "войти", - "вокзал", - "волос", - "вопрос", - "ворота", - "восток", - "впадать", - "впускать", - "врач", - "время", - "вручать", - "всадник", - "всеобщий", - "вспышка", - "встреча", - "вторник", - "вулкан", - "вурдалак", - "входить", - "въезд", - "выбор", - "вывод", - "выгодный", - "выделять", - "выезжать", - "выживать", - "вызывать", - "выигрыш", - "вылезать", - "выносить", - "выпивать", - "высокий", - "выходить", - "вычет", - "вышка", - "выяснять", - "вязать", - "вялый", - "гавань", - "гадать", - "газета", - "гаишник", - "галстук", - "гамма", - "гарантия", - "гастроли", - "гвардия", - "гвоздь", - "гектар", - "гель", - "генерал", - "геолог", - "герой", - "гешефт", - "гибель", - "гигант", - "гильза", - "гимн", - "гипотеза", - "гитара", - "глаз", - "глина", - "глоток", - "глубокий", - "глыба", - "глядеть", - "гнать", - "гнев", - "гнить", - "гном", - "гнуть", - "говорить", - "годовой", - "голова", - "гонка", - "город", - "гость", - "готовый", - "граница", - "грех", - "гриб", - "громкий", - "группа", - "грызть", - "грязный", - "губа", - "гудеть", - "гулять", - "гуманный", - "густой", - "гуща", - "давать", - "далекий", - "дама", - "данные", - "дарить", - "дать", - "дача", - "дверь", - "движение", - "двор", - "дебют", - "девушка", - "дедушка", - "дежурный", - "дезертир", - "действие", - "декабрь", - "дело", - "демократ", - "день", - "депутат", - "держать", - "десяток", - "детский", - "дефицит", - "дешевый", - "деятель", - "джаз", - "джинсы", - "джунгли", - "диалог", - "диван", - "диета", - "дизайн", - "дикий", - "динамика", - "диплом", - "директор", - "диск", - "дитя", - "дичь", - "длинный", - "дневник", - "добрый", - "доверие", - "договор", - "дождь", - "доза", - "документ", - "должен", - "домашний", - "допрос", - "дорога", - "доход", - "доцент", - "дочь", - "дощатый", - "драка", - "древний", - "дрожать", - "друг", - "дрянь", - "дубовый", - "дуга", - "дудка", - "дукат", - "дуло", - "думать", - "дупло", - "дурак", - "дуть", - "духи", - "душа", - "дуэт", - "дымить", - "дыня", - "дыра", - "дыханье", - "дышать", - "дьявол", - "дюжина", - "дюйм", - "дюна", - "дядя", - "дятел", - "егерь", - "единый", - "едкий", - "ежевика", - "ежик", - "езда", - "елка", - "емкость", - "ерунда", - "ехать", - "жадный", - "жажда", - "жалеть", - "жанр", - "жара", - "жать", - "жгучий", - "ждать", - "жевать", - "желание", - "жемчуг", - "женщина", - "жертва", - "жесткий", - "жечь", - "живой", - "жидкость", - "жизнь", - "жилье", - "жирный", - "житель", - "журнал", - "жюри", - "забывать", - "завод", - "загадка", - "задача", - "зажечь", - "зайти", - "закон", - "замечать", - "занимать", - "западный", - "зарплата", - "засыпать", - "затрата", - "захват", - "зацепка", - "зачет", - "защита", - "заявка", - "звать", - "звезда", - "звонить", - "звук", - "здание", - "здешний", - "здоровье", - "зебра", - "зевать", - "зеленый", - "земля", - "зенит", - "зеркало", - "зефир", - "зигзаг", - "зима", - "зиять", - "злак", - "злой", - "змея", - "знать", - "зной", - "зодчий", - "золотой", - "зомби", - "зона", - "зоопарк", - "зоркий", - "зрачок", - "зрение", - "зритель", - "зубной", - "зыбкий", - "зять", - "игла", - "иголка", - "играть", - "идея", - "идиот", - "идол", - "идти", - "иерархия", - "избрать", - "известие", - "изгонять", - "издание", - "излагать", - "изменять", - "износ", - "изоляция", - "изрядный", - "изучать", - "изымать", - "изящный", - "икона", - "икра", - "иллюзия", - "имбирь", - "иметь", - "имидж", - "иммунный", - "империя", - "инвестор", - "индивид", - "инерция", - "инженер", - "иномарка", - "институт", - "интерес", - "инфекция", - "инцидент", - "ипподром", - "ирис", - "ирония", - "искать", - "история", - "исходить", - "исчезать", - "итог", - "июль", - "июнь", - "кабинет", - "кавалер", - "кадр", - "казарма", - "кайф", - "кактус", - "калитка", - "камень", - "канал", - "капитан", - "картина", - "касса", - "катер", - "кафе", - "качество", - "каша", - "каюта", - "квартира", - "квинтет", - "квота", - "кедр", - "кекс", - "кенгуру", - "кепка", - "керосин", - "кетчуп", - "кефир", - "кибитка", - "кивнуть", - "кидать", - "километр", - "кино", - "киоск", - "кипеть", - "кирпич", - "кисть", - "китаец", - "класс", - "клетка", - "клиент", - "клоун", - "клуб", - "клык", - "ключ", - "клятва", - "книга", - "кнопка", - "кнут", - "князь", - "кобура", - "ковер", - "коготь", - "кодекс", - "кожа", - "козел", - "койка", - "коктейль", - "колено", - "компания", - "конец", - "копейка", - "короткий", - "костюм", - "котел", - "кофе", - "кошка", - "красный", - "кресло", - "кричать", - "кровь", - "крупный", - "крыша", - "крючок", - "кубок", - "кувшин", - "кудрявый", - "кузов", - "кукла", - "культура", - "кумир", - "купить", - "курс", - "кусок", - "кухня", - "куча", - "кушать", - "кювет", - "лабиринт", - "лавка", - "лагерь", - "ладонь", - "лазерный", - "лайнер", - "лакей", - "лампа", - "ландшафт", - "лапа", - "ларек", - "ласковый", - "лауреат", - "лачуга", - "лаять", - "лгать", - "лебедь", - "левый", - "легкий", - "ледяной", - "лежать", - "лекция", - "лента", - "лепесток", - "лесной", - "лето", - "лечь", - "леший", - "лживый", - "либерал", - "ливень", - "лига", - "лидер", - "ликовать", - "лиловый", - "лимон", - "линия", - "липа", - "лирика", - "лист", - "литр", - "лифт", - "лихой", - "лицо", - "личный", - "лишний", - "лобовой", - "ловить", - "логика", - "лодка", - "ложка", - "лозунг", - "локоть", - "ломать", - "лоно", - "лопата", - "лорд", - "лось", - "лоток", - "лохматый", - "лошадь", - "лужа", - "лукавый", - "луна", - "лупить", - "лучший", - "лыжный", - "лысый", - "львиный", - "льгота", - "льдина", - "любить", - "людской", - "люстра", - "лютый", - "лягушка", - "магазин", - "мадам", - "мазать", - "майор", - "максимум", - "мальчик", - "манера", - "март", - "масса", - "мать", - "мафия", - "махать", - "мачта", - "машина", - "маэстро", - "маяк", - "мгла", - "мебель", - "медведь", - "мелкий", - "мемуары", - "менять", - "мера", - "место", - "метод", - "механизм", - "мечтать", - "мешать", - "миграция", - "мизинец", - "микрофон", - "миллион", - "минута", - "мировой", - "миссия", - "митинг", - "мишень", - "младший", - "мнение", - "мнимый", - "могила", - "модель", - "мозг", - "мойка", - "мокрый", - "молодой", - "момент", - "монах", - "море", - "мост", - "мотор", - "мохнатый", - "мочь", - "мошенник", - "мощный", - "мрачный", - "мстить", - "мудрый", - "мужчина", - "музыка", - "мука", - "мумия", - "мундир", - "муравей", - "мусор", - "мутный", - "муфта", - "муха", - "мучить", - "мушкетер", - "мыло", - "мысль", - "мыть", - "мычать", - "мышь", - "мэтр", - "мюзикл", - "мягкий", - "мякиш", - "мясо", - "мятый", - "мячик", - "набор", - "навык", - "нагрузка", - "надежда", - "наемный", - "нажать", - "называть", - "наивный", - "накрыть", - "налог", - "намерен", - "наносить", - "написать", - "народ", - "натура", - "наука", - "нация", - "начать", - "небо", - "невеста", - "негодяй", - "неделя", - "нежный", - "незнание", - "нелепый", - "немалый", - "неправда", - "нервный", - "нести", - "нефть", - "нехватка", - "нечистый", - "неясный", - "нива", - "нижний", - "низкий", - "никель", - "нирвана", - "нить", - "ничья", - "ниша", - "нищий", - "новый", - "нога", - "ножницы", - "ноздря", - "ноль", - "номер", - "норма", - "нота", - "ночь", - "ноша", - "ноябрь", - "нрав", - "нужный", - "нутро", - "нынешний", - "нырнуть", - "ныть", - "нюанс", - "нюхать", - "няня", - "оазис", - "обаяние", - "обвинять", - "обгонять", - "обещать", - "обжигать", - "обзор", - "обида", - "область", - "обмен", - "обнимать", - "оборона", - "образ", - "обучение", - "обходить", - "обширный", - "общий", - "объект", - "обычный", - "обязать", - "овальный", - "овес", - "овощи", - "овраг", - "овца", - "овчарка", - "огненный", - "огонь", - "огромный", - "огурец", - "одежда", - "одинокий", - "одобрить", - "ожидать", - "ожог", - "озарение", - "озеро", - "означать", - "оказать", - "океан", - "оклад", - "окно", - "округ", - "октябрь", - "окурок", - "олень", - "опасный", - "операция", - "описать", - "оплата", - "опора", - "оппонент", - "опрос", - "оптимизм", - "опускать", - "опыт", - "орать", - "орбита", - "орган", - "орден", - "орел", - "оригинал", - "оркестр", - "орнамент", - "оружие", - "осадок", - "освещать", - "осень", - "осина", - "осколок", - "осмотр", - "основной", - "особый", - "осуждать", - "отбор", - "отвечать", - "отдать", - "отец", - "отзыв", - "открытие", - "отмечать", - "относить", - "отпуск", - "отрасль", - "отставка", - "оттенок", - "отходить", - "отчет", - "отъезд", - "офицер", - "охапка", - "охота", - "охрана", - "оценка", - "очаг", - "очередь", - "очищать", - "очки", - "ошейник", - "ошибка", - "ощущение", - "павильон", - "падать", - "паек", - "пакет", - "палец", - "память", - "панель", - "папка", - "партия", - "паспорт", - "патрон", - "пауза", - "пафос", - "пахнуть", - "пациент", - "пачка", - "пашня", - "певец", - "педагог", - "пейзаж", - "пельмень", - "пенсия", - "пепел", - "период", - "песня", - "петля", - "пехота", - "печать", - "пешеход", - "пещера", - "пианист", - "пиво", - "пиджак", - "пиковый", - "пилот", - "пионер", - "пирог", - "писать", - "пить", - "пицца", - "пишущий", - "пища", - "план", - "плечо", - "плита", - "плохой", - "плыть", - "плюс", - "пляж", - "победа", - "повод", - "погода", - "подумать", - "поехать", - "пожимать", - "позиция", - "поиск", - "покой", - "получать", - "помнить", - "пони", - "поощрять", - "попадать", - "порядок", - "пост", - "поток", - "похожий", - "поцелуй", - "почва", - "пощечина", - "поэт", - "пояснить", - "право", - "предмет", - "проблема", - "пруд", - "прыгать", - "прямой", - "психолог", - "птица", - "публика", - "пугать", - "пудра", - "пузырь", - "пуля", - "пункт", - "пурга", - "пустой", - "путь", - "пухлый", - "пучок", - "пушистый", - "пчела", - "пшеница", - "пыль", - "пытка", - "пыхтеть", - "пышный", - "пьеса", - "пьяный", - "пятно", - "работа", - "равный", - "радость", - "развитие", - "район", - "ракета", - "рамка", - "ранний", - "рапорт", - "рассказ", - "раунд", - "рация", - "рвать", - "реальный", - "ребенок", - "реветь", - "регион", - "редакция", - "реестр", - "режим", - "резкий", - "рейтинг", - "река", - "религия", - "ремонт", - "рента", - "реплика", - "ресурс", - "реформа", - "рецепт", - "речь", - "решение", - "ржавый", - "рисунок", - "ритм", - "рифма", - "робкий", - "ровный", - "рогатый", - "родитель", - "рождение", - "розовый", - "роковой", - "роль", - "роман", - "ронять", - "рост", - "рота", - "роща", - "рояль", - "рубль", - "ругать", - "руда", - "ружье", - "руины", - "рука", - "руль", - "румяный", - "русский", - "ручка", - "рыба", - "рывок", - "рыдать", - "рыжий", - "рынок", - "рысь", - "рыть", - "рыхлый", - "рыцарь", - "рычаг", - "рюкзак", - "рюмка", - "рябой", - "рядовой", - "сабля", - "садовый", - "сажать", - "салон", - "самолет", - "сани", - "сапог", - "сарай", - "сатира", - "сауна", - "сахар", - "сбегать", - "сбивать", - "сбор", - "сбыт", - "свадьба", - "свет", - "свидание", - "свобода", - "связь", - "сгорать", - "сдвигать", - "сеанс", - "северный", - "сегмент", - "седой", - "сезон", - "сейф", - "секунда", - "сельский", - "семья", - "сентябрь", - "сердце", - "сеть", - "сечение", - "сеять", - "сигнал", - "сидеть", - "сизый", - "сила", - "символ", - "синий", - "сирота", - "система", - "ситуация", - "сиять", - "сказать", - "скважина", - "скелет", - "скидка", - "склад", - "скорый", - "скрывать", - "скучный", - "слава", - "слеза", - "слияние", - "слово", - "случай", - "слышать", - "слюна", - "смех", - "смирение", - "смотреть", - "смутный", - "смысл", - "смятение", - "снаряд", - "снег", - "снижение", - "сносить", - "снять", - "событие", - "совет", - "согласие", - "сожалеть", - "сойти", - "сокол", - "солнце", - "сомнение", - "сонный", - "сообщать", - "соперник", - "сорт", - "состав", - "сотня", - "соус", - "социолог", - "сочинять", - "союз", - "спать", - "спешить", - "спина", - "сплошной", - "способ", - "спутник", - "средство", - "срок", - "срывать", - "стать", - "ствол", - "стена", - "стихи", - "сторона", - "страна", - "студент", - "стыд", - "субъект", - "сувенир", - "сугроб", - "судьба", - "суета", - "суждение", - "сукно", - "сулить", - "сумма", - "сунуть", - "супруг", - "суровый", - "сустав", - "суть", - "сухой", - "суша", - "существо", - "сфера", - "схема", - "сцена", - "счастье", - "счет", - "считать", - "сшивать", - "съезд", - "сынок", - "сыпать", - "сырье", - "сытый", - "сыщик", - "сюжет", - "сюрприз", - "таблица", - "таежный", - "таинство", - "тайна", - "такси", - "талант", - "таможня", - "танец", - "тарелка", - "таскать", - "тахта", - "тачка", - "таять", - "тварь", - "твердый", - "творить", - "театр", - "тезис", - "текст", - "тело", - "тема", - "тень", - "теория", - "теплый", - "терять", - "тесный", - "тетя", - "техника", - "течение", - "тигр", - "типичный", - "тираж", - "титул", - "тихий", - "тишина", - "ткань", - "товарищ", - "толпа", - "тонкий", - "топливо", - "торговля", - "тоска", - "точка", - "тощий", - "традиция", - "тревога", - "трибуна", - "трогать", - "труд", - "трюк", - "тряпка", - "туалет", - "тугой", - "туловище", - "туман", - "тундра", - "тупой", - "турнир", - "тусклый", - "туфля", - "туча", - "туша", - "тыкать", - "тысяча", - "тьма", - "тюльпан", - "тюрьма", - "тяга", - "тяжелый", - "тянуть", - "убеждать", - "убирать", - "убогий", - "убыток", - "уважение", - "уверять", - "увлекать", - "угнать", - "угол", - "угроза", - "удар", - "удивлять", - "удобный", - "уезд", - "ужас", - "ужин", - "узел", - "узкий", - "узнавать", - "узор", - "уйма", - "уклон", - "укол", - "уксус", - "улетать", - "улица", - "улучшать", - "улыбка", - "уметь", - "умиление", - "умный", - "умолять", - "умысел", - "унижать", - "уносить", - "уныние", - "упасть", - "уплата", - "упор", - "упрекать", - "упускать", - "уран", - "урна", - "уровень", - "усадьба", - "усердие", - "усилие", - "ускорять", - "условие", - "усмешка", - "уснуть", - "успеть", - "усыпать", - "утешать", - "утка", - "уточнять", - "утро", - "утюг", - "уходить", - "уцелеть", - "участие", - "ученый", - "учитель", - "ушко", - "ущерб", - "уютный", - "уяснять", - "фабрика", - "фаворит", - "фаза", - "файл", - "факт", - "фамилия", - "фантазия", - "фара", - "фасад", - "февраль", - "фельдшер", - "феномен", - "ферма", - "фигура", - "физика", - "фильм", - "финал", - "фирма", - "фишка", - "флаг", - "флейта", - "флот", - "фокус", - "фольклор", - "фонд", - "форма", - "фото", - "фраза", - "фреска", - "фронт", - "фрукт", - "функция", - "фуражка", - "футбол", - "фыркать", - "халат", - "хамство", - "хаос", - "характер", - "хата", - "хватать", - "хвост", - "хижина", - "хилый", - "химия", - "хирург", - "хитрый", - "хищник", - "хлам", - "хлеб", - "хлопать", - "хмурый", - "ходить", - "хозяин", - "хоккей", - "холодный", - "хороший", - "хотеть", - "хохотать", - "храм", - "хрен", - "хриплый", - "хроника", - "хрупкий", - "художник", - "хулиган", - "хутор", - "царь", - "цвет", - "цель", - "цемент", - "центр", - "цепь", - "церковь", - "цикл", - "цилиндр", - "циничный", - "цирк", - "цистерна", - "цитата", - "цифра", - "цыпленок", - "чадо", - "чайник", - "часть", - "чашка", - "человек", - "чемодан", - "чепуха", - "черный", - "честь", - "четкий", - "чехол", - "чиновник", - "число", - "читать", - "членство", - "чреватый", - "чтение", - "чувство", - "чугунный", - "чудо", - "чужой", - "чукча", - "чулок", - "чума", - "чуткий", - "чучело", - "чушь", - "шаблон", - "шагать", - "шайка", - "шакал", - "шалаш", - "шампунь", - "шанс", - "шапка", - "шарик", - "шасси", - "шатер", - "шахта", - "шашлык", - "швейный", - "швырять", - "шевелить", - "шедевр", - "шейка", - "шелковый", - "шептать", - "шерсть", - "шестерка", - "шикарный", - "шинель", - "шипеть", - "широкий", - "шить", - "шишка", - "шкаф", - "школа", - "шкура", - "шланг", - "шлем", - "шлюпка", - "шляпа", - "шнур", - "шоколад", - "шорох", - "шоссе", - "шофер", - "шпага", - "шпион", - "шприц", - "шрам", - "шрифт", - "штаб", - "штора", - "штраф", - "штука", - "штык", - "шуба", - "шуметь", - "шуршать", - "шутка", - "щадить", - "щедрый", - "щека", - "щель", - "щенок", - "щепка", - "щетка", - "щука", - "эволюция", - "эгоизм", - "экзамен", - "экипаж", - "экономия", - "экран", - "эксперт", - "элемент", - "элита", - "эмблема", - "эмигрант", - "эмоция", - "энергия", - "эпизод", - "эпоха", - "эскиз", - "эссе", - "эстрада", - "этап", - "этика", - "этюд", - "эфир", - "эффект", - "эшелон", - "юбилей", - "юбка", - "южный", - "юмор", - "юноша", - "юрист", - "яблоко", - "явление", - "ягода", - "ядерный", - "ядовитый", - "ядро", - "язва", - "язык", - "яйцо", - "якорь", - "январь", - "японец", - "яркий", - "ярмарка", - "ярость", - "ярус", - "ясный", - "яхта", - "ячейка", - "ящик" -] \ No newline at end of file diff --git a/networks/monero/wallet/seed/src/words/zh.rs b/networks/monero/wallet/seed/src/words/zh.rs deleted file mode 100644 index 42f05b4a2..000000000 --- a/networks/monero/wallet/seed/src/words/zh.rs +++ /dev/null @@ -1,1628 +0,0 @@ -&[ - "的", - "一", - "是", - "在", - "不", - "了", - "有", - "和", - "人", - "这", - "中", - "大", - "为", - "上", - "个", - "国", - "我", - "以", - "要", - "他", - "时", - "来", - "用", - "们", - "生", - "到", - "作", - "地", - "于", - "出", - "就", - "分", - "对", - "成", - "会", - "可", - "主", - "发", - "年", - "动", - "同", - "工", - "也", - "能", - "下", - "过", - "子", - "说", - "产", - "种", - "面", - "而", - "方", - "后", - "多", - "定", - "行", - "学", - "法", - "所", - "民", - "得", - "经", - "十", - "三", - "之", - "进", - "着", - "等", - "部", - "度", - "家", - "电", - "力", - "里", - "如", - "水", - "化", - "高", - "自", - "二", - "理", - "起", - "小", - "物", - "现", - "实", - "加", - "量", - "都", - "两", - "体", - "制", - "机", - "当", - "使", - "点", - "从", - "业", - "本", - "去", - "把", - "性", - "好", - "应", - "开", - "它", - "合", - "还", - "因", - "由", - "其", - "些", - "然", - "前", - "外", - "天", - "政", - "四", - "日", - "那", - "社", - "义", - "事", - "平", - "形", - "相", - "全", - "表", - "间", - "样", - "与", - "关", - "各", - "重", - "新", - "线", - "内", - "数", - "正", - "心", - "反", - "你", - "明", - "看", - "原", - "又", - "么", - "利", - "比", - "或", - "但", - "质", - "气", - "第", - "向", - "道", - "命", - "此", - "变", - "条", - "只", - "没", - "结", - "解", - "问", - "意", - "建", - "月", - "公", - "无", - "系", - "军", - "很", - "情", - "者", - "最", - "立", - "代", - "想", - "已", - "通", - "并", - "提", - "直", - "题", - "党", - "程", - "展", - "五", - "果", - "料", - "象", - "员", - "革", - "位", - "入", - "常", - "文", - "总", - "次", - "品", - "式", - "活", - "设", - "及", - "管", - "特", - "件", - "长", - "求", - "老", - "头", - "基", - "资", - "边", - "流", - "路", - "级", - "少", - "图", - "山", - "统", - "接", - "知", - "较", - "将", - "组", - "见", - "计", - "别", - "她", - "手", - "角", - "期", - "根", - "论", - "运", - "农", - "指", - "几", - "九", - "区", - "强", - "放", - "决", - "西", - "被", - "干", - "做", - "必", - "战", - "先", - "回", - "则", - "任", - "取", - "据", - "处", - "队", - "南", - "给", - "色", - "光", - "门", - "即", - "保", - "治", - "北", - "造", - "百", - "规", - "热", - "领", - "七", - "海", - "口", - "东", - "导", - "器", - "压", - "志", - "世", - "金", - "增", - "争", - "济", - "阶", - "油", - "思", - "术", - "极", - "交", - "受", - "联", - "什", - "认", - "六", - "共", - "权", - "收", - "证", - "改", - "清", - "美", - "再", - "采", - "转", - "更", - "单", - "风", - "切", - "打", - "白", - "教", - "速", - "花", - "带", - "安", - "场", - "身", - "车", - "例", - "真", - "务", - "具", - "万", - "每", - "目", - "至", - "达", - "走", - "积", - "示", - "议", - "声", - "报", - "斗", - "完", - "类", - "八", - "离", - "华", - "名", - "确", - "才", - "科", - "张", - "信", - "马", - "节", - "话", - "米", - "整", - "空", - "元", - "况", - "今", - "集", - "温", - "传", - "土", - "许", - "步", - "群", - "广", - "石", - "记", - "需", - "段", - "研", - "界", - "拉", - "林", - "律", - "叫", - "且", - "究", - "观", - "越", - "织", - "装", - "影", - "算", - "低", - "持", - "音", - "众", - "书", - "布", - "复", - "容", - "儿", - "须", - "际", - "商", - "非", - "验", - "连", - "断", - "深", - "难", - "近", - "矿", - "千", - "周", - "委", - "素", - "技", - "备", - "半", - "办", - "青", - "省", - "列", - "习", - "响", - "约", - "支", - "般", - "史", - "感", - "劳", - "便", - "团", - "往", - "酸", - "历", - "市", - "克", - "何", - "除", - "消", - "构", - "府", - "称", - "太", - "准", - "精", - "值", - "号", - "率", - "族", - "维", - "划", - "选", - "标", - "写", - "存", - "候", - "毛", - "亲", - "快", - "效", - "斯", - "院", - "查", - "江", - "型", - "眼", - "王", - "按", - "格", - "养", - "易", - "置", - "派", - "层", - "片", - "始", - "却", - "专", - "状", - "育", - "厂", - "京", - "识", - "适", - "属", - "圆", - "包", - "火", - "住", - "调", - "满", - "县", - "局", - "照", - "参", - "红", - "细", - "引", - "听", - "该", - "铁", - "价", - "严", - "首", - "底", - "液", - "官", - "德", - "随", - "病", - "苏", - "失", - "尔", - "死", - "讲", - "配", - "女", - "黄", - "推", - "显", - "谈", - "罪", - "神", - "艺", - "呢", - "席", - "含", - "企", - "望", - "密", - "批", - "营", - "项", - "防", - "举", - "球", - "英", - "氧", - "势", - "告", - "李", - "台", - "落", - "木", - "帮", - "轮", - "破", - "亚", - "师", - "围", - "注", - "远", - "字", - "材", - "排", - "供", - "河", - "态", - "封", - "另", - "施", - "减", - "树", - "溶", - "怎", - "止", - "案", - "言", - "士", - "均", - "武", - "固", - "叶", - "鱼", - "波", - "视", - "仅", - "费", - "紧", - "爱", - "左", - "章", - "早", - "朝", - "害", - "续", - "轻", - "服", - "试", - "食", - "充", - "兵", - "源", - "判", - "护", - "司", - "足", - "某", - "练", - "差", - "致", - "板", - "田", - "降", - "黑", - "犯", - "负", - "击", - "范", - "继", - "兴", - "似", - "余", - "坚", - "曲", - "输", - "修", - "故", - "城", - "夫", - "够", - "送", - "笔", - "船", - "占", - "右", - "财", - "吃", - "富", - "春", - "职", - "觉", - "汉", - "画", - "功", - "巴", - "跟", - "虽", - "杂", - "飞", - "检", - "吸", - "助", - "升", - "阳", - "互", - "初", - "创", - "抗", - "考", - "投", - "坏", - "策", - "古", - "径", - "换", - "未", - "跑", - "留", - "钢", - "曾", - "端", - "责", - "站", - "简", - "述", - "钱", - "副", - "尽", - "帝", - "射", - "草", - "冲", - "承", - "独", - "令", - "限", - "阿", - "宣", - "环", - "双", - "请", - "超", - "微", - "让", - "控", - "州", - "良", - "轴", - "找", - "否", - "纪", - "益", - "依", - "优", - "顶", - "础", - "载", - "倒", - "房", - "突", - "坐", - "粉", - "敌", - "略", - "客", - "袁", - "冷", - "胜", - "绝", - "析", - "块", - "剂", - "测", - "丝", - "协", - "诉", - "念", - "陈", - "仍", - "罗", - "盐", - "友", - "洋", - "错", - "苦", - "夜", - "刑", - "移", - "频", - "逐", - "靠", - "混", - "母", - "短", - "皮", - "终", - "聚", - "汽", - "村", - "云", - "哪", - "既", - "距", - "卫", - "停", - "烈", - "央", - "察", - "烧", - "迅", - "境", - "若", - "印", - "洲", - "刻", - "括", - "激", - "孔", - "搞", - "甚", - "室", - "待", - "核", - "校", - "散", - "侵", - "吧", - "甲", - "游", - "久", - "菜", - "味", - "旧", - "模", - "湖", - "货", - "损", - "预", - "阻", - "毫", - "普", - "稳", - "乙", - "妈", - "植", - "息", - "扩", - "银", - "语", - "挥", - "酒", - "守", - "拿", - "序", - "纸", - "医", - "缺", - "雨", - "吗", - "针", - "刘", - "啊", - "急", - "唱", - "误", - "训", - "愿", - "审", - "附", - "获", - "茶", - "鲜", - "粮", - "斤", - "孩", - "脱", - "硫", - "肥", - "善", - "龙", - "演", - "父", - "渐", - "血", - "欢", - "械", - "掌", - "歌", - "沙", - "刚", - "攻", - "谓", - "盾", - "讨", - "晚", - "粒", - "乱", - "燃", - "矛", - "乎", - "杀", - "药", - "宁", - "鲁", - "贵", - "钟", - "煤", - "读", - "班", - "伯", - "香", - "介", - "迫", - "句", - "丰", - "培", - "握", - "兰", - "担", - "弦", - "蛋", - "沉", - "假", - "穿", - "执", - "答", - "乐", - "谁", - "顺", - "烟", - "缩", - "征", - "脸", - "喜", - "松", - "脚", - "困", - "异", - "免", - "背", - "星", - "福", - "买", - "染", - "井", - "概", - "慢", - "怕", - "磁", - "倍", - "祖", - "皇", - "促", - "静", - "补", - "评", - "翻", - "肉", - "践", - "尼", - "衣", - "宽", - "扬", - "棉", - "希", - "伤", - "操", - "垂", - "秋", - "宜", - "氢", - "套", - "督", - "振", - "架", - "亮", - "末", - "宪", - "庆", - "编", - "牛", - "触", - "映", - "雷", - "销", - "诗", - "座", - "居", - "抓", - "裂", - "胞", - "呼", - "娘", - "景", - "威", - "绿", - "晶", - "厚", - "盟", - "衡", - "鸡", - "孙", - "延", - "危", - "胶", - "屋", - "乡", - "临", - "陆", - "顾", - "掉", - "呀", - "灯", - "岁", - "措", - "束", - "耐", - "剧", - "玉", - "赵", - "跳", - "哥", - "季", - "课", - "凯", - "胡", - "额", - "款", - "绍", - "卷", - "齐", - "伟", - "蒸", - "殖", - "永", - "宗", - "苗", - "川", - "炉", - "岩", - "弱", - "零", - "杨", - "奏", - "沿", - "露", - "杆", - "探", - "滑", - "镇", - "饭", - "浓", - "航", - "怀", - "赶", - "库", - "夺", - "伊", - "灵", - "税", - "途", - "灭", - "赛", - "归", - "召", - "鼓", - "播", - "盘", - "裁", - "险", - "康", - "唯", - "录", - "菌", - "纯", - "借", - "糖", - "盖", - "横", - "符", - "私", - "努", - "堂", - "域", - "枪", - "润", - "幅", - "哈", - "竟", - "熟", - "虫", - "泽", - "脑", - "壤", - "碳", - "欧", - "遍", - "侧", - "寨", - "敢", - "彻", - "虑", - "斜", - "薄", - "庭", - "纳", - "弹", - "饲", - "伸", - "折", - "麦", - "湿", - "暗", - "荷", - "瓦", - "塞", - "床", - "筑", - "恶", - "户", - "访", - "塔", - "奇", - "透", - "梁", - "刀", - "旋", - "迹", - "卡", - "氯", - "遇", - "份", - "毒", - "泥", - "退", - "洗", - "摆", - "灰", - "彩", - "卖", - "耗", - "夏", - "择", - "忙", - "铜", - "献", - "硬", - "予", - "繁", - "圈", - "雪", - "函", - "亦", - "抽", - "篇", - "阵", - "阴", - "丁", - "尺", - "追", - "堆", - "雄", - "迎", - "泛", - "爸", - "楼", - "避", - "谋", - "吨", - "野", - "猪", - "旗", - "累", - "偏", - "典", - "馆", - "索", - "秦", - "脂", - "潮", - "爷", - "豆", - "忽", - "托", - "惊", - "塑", - "遗", - "愈", - "朱", - "替", - "纤", - "粗", - "倾", - "尚", - "痛", - "楚", - "谢", - "奋", - "购", - "磨", - "君", - "池", - "旁", - "碎", - "骨", - "监", - "捕", - "弟", - "暴", - "割", - "贯", - "殊", - "释", - "词", - "亡", - "壁", - "顿", - "宝", - "午", - "尘", - "闻", - "揭", - "炮", - "残", - "冬", - "桥", - "妇", - "警", - "综", - "招", - "吴", - "付", - "浮", - "遭", - "徐", - "您", - "摇", - "谷", - "赞", - "箱", - "隔", - "订", - "男", - "吹", - "园", - "纷", - "唐", - "败", - "宋", - "玻", - "巨", - "耕", - "坦", - "荣", - "闭", - "湾", - "键", - "凡", - "驻", - "锅", - "救", - "恩", - "剥", - "凝", - "碱", - "齿", - "截", - "炼", - "麻", - "纺", - "禁", - "废", - "盛", - "版", - "缓", - "净", - "睛", - "昌", - "婚", - "涉", - "筒", - "嘴", - "插", - "岸", - "朗", - "庄", - "街", - "藏", - "姑", - "贸", - "腐", - "奴", - "啦", - "惯", - "乘", - "伙", - "恢", - "匀", - "纱", - "扎", - "辩", - "耳", - "彪", - "臣", - "亿", - "璃", - "抵", - "脉", - "秀", - "萨", - "俄", - "网", - "舞", - "店", - "喷", - "纵", - "寸", - "汗", - "挂", - "洪", - "贺", - "闪", - "柬", - "爆", - "烯", - "津", - "稻", - "墙", - "软", - "勇", - "像", - "滚", - "厘", - "蒙", - "芳", - "肯", - "坡", - "柱", - "荡", - "腿", - "仪", - "旅", - "尾", - "轧", - "冰", - "贡", - "登", - "黎", - "削", - "钻", - "勒", - "逃", - "障", - "氨", - "郭", - "峰", - "币", - "港", - "伏", - "轨", - "亩", - "毕", - "擦", - "莫", - "刺", - "浪", - "秘", - "援", - "株", - "健", - "售", - "股", - "岛", - "甘", - "泡", - "睡", - "童", - "铸", - "汤", - "阀", - "休", - "汇", - "舍", - "牧", - "绕", - "炸", - "哲", - "磷", - "绩", - "朋", - "淡", - "尖", - "启", - "陷", - "柴", - "呈", - "徒", - "颜", - "泪", - "稍", - "忘", - "泵", - "蓝", - "拖", - "洞", - "授", - "镜", - "辛", - "壮", - "锋", - "贫", - "虚", - "弯", - "摩", - "泰", - "幼", - "廷", - "尊", - "窗", - "纲", - "弄", - "隶", - "疑", - "氏", - "宫", - "姐", - "震", - "瑞", - "怪", - "尤", - "琴", - "循", - "描", - "膜", - "违", - "夹", - "腰", - "缘", - "珠", - "穷", - "森", - "枝", - "竹", - "沟", - "催", - "绳", - "忆", - "邦", - "剩", - "幸", - "浆", - "栏", - "拥", - "牙", - "贮", - "礼", - "滤", - "钠", - "纹", - "罢", - "拍", - "咱", - "喊", - "袖", - "埃", - "勤", - "罚", - "焦", - "潜", - "伍", - "墨", - "欲", - "缝", - "姓", - "刊", - "饱", - "仿", - "奖", - "铝", - "鬼", - "丽", - "跨", - "默", - "挖", - "链", - "扫", - "喝", - "袋", - "炭", - "污", - "幕", - "诸", - "弧", - "励", - "梅", - "奶", - "洁", - "灾", - "舟", - "鉴", - "苯", - "讼", - "抱", - "毁", - "懂", - "寒", - "智", - "埔", - "寄", - "届", - "跃", - "渡", - "挑", - "丹", - "艰", - "贝", - "碰", - "拔", - "爹", - "戴", - "码", - "梦", - "芽", - "熔", - "赤", - "渔", - "哭", - "敬", - "颗", - "奔", - "铅", - "仲", - "虎", - "稀", - "妹", - "乏", - "珍", - "申", - "桌", - "遵", - "允", - "隆", - "螺", - "仓", - "魏", - "锐", - "晓", - "氮", - "兼", - "隐", - "碍", - "赫", - "拨", - "忠", - "肃", - "缸", - "牵", - "抢", - "博", - "巧", - "壳", - "兄", - "杜", - "讯", - "诚", - "碧", - "祥", - "柯", - "页", - "巡", - "矩", - "悲", - "灌", - "龄", - "伦", - "票", - "寻", - "桂", - "铺", - "圣", - "恐", - "恰", - "郑", - "趣", - "抬", - "荒", - "腾", - "贴", - "柔", - "滴", - "猛", - "阔", - "辆", - "妻", - "填", - "撤", - "储", - "签", - "闹", - "扰", - "紫", - "砂", - "递", - "戏", - "吊", - "陶", - "伐", - "喂", - "疗", - "瓶", - "婆", - "抚", - "臂", - "摸", - "忍", - "虾", - "蜡", - "邻", - "胸", - "巩", - "挤", - "偶", - "弃", - "槽", - "劲", - "乳", - "邓", - "吉", - "仁", - "烂", - "砖", - "租", - "乌", - "舰", - "伴", - "瓜", - "浅", - "丙", - "暂", - "燥", - "橡", - "柳", - "迷", - "暖", - "牌", - "秧", - "胆", - "详", - "簧", - "踏", - "瓷", - "谱", - "呆", - "宾", - "糊", - "洛", - "辉", - "愤", - "竞", - "隙", - "怒", - "粘", - "乃", - "绪", - "肩", - "籍", - "敏", - "涂", - "熙", - "皆", - "侦", - "悬", - "掘", - "享", - "纠", - "醒", - "狂", - "锁", - "淀", - "恨", - "牲", - "霸", - "爬", - "赏", - "逆", - "玩", - "陵", - "祝", - "秒", - "浙", - "貌" -] \ No newline at end of file diff --git a/networks/monero/wallet/src/extra.rs b/networks/monero/wallet/src/extra.rs index 521d69aeb..537e595a7 100644 --- a/networks/monero/wallet/src/extra.rs +++ b/networks/monero/wallet/src/extra.rs @@ -302,7 +302,8 @@ impl Extra { // `fill_buf` returns the current buffer, filled if empty, only empty if the reader is // exhausted while !r.fill_buf()?.is_empty() { - res.0.push(ExtraField::read(r)?); + let Ok(field) = ExtraField::read(r) else { break }; + res.0.push(field); } Ok(res) } diff --git a/networks/monero/wallet/src/lib.rs b/networks/monero/wallet/src/lib.rs index 63f7488ac..035c4036c 100644 --- a/networks/monero/wallet/src/lib.rs +++ b/networks/monero/wallet/src/lib.rs @@ -33,7 +33,7 @@ pub(crate) mod output; pub use output::WalletOutput; mod scan; -pub use scan::{ScanError, Scanner, GuaranteedScanner}; +pub use scan::{Timelocked, ScanError, Scanner, GuaranteedScanner}; mod decoys; pub use decoys::OutputWithDecoys; @@ -137,15 +137,13 @@ impl SharedKeyDerivations { fn decrypt(&self, enc_amount: &EncryptedAmount) -> Commitment { match enc_amount { - // TODO: Add a test vector for this EncryptedAmount::Original { mask, amount } => { - let mask_shared_sec = keccak256(self.shared_key.as_bytes()); - let mask = - Scalar::from_bytes_mod_order(*mask) - Scalar::from_bytes_mod_order(mask_shared_sec); + let mask_shared_sec_scalar = keccak256_to_scalar(self.shared_key.as_bytes()); + let amount_shared_sec_scalar = keccak256_to_scalar(mask_shared_sec_scalar.as_bytes()); + + let mask = Scalar::from_bytes_mod_order(*mask) - mask_shared_sec_scalar; + let amount_scalar = Scalar::from_bytes_mod_order(*amount) - amount_shared_sec_scalar; - let amount_shared_sec = keccak256(mask_shared_sec); - let amount_scalar = - Scalar::from_bytes_mod_order(*amount) - Scalar::from_bytes_mod_order(amount_shared_sec); // d2b from rctTypes.cpp let amount = u64::from_le_bytes(amount_scalar.to_bytes()[0 .. 8].try_into().unwrap()); diff --git a/networks/monero/wallet/src/scan.rs b/networks/monero/wallet/src/scan.rs index 0de35f352..19f4d50fb 100644 --- a/networks/monero/wallet/src/scan.rs +++ b/networks/monero/wallet/src/scan.rs @@ -41,9 +41,9 @@ impl Timelocked { /// /// `block` is the block number of the block the additional timelock must be satsified by. /// - /// `time` is represented in seconds since the epoch. Please note Monero uses an on-chain - /// deterministic clock for time which is subject to variance from the real world time. This time - /// argument will be evaluated against Monero's clock, not the local system's clock. + /// `time` is represented in seconds since the epoch and is in terms of Monero's on-chain clock. + /// That means outputs whose additional timelocks are statisfied by `Instant::now()` (the time + /// according to the local system clock) may still be locked due to variance with Monero's clock. #[must_use] pub fn additional_timelock_satisfied_by(self, block: usize, time: u64) -> Vec { let mut res = vec![]; diff --git a/networks/monero/wallet/src/send/mod.rs b/networks/monero/wallet/src/send/mod.rs index 87d98d69f..ca92961f1 100644 --- a/networks/monero/wallet/src/send/mod.rs +++ b/networks/monero/wallet/src/send/mod.rs @@ -29,6 +29,7 @@ use crate::{ }; mod tx_keys; +pub use tx_keys::TransactionKeys; mod tx; mod eventuality; pub use eventuality::Eventuality; @@ -100,10 +101,11 @@ impl Change { /// /// 1) The change in the TX is shunted to the fee (making it fingerprintable). /// - /// 2) If there are two outputs in the TX, Monero would create a payment ID for the non-change - /// output so an observer can't tell apart TXs with a payment ID from TXs without a payment - /// ID. monero-wallet will simply not create a payment ID in this case, revealing it's a - /// monero-wallet TX without change. + /// 2) In two-output transactions, where the payment address doesn't have a payment ID, wallet2 + /// includes an encrypted dummy payment ID for the non-change output in order to not allow + /// differentiating if transactions send to addresses with payment IDs or not. monero-wallet + /// includes a dummy payment ID which at least one recipient will identify as not the expected + /// dummy payment ID, revealing to the recipient(s) the sender is using non-wallet2 software. pub fn fingerprintable(address: Option) -> Change { if let Some(address) = address { Change(Some(ChangeEnum::AddressOnly(address))) diff --git a/networks/monero/wallet/src/send/tx.rs b/networks/monero/wallet/src/send/tx.rs index 659622115..0ebd47f10 100644 --- a/networks/monero/wallet/src/send/tx.rs +++ b/networks/monero/wallet/src/send/tx.rs @@ -76,10 +76,18 @@ impl SignableTransaction { PaymentId::Encrypted(id).write(&mut id_vec).unwrap(); extra.push_nonce(id_vec); } else { - // If there's no payment ID, we push a dummy (as wallet2 does) if there's only one payment - if (self.payments.len() == 2) && - self.payments.iter().any(|payment| matches!(payment, InternalPayment::Change(_))) - { + /* + If there's no payment ID, we push a dummy (as wallet2 does) to the first payment. + + This does cause a random payment ID for the other recipient (a documented fingerprint). + Functionally, random payment IDs should be fine as wallet2 will trigger this same behavior + (a random payment ID being seen by the recipient) with a batch send if one of the recipient + addresses has a payment ID. + + The alternative would be to not include any payment ID, fingerprinting to the entire + blockchain this is non-standard wallet software (instead of just a single recipient). + */ + if self.payments.len() == 2 { let (_, payment_id_xor) = self .payments .iter() diff --git a/networks/monero/wallet/src/send/tx_keys.rs b/networks/monero/wallet/src/send/tx_keys.rs index 7edc9ffd6..52db422a8 100644 --- a/networks/monero/wallet/src/send/tx_keys.rs +++ b/networks/monero/wallet/src/send/tx_keys.rs @@ -1,7 +1,7 @@ use core::ops::Deref; use std_shims::{vec, vec::Vec}; -use zeroize::Zeroizing; +use zeroize::{Zeroize, Zeroizing}; use rand_core::SeedableRng; use rand_chacha::ChaCha20Rng; @@ -15,28 +15,61 @@ use crate::{ send::{ChangeEnum, InternalPayment, SignableTransaction, key_image_sort}, }; +fn seeded_rng( + dst: &'static [u8], + outgoing_view_key: &[u8; 32], + mut input_keys: Vec, +) -> ChaCha20Rng { + // Apply the DST + let mut transcript = Zeroizing::new(vec![u8::try_from(dst.len()).unwrap()]); + transcript.extend(dst); + + // Bind to the outgoing view key to prevent foreign entities from rebuilding the transcript + transcript.extend(outgoing_view_key); + + // We sort the inputs here to ensure a consistent order + // We use the key image sort as it's applicable and well-defined, not because these are key + // images + input_keys.sort_by(key_image_sort); + + // Ensure uniqueness across transactions by binding to a use-once object + // The keys for the inputs is binding to their key images, making them use-once + for key in input_keys { + transcript.extend(key.compress().to_bytes()); + } + + let res = ChaCha20Rng::from_seed(keccak256(&transcript)); + transcript.zeroize(); + res +} + +/// An iterator yielding an endless amount of ephemeral keys to use within a transaction. +/// +/// This is used when sending and can be used after sending to re-derive the keys used, as +/// necessary for payment proofs. +pub struct TransactionKeys(ChaCha20Rng); +impl TransactionKeys { + /// Construct a new `TransactionKeys`. + /// + /// `input_keys` is the list of keys from the outputs spent within this transaction. + pub fn new(outgoing_view_key: &Zeroizing<[u8; 32]>, input_keys: Vec) -> Self { + Self(seeded_rng(b"transaction_keys", outgoing_view_key, input_keys)) + } +} +impl Iterator for TransactionKeys { + type Item = Zeroizing; + fn next(&mut self) -> Option { + Some(Zeroizing::new(Scalar::random(&mut self.0))) + } +} + impl SignableTransaction { - pub(crate) fn seeded_rng(&self, dst: &'static [u8]) -> ChaCha20Rng { - // Apply the DST - let mut transcript = Zeroizing::new(vec![u8::try_from(dst.len()).unwrap()]); - transcript.extend(dst); - - // Bind to the outgoing view key to prevent foreign entities from rebuilding the transcript - transcript.extend(self.outgoing_view_key.as_slice()); - - // Ensure uniqueness across transactions by binding to a use-once object - // The keys for the inputs is binding to their key images, making them use-once - let mut input_keys = self.inputs.iter().map(OutputWithDecoys::key).collect::>(); - // We sort the inputs mid-way through TX construction, so apply our own sort to ensure a - // consistent order - // We use the key image sort as it's applicable and well-defined, not because these are key - // images - input_keys.sort_by(key_image_sort); - for key in input_keys { - transcript.extend(key.compress().to_bytes()); - } + fn input_keys(&self) -> Vec { + self.inputs.iter().map(OutputWithDecoys::key).collect() + } - ChaCha20Rng::from_seed(keccak256(&transcript)) + pub(crate) fn seeded_rng(&self, dst: &'static [u8]) -> ChaCha20Rng { + seeded_rng(dst, &self.outgoing_view_key, self.input_keys()) } fn has_payments_to_subaddresses(&self) -> bool { @@ -81,14 +114,14 @@ impl SignableTransaction { // Calculate the transaction keys used as randomness. fn transaction_keys(&self) -> (Zeroizing, Vec>) { - let mut rng = self.seeded_rng(b"transaction_keys"); + let mut tx_keys = TransactionKeys::new(&self.outgoing_view_key, self.input_keys()); - let tx_key = Zeroizing::new(Scalar::random(&mut rng)); + let tx_key = tx_keys.next().unwrap(); let mut additional_keys = vec![]; if self.should_use_additional_keys() { for _ in 0 .. self.payments.len() { - additional_keys.push(Zeroizing::new(Scalar::random(&mut rng))); + additional_keys.push(tx_keys.next().unwrap()); } } (tx_key, additional_keys) diff --git a/networks/monero/wallet/src/tests/extra.rs b/networks/monero/wallet/src/tests/extra.rs index 2f331e619..497602ce2 100644 --- a/networks/monero/wallet/src/tests/extra.rs +++ b/networks/monero/wallet/src/tests/extra.rs @@ -8,7 +8,7 @@ use crate::{ // Tests derived from // https://github.com/monero-project/monero/blob/ac02af92867590ca80b2779a7bbeafa99ff94dcb/ // tests/unit_tests/test_tx_utils.cpp -// which is licensed +// which is licensed as follows: #[rustfmt::skip] /* Copyright (c) 2014-2022, The Monero Project @@ -105,13 +105,15 @@ fn padding_only_max_size() { #[test] fn padding_only_exceed_max_size() { let buf: Vec = vec![0; MAX_TX_EXTRA_PADDING_COUNT + 1]; - Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap_err(); + let extra = Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap(); + assert!(extra.0.is_empty()); } #[test] fn invalid_padding_only() { let buf: Vec = vec![0, 42]; - Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap_err(); + let extra = Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap(); + assert!(extra.0.is_empty()); } #[test] @@ -135,7 +137,8 @@ fn extra_nonce_only_wrong_size() { let mut buf: Vec = vec![0; 20]; buf[0] = 2; buf[1] = 255; - Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap_err(); + let extra = Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap(); + assert!(extra.0.is_empty()); } #[test] @@ -155,7 +158,8 @@ fn pub_key_and_padding() { fn pub_key_and_invalid_padding() { let mut buf: Vec = PUB_KEY_BYTES.to_vec(); buf.extend([0, 1]); - Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap_err(); + let extra = Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap(); + assert_eq!(extra.0, vec![ExtraField::PublicKey(pub_key())]); } #[test] @@ -181,7 +185,8 @@ fn extra_mysterious_minergate_only_wrong_size() { let mut buf: Vec = vec![0; 20]; buf[0] = 222; buf[1] = 255; - Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap_err(); + let extra = Extra::read::<&[u8]>(&mut buf.as_ref()).unwrap(); + assert!(extra.0.is_empty()); } #[test] diff --git a/networks/monero/wallet/src/tests/mod.rs b/networks/monero/wallet/src/tests/mod.rs index d8fa7cb07..9f1515987 100644 --- a/networks/monero/wallet/src/tests/mod.rs +++ b/networks/monero/wallet/src/tests/mod.rs @@ -1 +1,2 @@ mod extra; +mod scan; diff --git a/networks/monero/wallet/src/tests/scan.rs b/networks/monero/wallet/src/tests/scan.rs new file mode 100644 index 000000000..4f4da2391 --- /dev/null +++ b/networks/monero/wallet/src/tests/scan.rs @@ -0,0 +1,168 @@ +use monero_rpc::ScannableBlock; +use crate::{ + transaction::{Pruned, Transaction}, + block::Block, + ViewPair, Scanner, WalletOutput, + output::{AbsoluteId, RelativeId, OutputData, Metadata}, + Commitment, + PaymentId::Encrypted, + transaction::Timelock, + ringct::EncryptedAmount, +}; +use zeroize::Zeroizing; +use curve25519_dalek::{Scalar, constants::ED25519_BASEPOINT_TABLE, edwards::CompressedEdwardsY}; + +const SPEND_KEY: &str = "ccf0ea10e1ea64354f42fa710c2b318e581969cf49046d809d1f0aadb3fc7a02"; +const VIEW_KEY: &str = "a28b4b2085592881df94ee95da332c16b5bb773eb8bb74730208cbb236c73806"; + +#[rustfmt::skip] +const PRUNED_TX_WITH_LONG_ENCRYPTED_AMOUNT: &str = "020001020003060101cf60390bb71aa15eb24037772012d59dc68cb4b6211e1c93206db09a6c346261020002ee8ca293511571c0005e1c144e49d09b8ff03046dbafb3e064a34cb9fc1994b600029e2e5cd08c8681dbcf2ce66071467e835f7e86613fbfed3c4fb170127b94e1072c01d3ce2a622c6e06ed465f81017dd6188c3a6e3d8e65a846f9c98416da0e150a82020901c553d35e54111bd001e0bbcbf289d701ce90e309ead2b487ec1d4d8af5d649543eb99a7620f6b54e532898527be29704f050e6f06de61e5967b2ddd506b4d6d36546065d6aae156ac7bec18c99580c07867fb98cb29853edbafec91af2df605c12f9aaa81a9165625afb6649f5a652012c5ba6612351140e1fb4a8463cc765d0a9bb7d999ba35750f365c5285d77230b76c7a612784f4845812a2899f2ca6a304fee61362db59b263115c27d2ce78af6b1d9e939c1f4036c7707851f41abe6458cf1c748353e593469ebf43536a939f7"; + +#[rustfmt::skip] +const BLOCK: &str = "0202e8e28efe04db09e2fc4d57854786220bd33e0169ff692440d27ae3932b9219df9ab1d7260b00000000014101ff050580d0acf30e02704972eb1878e94686b62fa4c0202f3e7e3a263073bd6edd751990ea769494ee80c0fc82aa0202edac72ab7c5745d4acaa95f76a3b76e238a55743cd51efb586f968e09821788d80d0dbc3f40202f9b4cf3141aac4203a1aaed01f09326615544997d1b68964928d9aafd07e38e580a0e5b9c29101023405e3aa75b1b7adf04e8c7faa3c3d45616ae740a8b11fb7cc1555dd8b9e4c9180c0dfda8ee90602d2b78accfe1c2ae57bed4fe3385f7735a988f160ef3bbc1f9d7a0c911c26ffd92101d2d55b5066d247a97696be4a84bf70873e4f149687f57e606eb6682f11650e1701b74773bbea995079805398052da9b69244bda034b089b50e4d9151dedb59a12f"; + +const OUTPUT_INDEX_FOR_FIRST_RINGCT_OUTPUT: u64 = 0; // note the miner tx is a v1 tx + +fn wallet_output0() -> WalletOutput { + WalletOutput { + absolute_id: AbsoluteId { + transaction: hex::decode("b74773bbea995079805398052da9b69244bda034b089b50e4d9151dedb59a12f") + .unwrap() + .try_into() + .unwrap(), + index_in_transaction: 0, + }, + relative_id: RelativeId { index_on_blockchain: OUTPUT_INDEX_FOR_FIRST_RINGCT_OUTPUT }, + data: OutputData { + key: CompressedEdwardsY( + hex::decode("ee8ca293511571c0005e1c144e49d09b8ff03046dbafb3e064a34cb9fc1994b6") + .unwrap() + .try_into() + .unwrap(), + ) + .decompress() + .unwrap(), + key_offset: Scalar::from_canonical_bytes( + hex::decode("f1d21a76ea0bb228fbc5f0dece0597a8ffb59de7a04b29f70b7c0310446ea905") + .unwrap() + .try_into() + .unwrap(), + ) + .unwrap(), + commitment: Commitment { + amount: 10000, + mask: Scalar::from_canonical_bytes( + hex::decode("05c2f142aaf3054cbff0a022f6c7cb75403fd92af0f9441c072ade3f273f7706") + .unwrap() + .try_into() + .unwrap(), + ) + .unwrap(), + }, + }, + metadata: Metadata { + additional_timelock: Timelock::None, + subaddress: None, + payment_id: Some(Encrypted([0, 0, 0, 0, 0, 0, 0, 0])), + arbitrary_data: [].to_vec(), + }, + } +} + +fn wallet_output1() -> WalletOutput { + WalletOutput { + absolute_id: AbsoluteId { + transaction: hex::decode("b74773bbea995079805398052da9b69244bda034b089b50e4d9151dedb59a12f") + .unwrap() + .try_into() + .unwrap(), + index_in_transaction: 1, + }, + relative_id: RelativeId { index_on_blockchain: OUTPUT_INDEX_FOR_FIRST_RINGCT_OUTPUT + 1 }, + data: OutputData { + key: CompressedEdwardsY( + hex::decode("9e2e5cd08c8681dbcf2ce66071467e835f7e86613fbfed3c4fb170127b94e107") + .unwrap() + .try_into() + .unwrap(), + ) + .decompress() + .unwrap(), + key_offset: Scalar::from_canonical_bytes( + hex::decode("c5189738c1cb40e68d464f1a1848a85f6ab2c09652a31849213dc0fefd212806") + .unwrap() + .try_into() + .unwrap(), + ) + .unwrap(), + commitment: Commitment { + amount: 10000, + mask: Scalar::from_canonical_bytes( + hex::decode("c8922ce32cb2bf454a6b77bc91423ba7a18412b71fa39a97a2a743c1fe0bad04") + .unwrap() + .try_into() + .unwrap(), + ) + .unwrap(), + }, + }, + metadata: Metadata { + additional_timelock: Timelock::None, + subaddress: None, + payment_id: Some(Encrypted([0, 0, 0, 0, 0, 0, 0, 0])), + arbitrary_data: [].to_vec(), + }, + } +} + +#[test] +fn scan_long_encrypted_amount() { + // Parse strings + let spend_key_buf = hex::decode(SPEND_KEY).unwrap(); + let spend_key = + Zeroizing::new(Scalar::from_canonical_bytes(spend_key_buf.try_into().unwrap()).unwrap()); + + let view_key_buf = hex::decode(VIEW_KEY).unwrap(); + let view_key = + Zeroizing::new(Scalar::from_canonical_bytes(view_key_buf.try_into().unwrap()).unwrap()); + + let tx_buf = hex::decode(PRUNED_TX_WITH_LONG_ENCRYPTED_AMOUNT).unwrap(); + let tx = Transaction::::read::<&[u8]>(&mut tx_buf.as_ref()).unwrap(); + + let block_buf = hex::decode(BLOCK).unwrap(); + let block = Block::read::<&[u8]>(&mut block_buf.as_ref()).unwrap(); + + // Confirm tx has long form encrypted amounts + match &tx { + Transaction::V2 { prefix: _, proofs } => { + let proofs = proofs.clone().unwrap(); + assert_eq!(proofs.base.encrypted_amounts.len(), 2); + assert!(proofs + .base + .encrypted_amounts + .iter() + .all(|o| matches!(o, EncryptedAmount::Original { .. }))); + } + _ => panic!("Unexpected tx version"), + }; + + // Prepare scanner + let spend_pub = &*spend_key * ED25519_BASEPOINT_TABLE; + let view: ViewPair = ViewPair::new(spend_pub, view_key).unwrap(); + let mut scanner = Scanner::new(view); + + // Prepare scannable block + let txs: Vec> = vec![tx]; + let scannable_block = ScannableBlock { + block, + transactions: txs, + output_index_for_first_ringct_output: Some(OUTPUT_INDEX_FOR_FIRST_RINGCT_OUTPUT), + }; + + // Scan the block + let outputs = scanner.scan(scannable_block).unwrap().not_additionally_locked(); + + assert_eq!(outputs.len(), 2); + assert_eq!(outputs[0], wallet_output0()); + assert_eq!(outputs[1], wallet_output1()); +} diff --git a/networks/monero/wallet/util/Cargo.toml b/networks/monero/wallet/util/Cargo.toml deleted file mode 100644 index 39dfe3a64..000000000 --- a/networks/monero/wallet/util/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -name = "monero-wallet-util" -version = "0.1.0" -description = "Additional utility functions for monero-wallet" -license = "MIT" -repository = "https://github.com/serai-dex/serai/tree/develop/networks/monero/wallet/util" -authors = ["Luke Parker "] -edition = "2021" -rust-version = "1.80" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[lints] -workspace = true - -[dependencies] -std-shims = { path = "../../../../common/std-shims", version = "^0.1.1", default-features = false } - -thiserror = { version = "1", default-features = false, optional = true } - -zeroize = { version = "^1.5", default-features = false, features = ["zeroize_derive"] } -rand_core = { version = "0.6", default-features = false } - -monero-wallet = { path = "..", default-features = false } - -monero-seed = { path = "../seed", default-features = false } -polyseed = { path = "../polyseed", default-features = false } - -[dev-dependencies] -hex = { version = "0.4", default-features = false, features = ["std"] } -curve25519-dalek = { version = "4", default-features = false, features = ["alloc", "zeroize"] } - -[features] -std = [ - "std-shims/std", - - "thiserror", - - "zeroize/std", - "rand_core/std", - - "monero-wallet/std", - - "monero-seed/std", - "polyseed/std", -] -compile-time-generators = ["monero-wallet/compile-time-generators"] -multisig = ["monero-wallet/multisig", "std"] -default = ["std", "compile-time-generators"] diff --git a/networks/monero/wallet/util/LICENSE b/networks/monero/wallet/util/LICENSE deleted file mode 100644 index 91d893c11..000000000 --- a/networks/monero/wallet/util/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022-2024 Luke Parker - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/networks/monero/wallet/util/README.md b/networks/monero/wallet/util/README.md deleted file mode 100644 index 15d7c80ca..000000000 --- a/networks/monero/wallet/util/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Monero Wallet Utilities - -Additional utility functions for monero-wallet. - -This library is isolated as it adds a notable amount of dependencies to the -tree, and to be a subject to a distinct versioning policy. This library may -more frequently undergo breaking API changes. - -This library is usable under no-std when the `std` feature (on by default) is -disabled. - -### Features - -- Support for Monero's seed algorithm -- Support for Polyseed - -### Cargo Features - -- `std` (on by default): Enables `std` (and with it, more efficient internal - implementations). -- `compile-time-generators` (on by default): Derives the generators at - compile-time so they don't need to be derived at runtime. This is recommended - if program size doesn't need to be kept minimal. -- `multisig`: Adds support for creation of transactions using a threshold - multisignature wallet. diff --git a/networks/monero/wallet/util/src/lib.rs b/networks/monero/wallet/util/src/lib.rs deleted file mode 100644 index e2aaa6962..000000000 --- a/networks/monero/wallet/util/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![doc = include_str!("../README.md")] -#![deny(missing_docs)] -#![cfg_attr(not(feature = "std"), no_std)] - -pub use monero_wallet::*; - -/// Seed creation and parsing functionality. -pub mod seed; diff --git a/networks/monero/wallet/util/src/seed.rs b/networks/monero/wallet/util/src/seed.rs deleted file mode 100644 index 77ca3358d..000000000 --- a/networks/monero/wallet/util/src/seed.rs +++ /dev/null @@ -1,150 +0,0 @@ -use core::fmt; -use std_shims::string::String; - -use zeroize::{Zeroize, ZeroizeOnDrop, Zeroizing}; -use rand_core::{RngCore, CryptoRng}; - -pub use monero_seed as original; -pub use polyseed; - -use original::{SeedError as OriginalSeedError, Seed as OriginalSeed}; -use polyseed::{PolyseedError, Polyseed}; - -/// An error from working with seeds. -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -#[cfg_attr(feature = "std", derive(thiserror::Error))] -pub enum SeedError { - /// The seed was invalid. - #[cfg_attr(feature = "std", error("invalid seed"))] - InvalidSeed, - /// The entropy was invalid. - #[cfg_attr(feature = "std", error("invalid entropy"))] - InvalidEntropy, - /// The checksum did not match the data. - #[cfg_attr(feature = "std", error("invalid checksum"))] - InvalidChecksum, - /// Unsupported features were enabled. - #[cfg_attr(feature = "std", error("unsupported features"))] - UnsupportedFeatures, -} - -impl From for SeedError { - fn from(error: OriginalSeedError) -> SeedError { - match error { - OriginalSeedError::DeprecatedEnglishWithChecksum | OriginalSeedError::InvalidChecksum => { - SeedError::InvalidChecksum - } - OriginalSeedError::InvalidSeed => SeedError::InvalidSeed, - } - } -} - -impl From for SeedError { - fn from(error: PolyseedError) -> SeedError { - match error { - PolyseedError::UnsupportedFeatures => SeedError::UnsupportedFeatures, - PolyseedError::InvalidEntropy => SeedError::InvalidEntropy, - PolyseedError::InvalidSeed => SeedError::InvalidSeed, - PolyseedError::InvalidChecksum => SeedError::InvalidChecksum, - } - } -} - -/// The type of the seed. -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub enum SeedType { - /// The seed format originally used by Monero, - Original(monero_seed::Language), - /// Polyseed. - Polyseed(polyseed::Language), -} - -/// A seed, internally either the original format or a Polyseed. -#[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)] -pub enum Seed { - /// The originally formatted seed. - Original(OriginalSeed), - /// A Polyseed. - Polyseed(Polyseed), -} - -impl fmt::Debug for Seed { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Seed::Original(_) => f.debug_struct("Seed::Original").finish_non_exhaustive(), - Seed::Polyseed(_) => f.debug_struct("Seed::Polyseed").finish_non_exhaustive(), - } - } -} - -impl Seed { - /// Create a new seed. - pub fn new(rng: &mut R, seed_type: SeedType) -> Seed { - match seed_type { - SeedType::Original(lang) => Seed::Original(OriginalSeed::new(rng, lang)), - SeedType::Polyseed(lang) => Seed::Polyseed(Polyseed::new(rng, lang)), - } - } - - /// Parse a seed from a string. - pub fn from_string(seed_type: SeedType, words: Zeroizing) -> Result { - match seed_type { - SeedType::Original(lang) => Ok(OriginalSeed::from_string(lang, words).map(Seed::Original)?), - SeedType::Polyseed(lang) => Ok(Polyseed::from_string(lang, words).map(Seed::Polyseed)?), - } - } - - /// Create a seed from entropy. - /// - /// A birthday may be optionally provided, denoted in seconds since the epoch. For - /// SeedType::Original, it will be ignored. For SeedType::Polyseed, it'll be embedded into the - /// seed. - /// - /// For SeedType::Polyseed, the last 13 bytes of `entropy` must be 0. - // TODO: Return Result, not Option - pub fn from_entropy( - seed_type: SeedType, - entropy: Zeroizing<[u8; 32]>, - birthday: Option, - ) -> Option { - match seed_type { - SeedType::Original(lang) => OriginalSeed::from_entropy(lang, entropy).map(Seed::Original), - SeedType::Polyseed(lang) => { - Polyseed::from(lang, 0, birthday.unwrap_or(0), entropy).ok().map(Seed::Polyseed) - } - } - } - - /// Converts the seed to a string. - pub fn to_string(&self) -> Zeroizing { - match self { - Seed::Original(seed) => seed.to_string(), - Seed::Polyseed(seed) => seed.to_string(), - } - } - - /// Get the entropy for this seed. - pub fn entropy(&self) -> Zeroizing<[u8; 32]> { - match self { - Seed::Original(seed) => seed.entropy(), - Seed::Polyseed(seed) => seed.entropy().clone(), - } - } - - /// Get the key derived from this seed. - pub fn key(&self) -> Zeroizing<[u8; 32]> { - match self { - // Original does not differentiate between its entropy and its key - Seed::Original(seed) => seed.entropy(), - Seed::Polyseed(seed) => seed.key(), - } - } - - /// Get the birthday of this seed, denoted in seconds since the epoch. - pub fn birthday(&self) -> u64 { - match self { - Seed::Original(_) => 0, - Seed::Polyseed(seed) => seed.birthday(), - } - } -} diff --git a/networks/monero/wallet/util/tests/tests.rs b/networks/monero/wallet/util/tests/tests.rs deleted file mode 100644 index 7b6656f26..000000000 --- a/networks/monero/wallet/util/tests/tests.rs +++ /dev/null @@ -1,3 +0,0 @@ -// TODO -#[test] -fn test() {} diff --git a/processor/src/batch_signer.rs b/processor/src/batch_signer.rs index 41f50322c..64cbb8a08 100644 --- a/processor/src/batch_signer.rs +++ b/processor/src/batch_signer.rs @@ -17,7 +17,7 @@ use frost_schnorrkel::Schnorrkel; use log::{info, debug, warn}; use serai_client::{ - primitives::{NetworkId, BlockHash}, + primitives::{ExternalNetworkId, BlockHash}, in_instructions::primitives::{Batch, SignedBatch, batch_message}, validator_sets::primitives::Session, }; @@ -41,7 +41,7 @@ type SignatureShare = as SignMachin pub struct BatchSigner { db: PhantomData, - network: NetworkId, + network: ExternalNetworkId, session: Session, keys: Vec>, @@ -65,7 +65,7 @@ impl fmt::Debug for BatchSigner { impl BatchSigner { pub fn new( - network: NetworkId, + network: ExternalNetworkId, session: Session, keys: Vec>, ) -> BatchSigner { diff --git a/processor/src/main.rs b/processor/src/main.rs index e0d97aa68..98b09a066 100644 --- a/processor/src/main.rs +++ b/processor/src/main.rs @@ -9,7 +9,7 @@ use log::{info, warn}; use tokio::time::sleep; use serai_client::{ - primitives::{BlockHash, NetworkId}, + primitives::{BlockHash, ExternalNetworkId}, validator_sets::primitives::{Session, KeyPair}, }; @@ -736,19 +736,23 @@ async fn main() { "http://".to_string() + &login + "@" + &hostname + ":" + &port }; let network_id = match env::var("NETWORK").expect("network wasn't specified").as_str() { - "bitcoin" => NetworkId::Bitcoin, - "ethereum" => NetworkId::Ethereum, - "monero" => NetworkId::Monero, + "bitcoin" => ExternalNetworkId::Bitcoin, + "ethereum" => ExternalNetworkId::Ethereum, + "monero" => ExternalNetworkId::Monero, _ => panic!("unrecognized network"), }; let coordinator = MessageQueue::from_env(Service::Processor(network_id)); + // This allow is necessary since each configuration deletes the other networks from the following + // match arms. So we match all cases but since all cases already there according to the compiler + // we put this to allow clippy to get pass this. + #[allow(unreachable_patterns)] match network_id { #[cfg(feature = "bitcoin")] - NetworkId::Bitcoin => run(db, Bitcoin::new(url).await, coordinator).await, + ExternalNetworkId::Bitcoin => run(db, Bitcoin::new(url).await, coordinator).await, #[cfg(feature = "ethereum")] - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { let relayer_hostname = env::var("ETHEREUM_RELAYER_HOSTNAME") .expect("ethereum relayer hostname wasn't specified") .to_string(); @@ -758,7 +762,7 @@ async fn main() { run(db.clone(), Ethereum::new(db, url, relayer_url).await, coordinator).await } #[cfg(feature = "monero")] - NetworkId::Monero => run(db, Monero::new(url).await, coordinator).await, + ExternalNetworkId::Monero => run(db, Monero::new(url).await, coordinator).await, _ => panic!("spawning a processor for an unsupported network"), } } diff --git a/processor/src/multisigs/db.rs b/processor/src/multisigs/db.rs index 3d1d13bdf..f5e05f683 100644 --- a/processor/src/multisigs/db.rs +++ b/processor/src/multisigs/db.rs @@ -4,7 +4,11 @@ use ciphersuite::Ciphersuite; pub use serai_db::*; use scale::{Encode, Decode}; -use serai_client::{primitives::Balance, in_instructions::primitives::InInstructionWithBalance}; +#[rustfmt::skip] +use serai_client::{ + in_instructions::primitives::InInstructionWithBalance, + primitives::ExternalBalance +}; use crate::{ Get, Plan, @@ -69,7 +73,7 @@ create_db!( OperatingCostsDb: () -> u64, ResolvedDb: (tx: &[u8]) -> [u8; 32], SigningDb: (key: &[u8]) -> Vec, - ForwardedOutputDb: (balance: Balance) -> Vec, + ForwardedOutputDb: (balance: ExternalBalance) -> Vec, DelayedOutputDb: () -> Vec } ); @@ -224,7 +228,7 @@ impl ForwardedOutputDb { pub fn take_forwarded_output( txn: &mut impl DbTxn, - balance: Balance, + balance: ExternalBalance, ) -> Option { let outputs = Self::get(txn, balance)?; let mut outputs_ref = outputs.as_slice(); diff --git a/processor/src/multisigs/scheduler/mod.rs b/processor/src/multisigs/scheduler/mod.rs index 26c940fe8..b34e2f3e6 100644 --- a/processor/src/multisigs/scheduler/mod.rs +++ b/processor/src/multisigs/scheduler/mod.rs @@ -3,7 +3,7 @@ use std::io; use ciphersuite::Ciphersuite; -use serai_client::primitives::{NetworkId, Balance}; +use serai_client::primitives::{ExternalBalance, ExternalNetworkId}; use crate::{networks::Network, Db, Payment, Plan}; @@ -34,18 +34,18 @@ pub trait Scheduler: Sized + Clone + PartialEq + Debug { fn new( txn: &mut D::Transaction<'_>, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> Self; /// Load a Scheduler from the DB. fn from_db( db: &D, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> io::Result; /// Check if a branch is usable. - fn can_use_branch(&self, balance: Balance) -> bool; + fn can_use_branch(&self, balance: ExternalBalance) -> bool; /// Schedule a series of outputs/payments. fn schedule( diff --git a/processor/src/multisigs/scheduler/smart_contract.rs b/processor/src/multisigs/scheduler/smart_contract.rs index 3da8acf48..a6bbbdaf0 100644 --- a/processor/src/multisigs/scheduler/smart_contract.rs +++ b/processor/src/multisigs/scheduler/smart_contract.rs @@ -2,7 +2,7 @@ use std::{io, collections::HashSet}; use ciphersuite::{group::GroupEncoding, Ciphersuite}; -use serai_client::primitives::{NetworkId, Coin, Balance}; +use serai_client::primitives::{ExternalBalance, ExternalCoin, ExternalNetworkId}; use crate::{ Get, DbTxn, Db, Payment, Plan, create_db, @@ -13,7 +13,7 @@ use crate::{ #[derive(Clone, PartialEq, Eq, Debug)] pub struct Scheduler { key: ::G, - coins: HashSet, + coins: HashSet, rotated: bool, } @@ -78,7 +78,7 @@ impl> SchedulerTrait for Scheduler { fn new( _txn: &mut D::Transaction<'_>, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> Self { assert!(N::branch_address(key).is_none()); assert!(N::change_address(key).is_none()); @@ -91,7 +91,7 @@ impl> SchedulerTrait for Scheduler { fn from_db( db: &D, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> io::Result { Ok(Scheduler { key, @@ -100,7 +100,7 @@ impl> SchedulerTrait for Scheduler { }) } - fn can_use_branch(&self, _balance: Balance) -> bool { + fn can_use_branch(&self, _balance: ExternalBalance) -> bool { false } diff --git a/processor/src/multisigs/scheduler/utxo.rs b/processor/src/multisigs/scheduler/utxo.rs index 1865cab91..3758e54c1 100644 --- a/processor/src/multisigs/scheduler/utxo.rs +++ b/processor/src/multisigs/scheduler/utxo.rs @@ -5,7 +5,7 @@ use std::{ use ciphersuite::{group::GroupEncoding, Ciphersuite}; -use serai_client::primitives::{NetworkId, Coin, Amount, Balance}; +use serai_client::primitives::{ExternalNetworkId, ExternalCoin, Amount, ExternalBalance}; use crate::{ DbTxn, Db, Payment, Plan, @@ -17,7 +17,7 @@ use crate::{ #[derive(Clone, PartialEq, Eq, Debug)] pub struct Scheduler { key: ::G, - coin: Coin, + coin: ExternalCoin, // Serai, when it has more outputs expected than it can handle in a single transaction, will // schedule the outputs to be handled later. Immediately, it just creates additional outputs @@ -57,7 +57,7 @@ impl> Scheduler { fn read( key: ::G, - coin: Coin, + coin: ExternalCoin, reader: &mut R, ) -> io::Result { let mut read_plans = || -> io::Result<_> { @@ -145,7 +145,7 @@ impl> Scheduler { pub fn new( txn: &mut D::Transaction<'_>, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> Self { assert!(N::branch_address(key).is_some()); assert!(N::change_address(key).is_some()); @@ -173,7 +173,7 @@ impl> Scheduler { pub fn from_db( db: &D, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> io::Result { let coin = { let coins = network.coins(); @@ -190,7 +190,7 @@ impl> Scheduler { Self::read(key, coin, reader) } - pub fn can_use_branch(&self, balance: Balance) -> bool { + pub fn can_use_branch(&self, balance: ExternalBalance) -> bool { assert_eq!(balance.coin, self.coin); self.plans.contains_key(&balance.amount.0) } @@ -249,7 +249,7 @@ impl> Scheduler { Payment { address: branch_address.clone(), data: None, - balance: Balance { coin: self.coin, amount: Amount(amount) }, + balance: ExternalBalance { coin: self.coin, amount: Amount(amount) }, }, ); } @@ -536,7 +536,7 @@ impl> SchedulerTrait for Scheduler { fn new( txn: &mut D::Transaction<'_>, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> Self { Scheduler::new::(txn, key, network) } @@ -545,13 +545,13 @@ impl> SchedulerTrait for Scheduler { fn from_db( db: &D, key: ::G, - network: NetworkId, + network: ExternalNetworkId, ) -> io::Result { Scheduler::from_db::(db, key, network) } /// Check if a branch is usable. - fn can_use_branch(&self, balance: Balance) -> bool { + fn can_use_branch(&self, balance: ExternalBalance) -> bool { Scheduler::can_use_branch(self, balance) } @@ -574,7 +574,7 @@ impl> SchedulerTrait for Scheduler { /// Note a branch output as having been created, with the amount it was actually created with, /// or not having been created due to being too small. - // TODO: Move this to Balance. + // TODO: Move this to ExternalBalance. fn created_output( &mut self, txn: &mut D::Transaction<'_>, diff --git a/processor/src/networks/bitcoin.rs b/processor/src/networks/bitcoin.rs index ae62f4c8f..5702f5ed9 100644 --- a/processor/src/networks/bitcoin.rs +++ b/processor/src/networks/bitcoin.rs @@ -4,7 +4,6 @@ use async_trait::async_trait; use scale::{Encode, Decode}; -use transcript::{Transcript, RecommendedTranscript}; use ciphersuite::group::ff::PrimeField; use k256::{ProjectivePoint, Scalar}; use frost::{ @@ -43,7 +42,7 @@ use bitcoin_serai::bitcoin::{ }; use serai_client::{ - primitives::{MAX_DATA_LEN, Coin, NetworkId, Amount, Balance}, + primitives::{MAX_DATA_LEN, ExternalCoin, ExternalNetworkId, Amount, ExternalBalance}, networks::bitcoin::Address, }; @@ -126,8 +125,8 @@ impl OutputTrait for Output { self.presumed_origin.clone() } - fn balance(&self) -> Balance { - Balance { coin: Coin::Bitcoin, amount: Amount(self.output.value()) } + fn balance(&self) -> ExternalBalance { + ExternalBalance { coin: ExternalCoin::Bitcoin, amount: Amount(self.output.value()) } } fn data(&self) -> &[u8] { @@ -249,7 +248,6 @@ impl EventualityTrait for Eventuality { #[derive(Clone, Debug)] pub struct SignableTransaction { - transcript: RecommendedTranscript, actual: BSignableTransaction, } impl PartialEq for SignableTransaction { @@ -425,7 +423,7 @@ impl Bitcoin { calculating_fee: bool, ) -> Result, NetworkError> { for payment in payments { - assert_eq!(payment.balance.coin, Coin::Bitcoin); + assert_eq!(payment.balance.coin, ExternalCoin::Bitcoin); } // TODO2: Use an fee representative of several blocks, cached inside Self @@ -457,7 +455,7 @@ impl Bitcoin { panic!("trying to create a bitcoin transaction without inputs") } // No outputs left and the change isn't worth enough/not even enough funds to pay the fee - Err(TransactionError::NoOutputs | TransactionError::NotEnoughFunds) => Ok(None), + Err(TransactionError::NoOutputs | TransactionError::NotEnoughFunds { .. }) => Ok(None), // amortize_fee removes payments which fall below the dust threshold Err(TransactionError::DustPayment) => panic!("dust payment despite removing dust"), Err(TransactionError::TooMuchData) => { @@ -600,7 +598,7 @@ impl Network for Bitcoin { type Address = Address; - const NETWORK: NetworkId = NetworkId::Bitcoin; + const NETWORK: ExternalNetworkId = ExternalNetworkId::Bitcoin; const ID: &'static str = "Bitcoin"; const ESTIMATED_BLOCK_TIME_IN_SECONDS: usize = 600; const CONFIRMATIONS: usize = 6; @@ -820,7 +818,7 @@ impl Network for Bitcoin { async fn signable_transaction( &self, block_number: usize, - plan_id: &[u8; 32], + _plan_id: &[u8; 32], _key: ProjectivePoint, inputs: &[Output], payments: &[Payment], @@ -829,12 +827,8 @@ impl Network for Bitcoin { ) -> Result, NetworkError> { Ok(self.make_signable_transaction(block_number, inputs, payments, change, false).await?.map( |signable| { - let mut transcript = - RecommendedTranscript::new(b"Serai Processor Bitcoin Transaction Transcript"); - transcript.append_message(b"plan", plan_id); - let eventuality = Eventuality(signable.txid()); - (SignableTransaction { transcript, actual: signable }, eventuality) + (SignableTransaction { actual: signable }, eventuality) }, )) } @@ -844,13 +838,7 @@ impl Network for Bitcoin { keys: ThresholdKeys, transaction: Self::SignableTransaction, ) -> Result { - Ok( - transaction - .actual - .clone() - .multisig(&keys, transaction.transcript) - .expect("used the wrong keys"), - ) + Ok(transaction.actual.clone().multisig(&keys).expect("used the wrong keys")) } async fn publish_completion(&self, tx: &Transaction) -> Result<(), NetworkError> { diff --git a/processor/src/networks/ethereum.rs b/processor/src/networks/ethereum.rs index 3545f34ac..49c4bc61c 100644 --- a/processor/src/networks/ethereum.rs +++ b/processor/src/networks/ethereum.rs @@ -38,7 +38,7 @@ use tokio::{ }; use serai_client::{ - primitives::{Coin, Amount, Balance, NetworkId}, + primitives::{ExternalCoin, Amount, ExternalBalance, ExternalNetworkId}, validator_sets::primitives::Session, }; @@ -68,20 +68,20 @@ const DAI: [u8; 20] = Err(_) => panic!("invalid test DAI hex address"), }; -fn coin_to_serai_coin(coin: &EthereumCoin) -> Option { +fn coin_to_serai_coin(coin: &EthereumCoin) -> Option { match coin { - EthereumCoin::Ether => Some(Coin::Ether), + EthereumCoin::Ether => Some(ExternalCoin::Ether), EthereumCoin::Erc20(token) => { if *token == DAI { - return Some(Coin::Dai); + return Some(ExternalCoin::Dai); } None } } } -fn amount_to_serai_amount(coin: Coin, amount: U256) -> Amount { - assert_eq!(coin.network(), NetworkId::Ethereum); +fn amount_to_serai_amount(coin: ExternalCoin, amount: U256) -> Amount { + assert_eq!(coin.network(), ExternalNetworkId::Ethereum); assert_eq!(coin.decimals(), 8); // Remove 10 decimals so we go from 18 decimals to 8 decimals let divisor = U256::from(10_000_000_000u64); @@ -89,8 +89,8 @@ fn amount_to_serai_amount(coin: Coin, amount: U256) -> Amount { Amount(u64::try_from(amount / divisor).unwrap()) } -fn balance_to_ethereum_amount(balance: Balance) -> U256 { - assert_eq!(balance.coin.network(), NetworkId::Ethereum); +fn balance_to_ethereum_amount(balance: ExternalBalance) -> U256 { + assert_eq!(balance.coin.network(), ExternalNetworkId::Ethereum); assert_eq!(balance.coin.decimals(), 8); // Restore 10 decimals so we go from 8 decimals to 18 decimals let factor = U256::from(10_000_000_000u64); @@ -201,14 +201,14 @@ impl Output> for EthereumInInstruction { Some(Address(self.from)) } - fn balance(&self) -> Balance { + fn balance(&self) -> ExternalBalance { let coin = coin_to_serai_coin(&self.coin).unwrap_or_else(|| { panic!( "requesting coin for an EthereumInInstruction with a coin {}", "we don't handle. this never should have been yielded" ) }); - Balance { coin, amount: amount_to_serai_amount(coin, self.amount) } + ExternalBalance { coin, amount: amount_to_serai_amount(coin, self.amount) } } fn data(&self) -> &[u8] { &self.data @@ -394,7 +394,7 @@ impl Network for Ethereum { type Address = Address; - const NETWORK: NetworkId = NetworkId::Ethereum; + const NETWORK: ExternalNetworkId = ExternalNetworkId::Ethereum; const ID: &'static str = "Ethereum"; const ESTIMATED_BLOCK_TIME_IN_SECONDS: usize = 32 * 12; const CONFIRMATIONS: usize = 1; @@ -681,7 +681,7 @@ impl Network for Ethereum { OutInstructionTarget::Direct(payment.address.0) }, value: { - assert_eq!(payment.balance.coin, Coin::Ether); // TODO + assert_eq!(payment.balance.coin, ExternalCoin::Ether); // TODO balance_to_ethereum_amount(payment.balance) }, }) diff --git a/processor/src/networks/mod.rs b/processor/src/networks/mod.rs index ee3cd24af..9cfeff89c 100644 --- a/processor/src/networks/mod.rs +++ b/processor/src/networks/mod.rs @@ -10,7 +10,7 @@ use frost::{ sign::PreprocessMachine, }; -use serai_client::primitives::{NetworkId, Balance}; +use serai_client::primitives::{ExternalBalance, ExternalNetworkId}; use log::error; @@ -115,7 +115,7 @@ pub trait Output: Send + Sync + Sized + Clone + PartialEq + Eq + Deb fn presumed_origin(&self) -> Option; - fn balance(&self) -> Balance; + fn balance(&self) -> ExternalBalance; fn data(&self) -> &[u8]; fn write(&self, writer: &mut W) -> io::Result<()>; @@ -126,13 +126,13 @@ pub trait Output: Send + Sync + Sized + Clone + PartialEq + Eq + Deb pub trait Transaction: Send + Sync + Sized + Clone + PartialEq + Debug { type Id: 'static + Id; fn id(&self) -> Self::Id; - // TODO: Move to Balance + // TODO: Move to ExternalBalance #[cfg(test)] async fn fee(&self, network: &N) -> u64; } pub trait SignableTransaction: Send + Sync + Clone + Debug { - // TODO: Move to Balance + // TODO: Move to ExternalBalance fn fee(&self) -> u64; } @@ -280,7 +280,7 @@ pub trait Network: 'static + Send + Sync + Clone + PartialEq + Debug { + TryFrom>; /// Network ID for this network. - const NETWORK: NetworkId; + const NETWORK: ExternalNetworkId; /// String ID for this network. const ID: &'static str; /// The estimated amount of time a block will take. @@ -297,7 +297,7 @@ pub trait Network: 'static + Send + Sync + Clone + PartialEq + Debug { /// For any received output, there's the cost to spend the output. This value MUST exceed the /// cost to spend said output, and should by a notable margin (not just 2x, yet an order of /// magnitude). - // TODO: Dust needs to be diversified per Coin + // TODO: Dust needs to be diversified per ExternalCoin const DUST: u64; /// The cost to perform input aggregation with a 2-input 1-output TX. diff --git a/processor/src/networks/monero.rs b/processor/src/networks/monero.rs index 154702fef..4e70c0025 100644 --- a/processor/src/networks/monero.rs +++ b/processor/src/networks/monero.rs @@ -31,7 +31,7 @@ use monero_wallet::Scanner; use tokio::time::sleep; pub use serai_client::{ - primitives::{MAX_DATA_LEN, Coin, NetworkId, Amount, Balance}, + primitives::{MAX_DATA_LEN, ExternalCoin, ExternalNetworkId, Amount, ExternalBalance}, networks::monero::Address, }; @@ -85,8 +85,8 @@ impl OutputTrait for Output { None } - fn balance(&self) -> Balance { - Balance { coin: Coin::Monero, amount: Amount(self.0.commitment().amount) } + fn balance(&self) -> ExternalBalance { + ExternalBalance { coin: ExternalCoin::Monero, amount: Amount(self.0.commitment().amount) } } fn data(&self) -> &[u8] { @@ -308,7 +308,7 @@ impl Monero { calculating_fee: bool, ) -> Result, NetworkError> { for payment in payments { - assert_eq!(payment.balance.coin, Coin::Monero); + assert_eq!(payment.balance.coin, ExternalCoin::Monero); } // TODO2: Use an fee representative of several blocks, cached inside Self @@ -363,7 +363,7 @@ impl Monero { .legacy_address(MoneroNetwork::Mainnet), ) .unwrap(), - balance: Balance { coin: Coin::Monero, amount: Amount(0) }, + balance: ExternalBalance { coin: ExternalCoin::Monero, amount: Amount(0) }, data: None, }); } @@ -470,7 +470,7 @@ impl Network for Monero { type Address = Address; - const NETWORK: NetworkId = NetworkId::Monero; + const NETWORK: ExternalNetworkId = ExternalNetworkId::Monero; const ID: &'static str = "Monero"; const ESTIMATED_BLOCK_TIME_IN_SECONDS: usize = 120; const CONFIRMATIONS: usize = 10; diff --git a/processor/src/plan.rs b/processor/src/plan.rs index 58a8a5e11..caadef5ae 100644 --- a/processor/src/plan.rs +++ b/processor/src/plan.rs @@ -6,7 +6,7 @@ use transcript::{Transcript, RecommendedTranscript}; use ciphersuite::group::GroupEncoding; use frost::curve::Ciphersuite; -use serai_client::primitives::Balance; +use serai_client::primitives::ExternalBalance; use crate::{ networks::{Output, Network}, @@ -17,7 +17,7 @@ use crate::{ pub struct Payment { pub address: N::Address, pub data: Option>, - pub balance: Balance, + pub balance: ExternalBalance, } impl Payment { @@ -69,7 +69,7 @@ impl Payment { None }; - let balance = Balance::decode(&mut scale::IoReader(reader)) + let balance = ExternalBalance::decode(&mut scale::IoReader(reader)) .map_err(|_| io::Error::other("invalid balance"))?; Ok(Payment { address, data, balance }) diff --git a/processor/src/slash_report_signer.rs b/processor/src/slash_report_signer.rs index b7b2d55ce..056055f7c 100644 --- a/processor/src/slash_report_signer.rs +++ b/processor/src/slash_report_signer.rs @@ -17,9 +17,9 @@ use frost_schnorrkel::Schnorrkel; use log::{info, warn}; use serai_client::{ + primitives::ExternalNetworkId, + validator_sets::primitives::{report_slashes_message, ExternalValidatorSet, Session}, Public, - primitives::NetworkId, - validator_sets::primitives::{Session, ValidatorSet, report_slashes_message}, }; use messages::coordinator::*; @@ -38,7 +38,7 @@ type SignatureShare = as SignMachin >>::SignatureShare; pub struct SlashReportSigner { - network: NetworkId, + network: ExternalNetworkId, session: Session, keys: Vec>, report: Vec<([u8; 32], u32)>, @@ -66,7 +66,7 @@ impl fmt::Debug for SlashReportSigner { impl SlashReportSigner { pub fn new( txn: &mut impl DbTxn, - network: NetworkId, + network: ExternalNetworkId, session: Session, keys: Vec>, report: Vec<([u8; 32], u32)>, @@ -178,7 +178,7 @@ impl SlashReportSigner { let (machine, share) = match machine.sign( preprocesses, &report_slashes_message( - &ValidatorSet { network: self.network, session: self.session }, + &ExternalValidatorSet { network: self.network, session: self.session }, &self .report .clone() diff --git a/processor/src/tests/batch_signer.rs b/processor/src/tests/batch_signer.rs index dc45ff312..8da67ef13 100644 --- a/processor/src/tests/batch_signer.rs +++ b/processor/src/tests/batch_signer.rs @@ -33,17 +33,17 @@ fn test_batch_signer() { let block = BlockHash([0xaa; 32]); let batch = Batch { - network: NetworkId::Monero, + network: ExternalNetworkId::Monero, id, block, instructions: vec![ InInstructionWithBalance { instruction: InInstruction::Transfer(SeraiAddress([0xbb; 32])), - balance: Balance { coin: Coin::Bitcoin, amount: Amount(1000) }, + balance: ExternalBalance { coin: ExternalCoin::Bitcoin, amount: Amount(1000) }, }, InInstructionWithBalance { instruction: InInstruction::Dex(DexCall::SwapAndAddLiquidity(SeraiAddress([0xbb; 32]))), - balance: Balance { coin: Coin::Monero, amount: Amount(9999999999999999) }, + balance: ExternalBalance { coin: ExternalCoin::Monero, amount: Amount(9999999999999999) }, }, ], }; @@ -70,7 +70,7 @@ fn test_batch_signer() { let i = Participant::new(u16::try_from(i).unwrap()).unwrap(); let keys = keys.get(&i).unwrap().clone(); - let mut signer = BatchSigner::::new(NetworkId::Monero, Session(0), vec![keys]); + let mut signer = BatchSigner::::new(ExternalNetworkId::Monero, Session(0), vec![keys]); let mut db = MemDb::new(); let mut txn = db.txn(); diff --git a/processor/src/tests/signer.rs b/processor/src/tests/signer.rs index 77307ef26..26b26b35e 100644 --- a/processor/src/tests/signer.rs +++ b/processor/src/tests/signer.rs @@ -12,7 +12,7 @@ use frost::{ use serai_db::{DbTxn, Db, MemDb}; use serai_client::{ - primitives::{NetworkId, Coin, Amount, Balance}, + primitives::{ExternalNetworkId, ExternalCoin, Amount, ExternalBalance}, validator_sets::primitives::Session, }; @@ -185,12 +185,11 @@ pub async fn test_signer( let payments = vec![Payment { address: N::external_address(&network, key).await, data: None, - balance: Balance { + balance: ExternalBalance { coin: match N::NETWORK { - NetworkId::Serai => panic!("test_signer called with Serai"), - NetworkId::Bitcoin => Coin::Bitcoin, - NetworkId::Ethereum => Coin::Ether, - NetworkId::Monero => Coin::Monero, + ExternalNetworkId::Bitcoin => ExternalCoin::Bitcoin, + ExternalNetworkId::Ethereum => ExternalCoin::Ether, + ExternalNetworkId::Monero => ExternalCoin::Monero, }, amount: Amount(amount), }, @@ -224,7 +223,7 @@ pub async fn test_signer( .await; // Don't run if Ethereum as the received output will revert by the contract // (and therefore not actually exist) - if N::NETWORK != NetworkId::Ethereum { + if N::NETWORK != ExternalNetworkId::Ethereum { assert_eq!(outputs.len(), 1 + usize::from(u8::from(plan.change.is_some()))); // Adjust the amount for the fees let amount = amount - tx.fee(&network).await; diff --git a/processor/src/tests/wallet.rs b/processor/src/tests/wallet.rs index 86a27349d..74d7ccc0f 100644 --- a/processor/src/tests/wallet.rs +++ b/processor/src/tests/wallet.rs @@ -11,7 +11,7 @@ use tokio::time::timeout; use serai_db::{DbTxn, Db, MemDb}; use serai_client::{ - primitives::{NetworkId, Coin, Amount, Balance}, + primitives::{ExternalNetworkId, ExternalCoin, Amount, ExternalBalance}, validator_sets::primitives::Session, }; @@ -89,12 +89,11 @@ pub async fn test_wallet( vec![Payment { address: N::external_address(&network, key).await, data: None, - balance: Balance { + balance: ExternalBalance { coin: match N::NETWORK { - NetworkId::Serai => panic!("test_wallet called with Serai"), - NetworkId::Bitcoin => Coin::Bitcoin, - NetworkId::Ethereum => Coin::Ether, - NetworkId::Monero => Coin::Monero, + ExternalNetworkId::Bitcoin => ExternalCoin::Bitcoin, + ExternalNetworkId::Ethereum => ExternalCoin::Ether, + ExternalNetworkId::Monero => ExternalCoin::Monero, }, amount: Amount(amount), }, @@ -117,12 +116,11 @@ pub async fn test_wallet( vec![Payment { address: N::external_address(&network, key).await, data: None, - balance: Balance { + balance: ExternalBalance { coin: match N::NETWORK { - NetworkId::Serai => panic!("test_wallet called with Serai"), - NetworkId::Bitcoin => Coin::Bitcoin, - NetworkId::Ethereum => Coin::Ether, - NetworkId::Monero => Coin::Monero, + ExternalNetworkId::Bitcoin => ExternalCoin::Bitcoin, + ExternalNetworkId::Ethereum => ExternalCoin::Ether, + ExternalNetworkId::Monero => ExternalCoin::Monero, }, amount: Amount(amount), } @@ -160,7 +158,7 @@ pub async fn test_wallet( // Don't run if Ethereum as the received output will revert by the contract // (and therefore not actually exist) - if N::NETWORK != NetworkId::Ethereum { + if N::NETWORK != ExternalNetworkId::Ethereum { assert_eq!(outputs.len(), 1 + usize::from(u8::from(plans[0].change.is_some()))); // Adjust the amount for the fees let amount = amount - tx.fee(&network).await; @@ -183,7 +181,7 @@ pub async fn test_wallet( network.mine_block().await; } - if N::NETWORK != NetworkId::Ethereum { + if N::NETWORK != ExternalNetworkId::Ethereum { match timeout(Duration::from_secs(30), scanner.events.recv()).await.unwrap().unwrap() { ScannerEvent::Block { is_retirement_block, block: block_id, outputs: these_outputs } => { scanner.multisig_completed.send(false).unwrap(); diff --git a/spec/integrations/Instructions.md b/spec/integrations/Instructions.md index f509ca711..3ba1e23e5 100644 --- a/spec/integrations/Instructions.md +++ b/spec/integrations/Instructions.md @@ -23,7 +23,7 @@ instructed to act on invalid data, it will drop the entire instruction. ### Serialization -Instructions are SCALE encoded. +Instructions are [SCALE](https://docs.substrate.io/reference/scale-codec/) encoded. ### In Instruction diff --git a/substrate/abi/src/dex.rs b/substrate/abi/src/dex.rs index 2daa62f07..d85dace3d 100644 --- a/substrate/abi/src/dex.rs +++ b/substrate/abi/src/dex.rs @@ -2,7 +2,7 @@ use sp_runtime::BoundedVec; use serai_primitives::*; -type PoolId = Coin; +type PoolId = ExternalCoin; type MaxSwapPathLength = sp_core::ConstU32<3>; #[derive(Clone, PartialEq, Eq, Debug, scale::Encode, scale::Decode, scale_info::TypeInfo)] @@ -10,7 +10,7 @@ type MaxSwapPathLength = sp_core::ConstU32<3>; #[cfg_attr(all(feature = "std", feature = "serde"), derive(serde::Deserialize))] pub enum Call { add_liquidity { - coin: Coin, + coin: ExternalCoin, coin_desired: SubstrateAmount, sri_desired: SubstrateAmount, coin_min: SubstrateAmount, @@ -18,7 +18,7 @@ pub enum Call { mint_to: SeraiAddress, }, remove_liquidity { - coin: Coin, + coin: ExternalCoin, lp_token_burn: SubstrateAmount, coin_min_receive: SubstrateAmount, sri_min_receive: SubstrateAmount, diff --git a/substrate/abi/src/economic_security.rs b/substrate/abi/src/economic_security.rs index fc548def9..2899e0908 100644 --- a/substrate/abi/src/economic_security.rs +++ b/substrate/abi/src/economic_security.rs @@ -1,8 +1,8 @@ -use serai_primitives::NetworkId; +use serai_primitives::ExternalNetworkId; #[derive(Clone, PartialEq, Eq, Debug, scale::Encode, scale::Decode, scale_info::TypeInfo)] #[cfg_attr(feature = "borsh", derive(borsh::BorshSerialize, borsh::BorshDeserialize))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Event { - EconomicSecurityReached { network: NetworkId }, + EconomicSecurityReached { network: ExternalNetworkId }, } diff --git a/substrate/abi/src/genesis_liquidity.rs b/substrate/abi/src/genesis_liquidity.rs index 461284141..7660b3ab6 100644 --- a/substrate/abi/src/genesis_liquidity.rs +++ b/substrate/abi/src/genesis_liquidity.rs @@ -6,7 +6,7 @@ use primitives::*; #[derive(Clone, PartialEq, Eq, Debug, scale::Encode, scale::Decode, scale_info::TypeInfo)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Call { - remove_coin_liquidity { balance: Balance }, + remove_coin_liquidity { balance: ExternalBalance }, oraclize_values { values: Values, signature: Signature }, } @@ -14,8 +14,7 @@ pub enum Call { #[cfg_attr(feature = "borsh", derive(borsh::BorshSerialize, borsh::BorshDeserialize))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Event { - GenesisLiquidityAdded { by: SeraiAddress, balance: Balance }, - GenesisLiquidityRemoved { by: SeraiAddress, balance: Balance }, - GenesisLiquidityAddedToPool { coin1: Balance, coin2: Balance }, - EconomicSecurityReached { network: NetworkId }, + GenesisLiquidityAdded { by: SeraiAddress, balance: ExternalBalance }, + GenesisLiquidityRemoved { by: SeraiAddress, balance: ExternalBalance }, + GenesisLiquidityAddedToPool { coin: ExternalBalance, sri: Amount }, } diff --git a/substrate/abi/src/in_instructions.rs b/substrate/abi/src/in_instructions.rs index d3ab5ca3d..765a50531 100644 --- a/substrate/abi/src/in_instructions.rs +++ b/substrate/abi/src/in_instructions.rs @@ -16,7 +16,7 @@ pub enum Call { #[cfg_attr(feature = "serde", derive(serde::Serialize))] #[cfg_attr(all(feature = "std", feature = "serde"), derive(serde::Deserialize))] pub enum Event { - Batch { network: NetworkId, id: u32, block: BlockHash, instructions_hash: [u8; 32] }, - InstructionFailure { network: NetworkId, id: u32, index: u32 }, - Halt { network: NetworkId }, + Batch { network: ExternalNetworkId, id: u32, block: BlockHash, instructions_hash: [u8; 32] }, + InstructionFailure { network: ExternalNetworkId, id: u32, index: u32 }, + Halt { network: ExternalNetworkId }, } diff --git a/substrate/abi/src/validator_sets.rs b/substrate/abi/src/validator_sets.rs index 1e1e33591..8e7d2e1e8 100644 --- a/substrate/abi/src/validator_sets.rs +++ b/substrate/abi/src/validator_sets.rs @@ -10,13 +10,13 @@ use serai_validator_sets_primitives::*; #[cfg_attr(all(feature = "std", feature = "serde"), derive(serde::Deserialize))] pub enum Call { set_keys { - network: NetworkId, + network: ExternalNetworkId, removed_participants: BoundedVec>, key_pair: KeyPair, signature: Signature, }, report_slashes { - network: NetworkId, + network: ExternalNetworkId, slashes: BoundedVec<(SeraiAddress, u32), ConstU32<{ MAX_KEY_SHARES_PER_SET / 3 }>>, signature: Signature, }, @@ -47,7 +47,7 @@ pub enum Event { removed: SeraiAddress, }, KeyGen { - set: ValidatorSet, + set: ExternalValidatorSet, key_pair: KeyPair, }, AcceptedHandover { diff --git a/substrate/client/src/serai/dex.rs b/substrate/client/src/serai/dex.rs index ea76e6258..1c44107fe 100644 --- a/substrate/client/src/serai/dex.rs +++ b/substrate/client/src/serai/dex.rs @@ -1,5 +1,5 @@ use sp_core::bounded_vec::BoundedVec; -use serai_abi::primitives::{SeraiAddress, Amount, Coin}; +use serai_abi::primitives::{Amount, Coin, ExternalCoin, SeraiAddress}; use crate::{SeraiError, TemporalSerai}; @@ -20,7 +20,7 @@ impl<'a> SeraiDex<'a> { } pub fn add_liquidity( - coin: Coin, + coin: ExternalCoin, coin_amount: Amount, sri_amount: Amount, min_coin_amount: Amount, @@ -61,11 +61,14 @@ impl<'a> SeraiDex<'a> { } /// Returns the reserves of `coin:SRI` pool. - pub async fn get_reserves(&self, coin: Coin) -> Result, SeraiError> { - self.0.runtime_api("DexApi_get_reserves", (coin, Coin::Serai)).await + pub async fn get_reserves( + &self, + coin: ExternalCoin, + ) -> Result, SeraiError> { + self.0.runtime_api("DexApi_get_reserves", (Coin::from(coin), Coin::Serai)).await } - pub async fn oracle_value(&self, coin: Coin) -> Result, SeraiError> { + pub async fn oracle_value(&self, coin: ExternalCoin) -> Result, SeraiError> { self.0.storage(PALLET, "SecurityOracleValue", coin).await } } diff --git a/substrate/client/src/serai/genesis_liquidity.rs b/substrate/client/src/serai/genesis_liquidity.rs index 187844bef..e8a152fa8 100644 --- a/substrate/client/src/serai/genesis_liquidity.rs +++ b/substrate/client/src/serai/genesis_liquidity.rs @@ -35,7 +35,7 @@ impl<'a> SeraiGenesisLiquidity<'a> { )) } - pub fn remove_coin_liquidity(balance: Balance) -> serai_abi::Call { + pub fn remove_coin_liquidity(balance: ExternalBalance) -> serai_abi::Call { serai_abi::Call::GenesisLiquidity(serai_abi::genesis_liquidity::Call::remove_coin_liquidity { balance, }) @@ -44,7 +44,7 @@ impl<'a> SeraiGenesisLiquidity<'a> { pub async fn liquidity( &self, address: &SeraiAddress, - coin: Coin, + coin: ExternalCoin, ) -> Result { Ok( self @@ -59,7 +59,7 @@ impl<'a> SeraiGenesisLiquidity<'a> { ) } - pub async fn supply(&self, coin: Coin) -> Result { + pub async fn supply(&self, coin: ExternalCoin) -> Result { Ok(self.0.storage(PALLET, "Supply", coin).await?.unwrap_or(LiquidityAmount::zero())) } diff --git a/substrate/client/src/serai/in_instructions.rs b/substrate/client/src/serai/in_instructions.rs index a8b47bfcf..d27ce695a 100644 --- a/substrate/client/src/serai/in_instructions.rs +++ b/substrate/client/src/serai/in_instructions.rs @@ -2,7 +2,7 @@ pub use serai_abi::in_instructions::primitives; use primitives::SignedBatch; use crate::{ - primitives::{BlockHash, NetworkId}, + primitives::{BlockHash, ExternalNetworkId}, Transaction, SeraiError, Serai, TemporalSerai, }; @@ -15,14 +15,14 @@ pub struct SeraiInInstructions<'a>(pub(crate) &'a TemporalSerai<'a>); impl<'a> SeraiInInstructions<'a> { pub async fn latest_block_for_network( &self, - network: NetworkId, + network: ExternalNetworkId, ) -> Result, SeraiError> { self.0.storage(PALLET, "LatestNetworkBlock", network).await } pub async fn last_batch_for_network( &self, - network: NetworkId, + network: ExternalNetworkId, ) -> Result, SeraiError> { self.0.storage(PALLET, "LastBatch", network).await } diff --git a/substrate/client/src/serai/liquidity_tokens.rs b/substrate/client/src/serai/liquidity_tokens.rs index 3e9052b2c..c7ec93cf0 100644 --- a/substrate/client/src/serai/liquidity_tokens.rs +++ b/substrate/client/src/serai/liquidity_tokens.rs @@ -1,6 +1,6 @@ use scale::Encode; -use serai_abi::primitives::{SeraiAddress, Amount, Coin, Balance}; +use serai_abi::primitives::{Amount, ExternalBalance, ExternalCoin, SeraiAddress}; use crate::{TemporalSerai, SeraiError}; @@ -9,13 +9,13 @@ const PALLET: &str = "LiquidityTokens"; #[derive(Clone, Copy)] pub struct SeraiLiquidityTokens<'a>(pub(crate) &'a TemporalSerai<'a>); impl<'a> SeraiLiquidityTokens<'a> { - pub async fn token_supply(&self, coin: Coin) -> Result { + pub async fn token_supply(&self, coin: ExternalCoin) -> Result { Ok(self.0.storage(PALLET, "Supply", coin).await?.unwrap_or(Amount(0))) } pub async fn token_balance( &self, - coin: Coin, + coin: ExternalCoin, address: SeraiAddress, ) -> Result { Ok( @@ -31,11 +31,16 @@ impl<'a> SeraiLiquidityTokens<'a> { ) } - pub fn transfer(to: SeraiAddress, balance: Balance) -> serai_abi::Call { - serai_abi::Call::LiquidityTokens(serai_abi::liquidity_tokens::Call::transfer { to, balance }) + pub fn transfer(to: SeraiAddress, balance: ExternalBalance) -> serai_abi::Call { + serai_abi::Call::LiquidityTokens(serai_abi::liquidity_tokens::Call::transfer { + to, + balance: balance.into(), + }) } - pub fn burn(balance: Balance) -> serai_abi::Call { - serai_abi::Call::LiquidityTokens(serai_abi::liquidity_tokens::Call::burn { balance }) + pub fn burn(balance: ExternalBalance) -> serai_abi::Call { + serai_abi::Call::LiquidityTokens(serai_abi::liquidity_tokens::Call::burn { + balance: balance.into(), + }) } } diff --git a/substrate/client/src/serai/validator_sets.rs b/substrate/client/src/serai/validator_sets.rs index ec67bae0f..5bfb3ed53 100644 --- a/substrate/client/src/serai/validator_sets.rs +++ b/substrate/client/src/serai/validator_sets.rs @@ -2,12 +2,12 @@ use scale::Encode; use sp_core::sr25519::{Public, Signature}; -use serai_abi::primitives::Amount; +use serai_abi::{primitives::Amount, validator_sets::primitives::ExternalValidatorSet}; pub use serai_abi::validator_sets::primitives; -use primitives::{Session, ValidatorSet, KeyPair}; +use primitives::{Session, KeyPair}; use crate::{ - primitives::{NetworkId, SeraiAddress}, + primitives::{NetworkId, ExternalNetworkId, SeraiAddress}, Transaction, Serai, TemporalSerai, SeraiError, }; @@ -167,13 +167,13 @@ impl<'a> SeraiValidatorSets<'a> { } // TODO: Store these separately since we almost never need both at once? - pub async fn keys(&self, set: ValidatorSet) -> Result, SeraiError> { + pub async fn keys(&self, set: ExternalValidatorSet) -> Result, SeraiError> { self.0.storage(PALLET, "Keys", (sp_core::hashing::twox_64(&set.encode()), set)).await } pub async fn key_pending_slash_report( &self, - network: NetworkId, + network: ExternalNetworkId, ) -> Result, SeraiError> { self.0.storage(PALLET, "PendingSlashReport", network).await } @@ -187,7 +187,7 @@ impl<'a> SeraiValidatorSets<'a> { } pub fn set_keys( - network: NetworkId, + network: ExternalNetworkId, removed_participants: sp_runtime::BoundedVec< SeraiAddress, sp_core::ConstU32<{ primitives::MAX_KEY_SHARES_PER_SET / 3 }>, @@ -212,7 +212,7 @@ impl<'a> SeraiValidatorSets<'a> { } pub fn report_slashes( - network: NetworkId, + network: ExternalNetworkId, slashes: sp_runtime::BoundedVec< (SeraiAddress, u32), sp_core::ConstU32<{ primitives::MAX_KEY_SHARES_PER_SET / 3 }>, diff --git a/substrate/client/tests/batch.rs b/substrate/client/tests/batch.rs index 17e4d3744..1a5b38667 100644 --- a/substrate/client/tests/batch.rs +++ b/substrate/client/tests/batch.rs @@ -8,7 +8,7 @@ use blake2::{ use scale::Encode; use serai_client::{ - primitives::{Amount, NetworkId, Coin, Balance, BlockHash, SeraiAddress}, + primitives::{Amount, BlockHash, ExternalBalance, ExternalCoin, SeraiAddress}, in_instructions::{ primitives::{InInstruction, InInstructionWithBalance, Batch}, InInstructionsEvent, @@ -22,18 +22,17 @@ use common::in_instructions::provide_batch; serai_test!( publish_batch: (|serai: Serai| async move { - let network = NetworkId::Bitcoin; let id = 0; - let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); let mut address = SeraiAddress::new([0; 32]); OsRng.fill_bytes(&mut address.0); - let coin = Coin::Bitcoin; + let coin = ExternalCoin::Bitcoin; + let network = coin.network(); let amount = Amount(OsRng.next_u64().saturating_add(1)); - let balance = Balance { coin, amount }; + let balance = ExternalBalance { coin, amount }; let batch = Batch { network, @@ -67,9 +66,9 @@ serai_test!( let serai = serai.coins(); assert_eq!( serai.mint_events().await.unwrap(), - vec![CoinsEvent::Mint { to: address, balance }] + vec![CoinsEvent::Mint { to: address, balance: balance.into() }] ); - assert_eq!(serai.coin_supply(coin).await.unwrap(), amount); - assert_eq!(serai.coin_balance(coin, address).await.unwrap(), amount); + assert_eq!(serai.coin_supply(coin.into()).await.unwrap(), amount); + assert_eq!(serai.coin_balance(coin.into(), address).await.unwrap(), amount); }) ); diff --git a/substrate/client/tests/burn.rs b/substrate/client/tests/burn.rs index a30dabec1..3dc0c1277 100644 --- a/substrate/client/tests/burn.rs +++ b/substrate/client/tests/burn.rs @@ -12,7 +12,7 @@ use sp_core::Pair; use serai_client::{ primitives::{ - Amount, NetworkId, Coin, Balance, BlockHash, SeraiAddress, Data, ExternalAddress, + Amount, ExternalCoin, ExternalBalance, BlockHash, SeraiAddress, Data, ExternalAddress, insecure_pair_from_name, }, in_instructions::{ @@ -28,9 +28,7 @@ use common::{tx::publish_tx, in_instructions::provide_batch}; serai_test!( burn: (|serai: Serai| async move { - let network = NetworkId::Bitcoin; let id = 0; - let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); @@ -38,9 +36,10 @@ serai_test!( let public = pair.public(); let address = SeraiAddress::from(public); - let coin = Coin::Bitcoin; + let coin = ExternalCoin::Bitcoin; + let network = coin.network(); let amount = Amount(OsRng.next_u64().saturating_add(1)); - let balance = Balance { coin, amount }; + let balance = ExternalBalance { coin, amount }; let batch = Batch { network, @@ -69,10 +68,10 @@ serai_test!( assert_eq!( serai.coins().mint_events().await.unwrap(), - vec![CoinsEvent::Mint { to: address, balance }] + vec![CoinsEvent::Mint { to: address, balance: balance.into() }] ); - assert_eq!(serai.coins().coin_supply(coin).await.unwrap(), amount); - assert_eq!(serai.coins().coin_balance(coin, address).await.unwrap(), amount); + assert_eq!(serai.coins().coin_supply(coin.into()).await.unwrap(), amount); + assert_eq!(serai.coins().coin_balance(coin.into(), address).await.unwrap(), amount); // Now burn it let mut rand_bytes = vec![0; 32]; @@ -99,7 +98,7 @@ serai_test!( let serai = serai.coins(); let events = serai.burn_with_instruction_events().await.unwrap(); assert_eq!(events, vec![CoinsEvent::BurnWithInstruction { from: address, instruction }]); - assert_eq!(serai.coin_supply(coin).await.unwrap(), Amount(0)); - assert_eq!(serai.coin_balance(coin, address).await.unwrap(), Amount(0)); + assert_eq!(serai.coin_supply(coin.into()).await.unwrap(), Amount(0)); + assert_eq!(serai.coin_balance(coin.into(), address).await.unwrap(), Amount(0)); }) ); diff --git a/substrate/client/tests/common/dex.rs b/substrate/client/tests/common/dex.rs index 86e536917..a5ea25189 100644 --- a/substrate/client/tests/common/dex.rs +++ b/substrate/client/tests/common/dex.rs @@ -1,4 +1,4 @@ -use serai_abi::primitives::{Coin, Amount}; +use serai_abi::primitives::{Amount, Coin, ExternalCoin}; use serai_client::{Serai, SeraiDex}; use sp_core::{sr25519::Pair, Pair as PairTrait}; @@ -8,7 +8,7 @@ use crate::common::tx::publish_tx; #[allow(dead_code)] pub async fn add_liquidity( serai: &Serai, - coin: Coin, + coin: ExternalCoin, coin_amount: Amount, sri_amount: Amount, nonce: u32, diff --git a/substrate/client/tests/common/in_instructions.rs b/substrate/client/tests/common/in_instructions.rs index 103940abf..a87e32925 100644 --- a/substrate/client/tests/common/in_instructions.rs +++ b/substrate/client/tests/common/in_instructions.rs @@ -9,8 +9,8 @@ use scale::Encode; use sp_core::Pair; use serai_client::{ - primitives::{insecure_pair_from_name, BlockHash, NetworkId, Balance, SeraiAddress}, - validator_sets::primitives::{ValidatorSet, KeyPair}, + primitives::{insecure_pair_from_name, BlockHash, ExternalBalance, SeraiAddress}, + validator_sets::primitives::{ExternalValidatorSet, KeyPair}, in_instructions::{ primitives::{Batch, SignedBatch, batch_message, InInstruction, InInstructionWithBalance}, InInstructionsEvent, @@ -23,8 +23,8 @@ use crate::common::{tx::publish_tx, validator_sets::set_keys}; #[allow(dead_code)] pub async fn provide_batch(serai: &Serai, batch: Batch) -> [u8; 32] { let serai_latest = serai.as_of_latest_finalized_block().await.unwrap(); - let session = serai_latest.validator_sets().session(batch.network).await.unwrap().unwrap(); - let set = ValidatorSet { session, network: batch.network }; + let session = serai_latest.validator_sets().session(batch.network.into()).await.unwrap().unwrap(); + let set = ExternalValidatorSet { session, network: batch.network }; let pair = insecure_pair_from_name(&format!("ValidatorSet {set:?}")); let keys = if let Some(keys) = serai_latest.validator_sets().keys(set).await.unwrap() { @@ -65,8 +65,7 @@ pub async fn provide_batch(serai: &Serai, batch: Batch) -> [u8; 32] { #[allow(dead_code)] pub async fn mint_coin( serai: &Serai, - balance: Balance, - network: NetworkId, + balance: ExternalBalance, batch_id: u32, address: SeraiAddress, ) -> [u8; 32] { @@ -74,7 +73,7 @@ pub async fn mint_coin( OsRng.fill_bytes(&mut block_hash.0); let batch = Batch { - network, + network: balance.coin.network(), id: batch_id, block: block_hash, instructions: vec![InInstructionWithBalance { diff --git a/substrate/client/tests/common/validator_sets.rs b/substrate/client/tests/common/validator_sets.rs index 3238501a3..20f7e9513 100644 --- a/substrate/client/tests/common/validator_sets.rs +++ b/substrate/client/tests/common/validator_sets.rs @@ -15,7 +15,7 @@ use schnorrkel::Schnorrkel; use serai_client::{ validator_sets::{ - primitives::{ValidatorSet, KeyPair, musig_context, set_keys_message}, + primitives::{ExternalValidatorSet, KeyPair, musig_context, set_keys_message}, ValidatorSetsEvent, }, Amount, Serai, SeraiValidatorSets, @@ -26,7 +26,7 @@ use crate::common::tx::publish_tx; #[allow(dead_code)] pub async fn set_keys( serai: &Serai, - set: ValidatorSet, + set: ExternalValidatorSet, key_pair: KeyPair, pairs: &[Pair], ) -> [u8; 32] { @@ -46,7 +46,8 @@ pub async fn set_keys( assert_eq!(Ristretto::generator() * secret_key, pub_keys[i]); threshold_keys.push( - musig::(&musig_context(set), &Zeroizing::new(secret_key), &pub_keys).unwrap(), + musig::(&musig_context(set.into()), &Zeroizing::new(secret_key), &pub_keys) + .unwrap(), ); } diff --git a/substrate/client/tests/dex.rs b/substrate/client/tests/dex.rs index d02d52602..f41eef6be 100644 --- a/substrate/client/tests/dex.rs +++ b/substrate/client/tests/dex.rs @@ -6,8 +6,8 @@ use serai_abi::in_instructions::primitives::DexCall; use serai_client::{ primitives::{ - Amount, NetworkId, Coin, Balance, BlockHash, insecure_pair_from_name, ExternalAddress, - SeraiAddress, + Amount, Coin, Balance, BlockHash, insecure_pair_from_name, ExternalAddress, SeraiAddress, + ExternalCoin, ExternalBalance, }, in_instructions::primitives::{ InInstruction, InInstructionWithBalance, Batch, IN_INSTRUCTION_EXECUTOR, OutAddress, @@ -28,15 +28,14 @@ use common::{ // TODO: Check Transfer events serai_test!( add_liquidity: (|serai: Serai| async move { - let coin = Coin::Monero; + let coin = ExternalCoin::Monero; let pair = insecure_pair_from_name("Ferdie"); // mint sriXMR in the account so that we can add liq. // Ferdie account is already pre-funded with SRI. mint_coin( &serai, - Balance { coin, amount: Amount(100_000_000_000_000) }, - NetworkId::Monero, + ExternalBalance { coin, amount: Amount(100_000_000_000_000) }, 0, pair.clone().public().into(), ) @@ -61,7 +60,7 @@ serai_test!( vec![DexEvent::LiquidityAdded { who: pair.public().into(), mint_to: pair.public().into(), - pool_id: Coin::Monero, + pool_id: coin, coin_amount: coin_amount.0, sri_amount: sri_amount.0, lp_token_minted: 49_999999990000 @@ -71,15 +70,14 @@ serai_test!( // Tests coin -> SRI and SRI -> coin swaps. swap_coin_to_sri: (|serai: Serai| async move { - let coin = Coin::Ether; + let coin = ExternalCoin::Ether; let pair = insecure_pair_from_name("Ferdie"); // mint sriXMR in the account so that we can add liq. // Ferdie account is already pre-funded with SRI. mint_coin( &serai, - Balance { coin, amount: Amount(100_000_000_000_000) }, - NetworkId::Ethereum, + ExternalBalance { coin, amount: Amount(100_000_000_000_000) }, 0, pair.clone().public().into(), ) @@ -96,14 +94,21 @@ serai_test!( // now that we have our liquid pool, swap some coin to SRI. let mut amount_in = Amount(25_000_000_000_000); - let mut block = common_swap(&serai, coin, Coin::Serai, amount_in, Amount(1), 1, pair.clone()) + let mut block = common_swap( + &serai, + coin.into(), + Coin::Serai, + amount_in, + Amount(1), + 1, + pair.clone()) .await; // get only the swap events let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - let mut path = BoundedVec::try_from(vec![coin, Coin::Serai]).unwrap(); + let mut path = BoundedVec::try_from(vec![coin.into(), Coin::Serai]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { @@ -117,13 +122,21 @@ serai_test!( // now swap some SRI to coin amount_in = Amount(10_000_000_000_000); - block = common_swap(&serai, Coin::Serai, coin, amount_in, Amount(1), 2, pair.clone()).await; + block = common_swap( + &serai, + Coin::Serai, + coin.into(), + amount_in, + Amount(1), + 2, + pair.clone() + ).await; // get only the swap events let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - path = BoundedVec::try_from(vec![Coin::Serai, coin]).unwrap(); + path = BoundedVec::try_from(vec![Coin::Serai, coin.into()]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { @@ -137,23 +150,21 @@ serai_test!( }) swap_coin_to_coin: (|serai: Serai| async move { - let coin1 = Coin::Monero; - let coin2 = Coin::Dai; + let coin1 = ExternalCoin::Monero; + let coin2 = ExternalCoin::Dai; let pair = insecure_pair_from_name("Ferdie"); // mint coins mint_coin( &serai, - Balance { coin: coin1, amount: Amount(100_000_000_000_000) }, - NetworkId::Monero, + ExternalBalance { coin: coin1, amount: Amount(100_000_000_000_000) }, 0, pair.clone().public().into(), ) .await; mint_coin( &serai, - Balance { coin: coin2, amount: Amount(100_000_000_000_000) }, - NetworkId::Ethereum, + ExternalBalance { coin: coin2, amount: Amount(100_000_000_000_000) }, 0, pair.clone().public().into(), ) @@ -177,13 +188,21 @@ serai_test!( // swap coin1 -> coin2 let amount_in = Amount(25_000_000_000_000); - let block = common_swap(&serai, coin1, coin2, amount_in, Amount(1), 2, pair.clone()).await; + let block = common_swap( + &serai, + coin1.into(), + coin2.into(), + amount_in, + Amount(1), + 2, + pair.clone() + ).await; // get only the swap events let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - let path = BoundedVec::try_from(vec![coin1, Coin::Serai, coin2]).unwrap(); + let path = BoundedVec::try_from(vec![coin1.into(), Coin::Serai, coin2.into()]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { @@ -197,7 +216,7 @@ serai_test!( }) add_liquidity_in_instructions: (|serai: Serai| async move { - let coin = Coin::Bitcoin; + let coin = ExternalCoin::Bitcoin; let pair = insecure_pair_from_name("Ferdie"); let mut batch_id = 0; @@ -205,8 +224,7 @@ serai_test!( // Ferdie account is already pre-funded with SRI. mint_coin( &serai, - Balance { coin, amount: Amount(100_000_000_000_000) }, - NetworkId::Bitcoin, + ExternalBalance { coin, amount: Amount(100_000_000_000_000) }, batch_id, pair.clone().public().into(), ) @@ -227,12 +245,12 @@ serai_test!( let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); let batch = Batch { - network: NetworkId::Bitcoin, + network: coin.network(), id: batch_id, block: block_hash, instructions: vec![InInstructionWithBalance { instruction: InInstruction::Dex(DexCall::SwapAndAddLiquidity(pair.public().into())), - balance: Balance { coin: Coin::Bitcoin, amount: Amount(20_000_000_000_000) }, + balance: ExternalBalance { coin, amount: Amount(20_000_000_000_000) }, }], }; @@ -244,7 +262,7 @@ serai_test!( vec![DexEvent::LiquidityAdded { who: IN_INSTRUCTION_EXECUTOR, mint_to: pair.public().into(), - pool_id: Coin::Bitcoin, + pool_id: coin, coin_amount: 10_000_000_000_000, // half of sent amount sri_amount: 111_333_778_668, lp_token_minted: 1_054_092_553_383 @@ -253,8 +271,8 @@ serai_test!( }) swap_in_instructions: (|serai: Serai| async move { - let coin1 = Coin::Monero; - let coin2 = Coin::Ether; + let coin1 = ExternalCoin::Monero; + let coin2 = ExternalCoin::Ether; let pair = insecure_pair_from_name("Ferdie"); let mut coin1_batch_id = 0; let mut coin2_batch_id = 0; @@ -262,8 +280,7 @@ serai_test!( // mint coins mint_coin( &serai, - Balance { coin: coin1, amount: Amount(10_000_000_000_000_000) }, - NetworkId::Monero, + ExternalBalance { coin: coin1, amount: Amount(10_000_000_000_000_000) }, coin1_batch_id, pair.clone().public().into(), ) @@ -271,8 +288,7 @@ serai_test!( coin1_batch_id += 1; mint_coin( &serai, - Balance { coin: coin2, amount: Amount(100_000_000_000_000) }, - NetworkId::Ethereum, + ExternalBalance { coin: coin2, amount: Amount(100_000_000_000_000) }, coin2_batch_id, pair.clone().public().into(), ) @@ -305,18 +321,18 @@ serai_test!( let out_address = OutAddress::External(ExternalAddress::new(rand_bytes.clone()).unwrap()); // amount is the min out amount - let out_balance = Balance { coin: coin2, amount: Amount(1) }; + let out_balance = Balance { coin: coin2.into(), amount: Amount(1) }; // now that we have our pools, we can try to swap let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); let batch = Batch { - network: NetworkId::Monero, + network: coin1.network(), id: coin1_batch_id, block: block_hash, instructions: vec![InInstructionWithBalance { instruction: InInstruction::Dex(DexCall::Swap(out_balance, out_address)), - balance: Balance { coin: coin1, amount: Amount(200_000_000_000_000) }, + balance: ExternalBalance { coin: coin1, amount: Amount(200_000_000_000_000) }, }], }; @@ -325,7 +341,7 @@ serai_test!( let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - let path = BoundedVec::try_from(vec![coin1, Coin::Serai, coin2]).unwrap(); + let path = BoundedVec::try_from(vec![coin1.into(), Coin::Serai, coin2.into()]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { @@ -345,18 +361,18 @@ serai_test!( OutAddress::Serai(SeraiAddress::new(rand_bytes.clone().try_into().unwrap())); // amount is the min out amount - let out_balance = Balance { coin: coin1, amount: Amount(1) }; + let out_balance = Balance { coin: coin1.into(), amount: Amount(1) }; // now that we have our pools, we can try to swap let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); let batch = Batch { - network: NetworkId::Ethereum, + network: coin2.network(), id: coin2_batch_id, block: block_hash, instructions: vec![InInstructionWithBalance { instruction: InInstruction::Dex(DexCall::Swap(out_balance, out_address.clone())), - balance: Balance { coin: coin2, amount: Amount(200_000_000_000) }, + balance: ExternalBalance { coin: coin2, amount: Amount(200_000_000_000) }, }], }; @@ -364,7 +380,7 @@ serai_test!( let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - let path = BoundedVec::try_from(vec![coin2, Coin::Serai, coin1]).unwrap(); + let path = BoundedVec::try_from(vec![coin2.into(), Coin::Serai, coin1.into()]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { @@ -389,12 +405,12 @@ serai_test!( let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); let batch = Batch { - network: NetworkId::Monero, + network: coin1.network(), id: coin1_batch_id, block: block_hash, instructions: vec![InInstructionWithBalance { instruction: InInstruction::Dex(DexCall::Swap(out_balance, out_address.clone())), - balance: Balance { coin: coin1, amount: Amount(100_000_000_000_000) }, + balance: ExternalBalance { coin: coin1, amount: Amount(100_000_000_000_000) }, }], }; @@ -402,7 +418,7 @@ serai_test!( let mut events = serai.as_of(block).dex().events().await.unwrap(); events.retain(|e| matches!(e, DexEvent::SwapExecuted { .. })); - let path = BoundedVec::try_from(vec![coin1, Coin::Serai]).unwrap(); + let path = BoundedVec::try_from(vec![coin1.into(), Coin::Serai]).unwrap(); assert_eq!( events, vec![DexEvent::SwapExecuted { diff --git a/substrate/client/tests/dht.rs b/substrate/client/tests/dht.rs index 82450e461..0d27c91e5 100644 --- a/substrate/client/tests/dht.rs +++ b/substrate/client/tests/dht.rs @@ -1,4 +1,4 @@ -use serai_client::{primitives::NetworkId, Serai}; +use serai_client::{primitives::ExternalNetworkId, Serai}; #[tokio::test] async fn dht() { @@ -44,7 +44,7 @@ async fn dht() { assert!(!Serai::new(serai_rpc.clone()) .await .unwrap() - .p2p_validators(NetworkId::Bitcoin) + .p2p_validators(ExternalNetworkId::Bitcoin.into()) .await .unwrap() .is_empty()); diff --git a/substrate/client/tests/validator_sets.rs b/substrate/client/tests/validator_sets.rs index c2c6c509d..dee2bb42b 100644 --- a/substrate/client/tests/validator_sets.rs +++ b/substrate/client/tests/validator_sets.rs @@ -7,17 +7,18 @@ use sp_core::{ use serai_client::{ primitives::{ - NETWORKS, NetworkId, BlockHash, insecure_pair_from_name, FAST_EPOCH_DURATION, TARGET_BLOCK_TIME, + NETWORKS, NetworkId, BlockHash, insecure_pair_from_name, FAST_EPOCH_DURATION, + TARGET_BLOCK_TIME, ExternalNetworkId, Amount, }, validator_sets::{ - primitives::{Session, ValidatorSet, KeyPair}, + primitives::{Session, ValidatorSet, ExternalValidatorSet, KeyPair}, ValidatorSetsEvent, }, in_instructions::{ primitives::{Batch, SignedBatch, batch_message}, SeraiInInstructions, }, - Amount, Serai, + Serai, }; mod common; @@ -58,8 +59,8 @@ async fn get_ordered_keys(serai: &Serai, network: NetworkId, accounts: &[Pair]) serai_test!( set_keys_test: (|serai: Serai| async move { - let network = NetworkId::Bitcoin; - let set = ValidatorSet { session: Session(0), network }; + let network = ExternalNetworkId::Bitcoin; + let set = ExternalValidatorSet { session: Session(0), network }; let pair = insecure_pair_from_name("Alice"); let public = pair.public(); @@ -89,7 +90,7 @@ serai_test!( { let vs_serai = serai.as_of_latest_finalized_block().await.unwrap(); let vs_serai = vs_serai.validator_sets(); - let participants = vs_serai.participants(set.network).await + let participants = vs_serai.participants(set.network.into()).await .unwrap() .unwrap() .into_iter() @@ -197,9 +198,9 @@ async fn validator_set_rotation() { // amounts for single key share per network let key_shares = HashMap::from([ (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), - (NetworkId::Bitcoin, Amount(1_000_000 * 10_u64.pow(8))), - (NetworkId::Monero, Amount(100_000 * 10_u64.pow(8))), - (NetworkId::Ethereum, Amount(1_000_000 * 10_u64.pow(8))), + (NetworkId::External(ExternalNetworkId::Bitcoin), Amount(1_000_000 * 10_u64.pow(8))), + (NetworkId::External(ExternalNetworkId::Monero), Amount(100_000 * 10_u64.pow(8))), + (NetworkId::External(ExternalNetworkId::Ethereum), Amount(1_000_000 * 10_u64.pow(8))), ]); // genesis participants per network @@ -208,9 +209,9 @@ async fn validator_set_rotation() { accounts[.. 4].to_vec().iter().map(|pair| pair.public()).collect::>(); let mut participants = HashMap::from([ (NetworkId::Serai, default_participants.clone()), - (NetworkId::Bitcoin, default_participants.clone()), - (NetworkId::Monero, default_participants.clone()), - (NetworkId::Ethereum, default_participants), + (NetworkId::External(ExternalNetworkId::Bitcoin), default_participants.clone()), + (NetworkId::External(ExternalNetworkId::Monero), default_participants.clone()), + (NetworkId::External(ExternalNetworkId::Ethereum), default_participants), ]); // test the set rotation @@ -237,7 +238,8 @@ async fn validator_set_rotation() { // set the keys if it is an external set if network != NetworkId::Serai { - let set = ValidatorSet { session: Session(0), network }; + let set = + ExternalValidatorSet { session: Session(0), network: network.try_into().unwrap() }; let key_pair = get_random_key_pair(); let pairs = get_ordered_keys(&serai, network, &accounts).await; set_keys(&serai, set, key_pair, &pairs).await; @@ -265,7 +267,8 @@ async fn validator_set_rotation() { if network != NetworkId::Serai { // set the keys if it is an external set - let set = ValidatorSet { session: Session(1), network }; + let set = + ExternalValidatorSet { session: Session(1), network: network.try_into().unwrap() }; // we need the whole substrate key pair to sign the batch let (substrate_pair, key_pair) = { @@ -283,7 +286,12 @@ async fn validator_set_rotation() { // provide a batch to complete the handover and retire the previous set let mut block_hash = BlockHash([0; 32]); OsRng.fill_bytes(&mut block_hash.0); - let batch = Batch { network, id: 0, block: block_hash, instructions: vec![] }; + let batch = Batch { + network: network.try_into().unwrap(), + id: 0, + block: block_hash, + instructions: vec![], + }; publish_tx( &serai, &SeraiInInstructions::execute_batch(SignedBatch { diff --git a/substrate/coins/pallet/src/lib.rs b/substrate/coins/pallet/src/lib.rs index a633ed070..dd64b2b6b 100644 --- a/substrate/coins/pallet/src/lib.rs +++ b/substrate/coins/pallet/src/lib.rs @@ -1,13 +1,13 @@ #![cfg_attr(not(feature = "std"), no_std)] -use serai_primitives::{Coin, SubstrateAmount, Balance}; +use serai_primitives::{Balance, Coin, ExternalBalance, SubstrateAmount}; pub trait AllowMint { - fn is_allowed(balance: &Balance) -> bool; + fn is_allowed(balance: &ExternalBalance) -> bool; } impl AllowMint for () { - fn is_allowed(_: &Balance) -> bool { + fn is_allowed(_: &ExternalBalance) -> bool { true } } @@ -161,7 +161,10 @@ pub mod pallet { pub fn mint(to: Public, balance: Balance) -> Result<(), Error> { // If the coin isn't Serai, which we're always allowed to mint, and the mint isn't explicitly // allowed, error - if (balance.coin != Coin::Serai) && (!T::AllowMint::is_allowed(&balance)) { + if !ExternalCoin::try_from(balance.coin) + .map(|coin| T::AllowMint::is_allowed(&ExternalBalance { coin, amount: balance.amount })) + .unwrap_or(true) + { Err(Error::::MintNotAllowed)?; } @@ -230,22 +233,18 @@ pub mod pallet { } /// Burn `balance` with `OutInstructionWithBalance` from the caller. - /// Errors if called for SRI or Instance1 instance of this pallet. #[pallet::call_index(2)] #[pallet::weight((0, DispatchClass::Normal))] // TODO pub fn burn_with_instruction( origin: OriginFor, instruction: OutInstructionWithBalance, ) -> DispatchResult { - if instruction.balance.coin == Coin::Serai { - Err(Error::::BurnWithInstructionNotAllowed)?; - } if TypeId::of::() == TypeId::of::() { Err(Error::::BurnWithInstructionNotAllowed)?; } let from = ensure_signed(origin)?; - Self::burn_internal(from, instruction.balance)?; + Self::burn_internal(from, instruction.balance.into())?; Self::deposit_event(Event::BurnWithInstruction { from, instruction }); Ok(()) } diff --git a/substrate/coins/primitives/src/lib.rs b/substrate/coins/primitives/src/lib.rs index a7b45cf0c..5aca029a2 100644 --- a/substrate/coins/primitives/src/lib.rs +++ b/substrate/coins/primitives/src/lib.rs @@ -13,7 +13,7 @@ use serde::{Serialize, Deserialize}; use scale::{Encode, Decode, MaxEncodedLen}; use scale_info::TypeInfo; -use serai_primitives::{Balance, SeraiAddress, ExternalAddress, Data, system_address}; +use serai_primitives::{system_address, Data, ExternalAddress, ExternalBalance, SeraiAddress}; pub const FEE_ACCOUNT: SeraiAddress = system_address(b"Coins-fees"); @@ -32,7 +32,7 @@ pub struct OutInstruction { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct OutInstructionWithBalance { pub instruction: OutInstruction, - pub balance: Balance, + pub balance: ExternalBalance, } #[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)] diff --git a/substrate/dex/pallet/src/benchmarking.rs b/substrate/dex/pallet/src/benchmarking.rs index fb23b12a4..071411d73 100644 --- a/substrate/dex/pallet/src/benchmarking.rs +++ b/substrate/dex/pallet/src/benchmarking.rs @@ -38,7 +38,7 @@ type AccountIdLookupOf = <::Lookup as StaticLookup type LiquidityTokens = coins_pallet::Pallet; -fn create_coin(coin: &Coin) -> (T::AccountId, AccountIdLookupOf) { +fn create_coin(coin: &ExternalCoin) -> (T::AccountId, AccountIdLookupOf) { let caller: T::AccountId = whitelisted_caller(); let caller_lookup = T::Lookup::unlookup(caller); assert_ok!(Coins::::mint( @@ -47,12 +47,14 @@ fn create_coin(coin: &Coin) -> (T::AccountId, AccountIdLookupOf) { )); assert_ok!(Coins::::mint( caller, - Balance { coin: *coin, amount: Amount(INITIAL_COIN_BALANCE) } + Balance { coin: (*coin).into(), amount: Amount(INITIAL_COIN_BALANCE) } )); (caller, caller_lookup) } -fn create_coin_and_pool(coin: &Coin) -> (Coin, T::AccountId, AccountIdLookupOf) { +fn create_coin_and_pool( + coin: &ExternalCoin, +) -> (ExternalCoin, T::AccountId, AccountIdLookupOf) { let (caller, caller_lookup) = create_coin::(coin); assert_ok!(Dex::::create_pool(*coin)); @@ -62,7 +64,7 @@ fn create_coin_and_pool(coin: &Coin) -> (Coin, T::AccountId, AccountI benchmarks! { add_liquidity { let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; + let coin2 = ExternalCoin::Bitcoin; let (lp_token, caller, _) = create_coin_and_pool::(&coin2); let add_amount: u64 = 1000; }: _( @@ -75,13 +77,13 @@ benchmarks! { caller ) verify { - let pool_id = Dex::::get_pool_id(coin1, coin2).unwrap(); + let pool_id = Dex::::get_pool_id(coin1, coin2.into()).unwrap(); let lp_minted = Dex::::calc_lp_amount_for_zero_supply( add_amount, 1000u64, ).unwrap(); assert_eq!( - LiquidityTokens::::balance(caller, lp_token).0, + LiquidityTokens::::balance(caller, lp_token.into()).0, lp_minted ); assert_eq!( @@ -91,7 +93,7 @@ benchmarks! { assert_eq!( Coins::::balance( Dex::::get_pool_account(pool_id), - Coin::Bitcoin, + ExternalCoin::Bitcoin.into(), ).0, 1000 ); @@ -99,7 +101,7 @@ benchmarks! { remove_liquidity { let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = ExternalCoin::Monero; let (lp_token, caller, _) = create_coin_and_pool::(&coin2); let add_amount: u64 = 100; let lp_minted = Dex::::calc_lp_amount_for_zero_supply( @@ -117,7 +119,7 @@ benchmarks! { 0u64, caller, )?; - let total_supply = LiquidityTokens::::supply(lp_token); + let total_supply = LiquidityTokens::::supply(Coin::from(lp_token)); }: _( SystemOrigin::Signed(caller), coin2, @@ -127,7 +129,7 @@ benchmarks! { caller ) verify { - let new_total_supply = LiquidityTokens::::supply(lp_token); + let new_total_supply = LiquidityTokens::::supply(Coin::from(lp_token)); assert_eq!( new_total_supply, total_supply - remove_lp_amount @@ -136,8 +138,8 @@ benchmarks! { swap_exact_tokens_for_tokens { let native = Coin::native(); - let coin1 = Coin::Bitcoin; - let coin2 = Coin::Ether; + let coin1 = ExternalCoin::Bitcoin; + let coin2 = ExternalCoin::Ether; let (_, caller, _) = create_coin_and_pool::(&coin1); let (_, _) = create_coin::(&coin2); @@ -168,21 +170,21 @@ benchmarks! { caller, )?; - let path = vec![coin1, native, coin2]; + let path = vec![Coin::from(coin1), native, Coin::from(coin2)]; let path = BoundedVec::<_, T::MaxSwapPathLength>::try_from(path).unwrap(); let native_balance = Coins::::balance(caller, native).0; - let coin1_balance = Coins::::balance(caller, Coin::Bitcoin).0; + let coin1_balance = Coins::::balance(caller, ExternalCoin::Bitcoin.into()).0; }: _(SystemOrigin::Signed(caller), path, swap_amount, 1u64, caller) verify { let ed_bump = 2u64; - let new_coin1_balance = Coins::::balance(caller, Coin::Bitcoin).0; + let new_coin1_balance = Coins::::balance(caller, ExternalCoin::Bitcoin.into()).0; assert_eq!(new_coin1_balance, coin1_balance - 100u64); } swap_tokens_for_exact_tokens { let native = Coin::native(); - let coin1 = Coin::Bitcoin; - let coin2 = Coin::Ether; + let coin1 = ExternalCoin::Bitcoin; + let coin2 = ExternalCoin::Ether; let (_, caller, _) = create_coin_and_pool::(&coin1); let (_, _) = create_coin::(&coin2); @@ -208,10 +210,10 @@ benchmarks! { 0u64, caller, )?; - let path = vec![coin1, native, coin2]; + let path = vec![Coin::from(coin1), native, Coin::from(coin2)]; let path: BoundedVec<_, T::MaxSwapPathLength> = BoundedVec::try_from(path).unwrap(); - let coin2_balance = Coins::::balance(caller, Coin::Ether).0; + let coin2_balance = Coins::::balance(caller, ExternalCoin::Ether.into()).0; }: _( SystemOrigin::Signed(caller), path.clone(), @@ -220,7 +222,7 @@ benchmarks! { caller ) verify { - let new_coin2_balance = Coins::::balance(caller, Coin::Ether).0; + let new_coin2_balance = Coins::::balance(caller, ExternalCoin::Ether.into()).0; assert_eq!(new_coin2_balance, coin2_balance + 100u64); } diff --git a/substrate/dex/pallet/src/lib.rs b/substrate/dex/pallet/src/lib.rs index 60a38926b..8da63a7be 100644 --- a/substrate/dex/pallet/src/lib.rs +++ b/substrate/dex/pallet/src/lib.rs @@ -78,7 +78,7 @@ mod tests; #[cfg(test)] mod mock; -use frame_support::ensure; +use frame_support::{ensure, pallet_prelude::*, BoundedBTreeSet}; use frame_system::{ pallet_prelude::{BlockNumberFor, OriginFor}, ensure_signed, @@ -86,9 +86,12 @@ use frame_system::{ pub use pallet::*; -use sp_runtime::{traits::TrailingZeroInput, DispatchError}; +use sp_runtime::{ + traits::{TrailingZeroInput, IntegerSquareRoot}, + DispatchError, +}; -use serai_primitives::{NetworkId, Coin, SubstrateAmount}; +use serai_primitives::*; use sp_std::prelude::*; pub use types::*; @@ -103,20 +106,16 @@ pub use weights::WeightInfo; #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::{pallet_prelude::*, BoundedBTreeSet}; use sp_core::sr25519::Public; - use sp_runtime::traits::IntegerSquareRoot; use coins_pallet::{Pallet as CoinsPallet, Config as CoinsConfig}; - use serai_primitives::{Coin, Amount, Balance, SubstrateAmount, reverse_lexicographic_order}; - /// Pool ID. /// /// The pool's `AccountId` is derived from this type. Any changes to the type may necessitate a /// migration. - pub type PoolId = Coin; + pub type PoolId = ExternalCoin; /// LiquidityTokens Pallet as an instance of coins pallet. pub type LiquidityTokens = coins_pallet::Pallet; @@ -164,7 +163,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn spot_price_for_block)] pub type SpotPriceForBlock = - StorageDoubleMap<_, Identity, BlockNumberFor, Identity, Coin, Amount, OptionQuery>; + StorageDoubleMap<_, Identity, BlockNumberFor, Identity, ExternalCoin, Amount, OptionQuery>; /// Moving window of prices from each block. /// @@ -173,30 +172,32 @@ pub mod pallet { /// low to high. #[pallet::storage] pub type SpotPrices = - StorageDoubleMap<_, Identity, Coin, Identity, [u8; 8], u16, OptionQuery>; + StorageDoubleMap<_, Identity, ExternalCoin, Identity, [u8; 8], u16, OptionQuery>; // SpotPrices, yet with keys stored in reverse lexicographic order. #[pallet::storage] pub type ReverseSpotPrices = - StorageDoubleMap<_, Identity, Coin, Identity, [u8; 8], (), OptionQuery>; + StorageDoubleMap<_, Identity, ExternalCoin, Identity, [u8; 8], (), OptionQuery>; /// Current length of the `SpotPrices` map. #[pallet::storage] - pub type SpotPricesLength = StorageMap<_, Identity, Coin, u16, OptionQuery>; + pub type SpotPricesLength = StorageMap<_, Identity, ExternalCoin, u16, OptionQuery>; /// Current position of the median within the `SpotPrices` map; #[pallet::storage] - pub type CurrentMedianPosition = StorageMap<_, Identity, Coin, u16, OptionQuery>; + pub type CurrentMedianPosition = + StorageMap<_, Identity, ExternalCoin, u16, OptionQuery>; /// Current median price of the prices in the `SpotPrices` map at any given time. #[pallet::storage] #[pallet::getter(fn median_price)] - pub type MedianPrice = StorageMap<_, Identity, Coin, Amount, OptionQuery>; + pub type MedianPrice = StorageMap<_, Identity, ExternalCoin, Amount, OptionQuery>; /// The price used for evaluating economic security, which is the highest observed median price. #[pallet::storage] #[pallet::getter(fn security_oracle_value)] - pub type SecurityOracleValue = StorageMap<_, Identity, Coin, Amount, OptionQuery>; + pub type SecurityOracleValue = + StorageMap<_, Identity, ExternalCoin, Amount, OptionQuery>; /// Total swap volume of a given pool in terms of SRI. #[pallet::storage] @@ -205,7 +206,7 @@ pub mod pallet { impl Pallet { fn restore_median( - coin: Coin, + coin: ExternalCoin, mut current_median_pos: u16, mut current_median: Amount, length: u16, @@ -256,7 +257,7 @@ pub mod pallet { MedianPrice::::set(coin, Some(current_median)); } - pub(crate) fn insert_into_median(coin: Coin, amount: Amount) { + pub(crate) fn insert_into_median(coin: ExternalCoin, amount: Amount) { let new_quantity_of_presences = SpotPrices::::get(coin, amount.0.to_be_bytes()).unwrap_or(0) + 1; SpotPrices::::set(coin, amount.0.to_be_bytes(), Some(new_quantity_of_presences)); @@ -286,7 +287,7 @@ pub mod pallet { Self::restore_median(coin, current_median_pos, current_median, new_length); } - pub(crate) fn remove_from_median(coin: Coin, amount: Amount) { + pub(crate) fn remove_from_median(coin: ExternalCoin, amount: Amount) { let mut current_median = MedianPrice::::get(coin).unwrap(); let mut current_median_pos = CurrentMedianPosition::::get(coin).unwrap(); @@ -451,7 +452,7 @@ pub mod pallet { // insert the new price to our oracle window // The spot price for 1 coin, in atomic units, to SRI is used let sri_per_coin = - if let Ok((sri_balance, coin_balance)) = Self::get_reserves(&Coin::native(), &coin) { + if let Ok((sri_balance, coin_balance)) = Self::get_reserves(&Coin::Serai, &coin.into()) { // We use 1 coin to handle rounding errors which may occur with atomic units // If we used atomic units, any coin whose atomic unit is worth less than SRI's atomic // unit would cause a 'price' of 0 @@ -493,9 +494,9 @@ pub mod pallet { /// (the id of which is returned in the `Event::PoolCreated` event). /// /// Once a pool is created, someone may [`Pallet::add_liquidity`] to it. - pub(crate) fn create_pool(coin: Coin) -> DispatchResult { + pub(crate) fn create_pool(coin: ExternalCoin) -> DispatchResult { // get pool_id - let pool_id = Self::get_pool_id(coin, Coin::Serai)?; + let pool_id = Self::get_pool_id(coin.into(), Coin::native())?; ensure!(!Pools::::contains_key(pool_id), Error::::PoolExists); let pool_account = Self::get_pool_account(pool_id); @@ -508,9 +509,11 @@ pub mod pallet { /// A hook to be called whenever a network's session is rotated. pub fn on_new_session(network: NetworkId) { - // reset the oracle value - for coin in network.coins() { - SecurityOracleValue::::set(*coin, Self::median_price(coin)); + // Only track the price for non-SRI coins as this is SRI denominated + if let NetworkId::External(n) = network { + for coin in n.coins() { + SecurityOracleValue::::set(coin, Self::median_price(coin)); + } } } } @@ -532,7 +535,7 @@ pub mod pallet { #[allow(clippy::too_many_arguments)] pub fn add_liquidity( origin: OriginFor, - coin: Coin, + coin: ExternalCoin, coin_desired: SubstrateAmount, sri_desired: SubstrateAmount, coin_min: SubstrateAmount, @@ -542,7 +545,7 @@ pub mod pallet { let sender = ensure_signed(origin)?; ensure!((sri_desired > 0) && (coin_desired > 0), Error::::WrongDesiredAmount); - let pool_id = Self::get_pool_id(coin, Coin::Serai)?; + let pool_id = Self::get_pool_id(coin.into(), Coin::native())?; // create the pool if it doesn't exist. We can just attempt to do that because our checks // far enough to allow that. @@ -552,7 +555,7 @@ pub mod pallet { let pool_account = Self::get_pool_account(pool_id); let sri_reserve = Self::get_balance(&pool_account, Coin::Serai); - let coin_reserve = Self::get_balance(&pool_account, coin); + let coin_reserve = Self::get_balance(&pool_account, coin.into()); let sri_amount: SubstrateAmount; let coin_amount: SubstrateAmount; @@ -583,16 +586,20 @@ pub mod pallet { &pool_account, Balance { coin: Coin::Serai, amount: Amount(sri_amount) }, )?; - Self::transfer(&sender, &pool_account, Balance { coin, amount: Amount(coin_amount) })?; + Self::transfer( + &sender, + &pool_account, + Balance { coin: coin.into(), amount: Amount(coin_amount) }, + )?; - let total_supply = LiquidityTokens::::supply(coin); + let total_supply = LiquidityTokens::::supply(Coin::from(coin)); let lp_token_amount: SubstrateAmount; if total_supply == 0 { lp_token_amount = Self::calc_lp_amount_for_zero_supply(sri_amount, coin_amount)?; LiquidityTokens::::mint( pool_account, - Balance { coin, amount: Amount(T::MintMinLiquidity::get()) }, + Balance { coin: coin.into(), amount: Amount(T::MintMinLiquidity::get()) }, )?; } else { let side1 = Self::mul_div(sri_amount, total_supply, sri_reserve)?; @@ -605,7 +612,10 @@ pub mod pallet { Error::::InsufficientLiquidityMinted ); - LiquidityTokens::::mint(mint_to, Balance { coin, amount: Amount(lp_token_amount) })?; + LiquidityTokens::::mint( + mint_to, + Balance { coin: coin.into(), amount: Amount(lp_token_amount) }, + )?; Self::deposit_event(Event::LiquidityAdded { who: sender, @@ -626,25 +636,24 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::remove_liquidity())] pub fn remove_liquidity( origin: OriginFor, - coin: Coin, + coin: ExternalCoin, lp_token_burn: SubstrateAmount, coin_min_receive: SubstrateAmount, sri_min_receive: SubstrateAmount, withdraw_to: T::AccountId, ) -> DispatchResult { let sender = ensure_signed(origin.clone())?; - ensure!(coin != Coin::Serai, Error::::EqualCoins); - let pool_id = Self::get_pool_id(coin, Coin::Serai).unwrap(); + let pool_id = Self::get_pool_id(coin.into(), Coin::native()).unwrap(); ensure!(lp_token_burn > 0, Error::::ZeroLiquidity); Pools::::get(pool_id).as_ref().ok_or(Error::::PoolNotFound)?; let pool_account = Self::get_pool_account(pool_id); let sri_reserve = Self::get_balance(&pool_account, Coin::Serai); - let coin_reserve = Self::get_balance(&pool_account, coin); + let coin_reserve = Self::get_balance(&pool_account, coin.into()); - let total_supply = LiquidityTokens::::supply(coin); + let total_supply = LiquidityTokens::::supply(Coin::from(coin)); let lp_redeem_amount = lp_token_burn; let sri_amount = Self::mul_div(lp_redeem_amount, sri_reserve, total_supply)?; @@ -665,14 +674,21 @@ pub mod pallet { ensure!(coin_reserve_left >= 1, Error::::ReserveLeftLessThanMinimum); // burn the provided lp token amount that includes the fee - LiquidityTokens::::burn(origin, Balance { coin, amount: Amount(lp_token_burn) })?; + LiquidityTokens::::burn( + origin, + Balance { coin: coin.into(), amount: Amount(lp_token_burn) }, + )?; Self::transfer( &pool_account, &withdraw_to, Balance { coin: Coin::Serai, amount: Amount(sri_amount) }, )?; - Self::transfer(&pool_account, &withdraw_to, Balance { coin, amount: Amount(coin_amount) })?; + Self::transfer( + &pool_account, + &withdraw_to, + Balance { coin: coin.into(), amount: Amount(coin_amount) }, + )?; Self::deposit_event(Event::LiquidityRemoved { who: sender, @@ -920,11 +936,9 @@ pub mod pallet { pub fn get_pool_id(coin1: Coin, coin2: Coin) -> Result> { ensure!((coin1 == Coin::Serai) || (coin2 == Coin::Serai), Error::::PoolNotFound); ensure!(coin1 != coin2, Error::::EqualCoins); - if coin1 == Coin::Serai { - Ok(coin2) - } else { - Ok(coin1) - } + ExternalCoin::try_from(coin1) + .or_else(|()| ExternalCoin::try_from(coin2)) + .map_err(|()| Error::::PoolNotFound) } /// Returns the balance of each coin in the pool. diff --git a/substrate/dex/pallet/src/tests.rs b/substrate/dex/pallet/src/tests.rs index ee714471f..8770b5174 100644 --- a/substrate/dex/pallet/src/tests.rs +++ b/substrate/dex/pallet/src/tests.rs @@ -18,7 +18,10 @@ // It has been forked into a crate distributed under the AGPL 3.0. // Please check the current distribution for up-to-date copyright and licensing information. -use crate::{mock::*, *}; +use crate::{ + mock::{*, MEDIAN_PRICE_WINDOW_LENGTH}, + *, +}; use frame_support::{assert_noop, assert_ok}; pub use coins_pallet as coins; @@ -72,11 +75,13 @@ fn check_pool_accounts_dont_collide() { let mut map = HashSet::new(); for coin in coins() { - let account = Dex::get_pool_account(coin); - if map.contains(&account) { - panic!("Collision at {coin:?}"); + if let Coin::External(c) = coin { + let account = Dex::get_pool_account(c); + if map.contains(&account) { + panic!("Collision at {c:?}"); + } + map.insert(account); } - map.insert(account); } } @@ -98,11 +103,11 @@ fn can_create_pool() { let coin_account_deposit: u64 = 0; let user: PublicKey = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Monero); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(1000) })); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_eq!(balance(user, coin1), 1000 - coin_account_deposit); @@ -111,15 +116,13 @@ fn can_create_pool() { [Event::::PoolCreated { pool_id, pool_account: Dex::get_pool_account(pool_id) }] ); assert_eq!(pools(), vec![pool_id]); - - assert_noop!(Dex::create_pool(coin1), Error::::EqualCoins); }); } #[test] fn create_same_pool_twice_should_fail() { new_test_ext().execute_with(|| { - let coin = Coin::Dai; + let coin = ExternalCoin::Dai; assert_ok!(Dex::create_pool(coin)); assert_noop!(Dex::create_pool(coin), Error::::PoolExists); }); @@ -129,13 +132,13 @@ fn create_same_pool_twice_should_fail() { fn different_pools_should_have_different_lp_tokens() { new_test_ext().execute_with(|| { let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; - let coin3 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Bitcoin); + let coin3 = Coin::External(ExternalCoin::Ether); let pool_id_1_2 = Dex::get_pool_id(coin1, coin2).unwrap(); let pool_id_1_3 = Dex::get_pool_id(coin1, coin3).unwrap(); let lp_token2_1 = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); let lp_token3_1 = coin3; assert_eq!( @@ -146,7 +149,7 @@ fn different_pools_should_have_different_lp_tokens() { }] ); - assert_ok!(Dex::create_pool(coin3)); + assert_ok!(Dex::create_pool(coin3.try_into().unwrap())); assert_eq!( events(), [Event::::PoolCreated { @@ -164,13 +167,13 @@ fn can_add_liquidity() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Dai; - let coin3 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Dai); + let coin3 = Coin::External(ExternalCoin::Monero); let lp_token1 = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); let lp_token2 = coin3; - assert_ok!(Dex::create_pool(coin3)); + assert_ok!(Dex::create_pool(coin3.try_into().unwrap())); assert_ok!(CoinsPallet::::mint( user, @@ -179,7 +182,15 @@ fn can_add_liquidity() { assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin3, amount: Amount(1000) })); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 10, 10000, 10, 10000, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 10, + 10000, + 10, + 10000, + user, + )); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); assert!(events().contains(&Event::::LiquidityAdded { @@ -198,7 +209,15 @@ fn can_add_liquidity() { assert_eq!(pool_balance(user, lp_token1), 216); // try to pass the non-native - native coins, the result should be the same - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin3, 10, 10000, 10, 10000, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin3.try_into().unwrap(), + 10, + 10000, + 10, + 10000, + user, + )); let pool_id = Dex::get_pool_id(coin1, coin3).unwrap(); assert!(events().contains(&Event::::LiquidityAdded { @@ -223,12 +242,15 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; + let coin2 = ExternalCoin::Bitcoin; assert_ok!(Dex::create_pool(coin2)); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(1000) })); - assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); + assert_ok!(CoinsPallet::::mint( + user, + Balance { coin: coin2.into(), amount: Amount(1000) } + )); assert_noop!( Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 1, 1, 1, 1, user), @@ -242,11 +264,11 @@ fn add_tiny_liquidity_directly_to_pool_address() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Ether; - let coin3 = Coin::Dai; + let coin2 = Coin::External(ExternalCoin::Ether); + let coin3 = Coin::External(ExternalCoin::Dai); - assert_ok!(Dex::create_pool(coin2)); - assert_ok!(Dex::create_pool(coin3)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); + assert_ok!(Dex::create_pool(coin3.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(10000 * 2) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(10000) })); @@ -259,7 +281,15 @@ fn add_tiny_liquidity_directly_to_pool_address() { Balance { coin: coin1, amount: Amount(1000) } )); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 10, 10000, 10, 10000, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 10, + 10000, + 10, + 10000, + user, + )); // check the same but for coin3 (non-native token) let pallet_account = Dex::get_pool_account(Dex::get_pool_id(coin1, coin3).unwrap()); @@ -267,7 +297,15 @@ fn add_tiny_liquidity_directly_to_pool_address() { pallet_account, Balance { coin: coin2, amount: Amount(1) } )); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin3, 10, 10000, 10, 10000, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin3.try_into().unwrap(), + 10, + 10000, + 10, + 10000, + user, + )); }); } @@ -276,11 +314,11 @@ fn can_remove_liquidity() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Monero); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); let lp_token = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint( user, @@ -290,7 +328,7 @@ fn can_remove_liquidity() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), 100000, 1000000000, 100000, @@ -302,7 +340,7 @@ fn can_remove_liquidity() { assert_ok!(Dex::remove_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), total_lp_received, 0, 0, @@ -334,15 +372,23 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Dai; + let coin2 = Coin::External(ExternalCoin::Dai); let lp_token = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(10000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 10, 10000, 10, 10000, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 10, + 10000, + 10, + 10000, + user, + )); // Only 216 lp_tokens_minted assert_eq!(pool_balance(user, lp_token), 216); @@ -350,7 +396,7 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { assert_noop!( Dex::remove_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), 216 + 1, // Try and redeem 10 lp tokens while only 9 minted. 0, 0, @@ -366,14 +412,22 @@ fn can_quote_price() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Ether); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(100000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 200, 10000, 1, 1, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 200, + 10000, + 1, + 1, + user, + )); assert_eq!( Dex::quote_price_exact_tokens_for_tokens(Coin::native(), coin2, 3000, false,), @@ -481,14 +535,22 @@ fn quote_price_exact_tokens_for_tokens_matches_execution() { let user = system_address(b"user1").into(); let user2 = system_address(b"user2").into(); let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; + let coin2 = Coin::External(ExternalCoin::Bitcoin); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(100000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 200, 10000, 1, 1, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 200, + 10000, + 1, + 1, + user, + )); let amount = 1; let quoted_price = 49; @@ -518,14 +580,22 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { let user = system_address(b"user1").into(); let user2 = system_address(b"user2").into(); let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Monero); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(100000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 200, 10000, 1, 1, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 200, + 10000, + 1, + 1, + user, + )); let amount = 49; let quoted_price = 1; @@ -557,10 +627,10 @@ fn can_swap_with_native() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Ether); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(10000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); @@ -570,7 +640,7 @@ fn can_swap_with_native() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -602,8 +672,8 @@ fn can_swap_with_realistic_values() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let sri = Coin::native(); - let dai = Coin::Dai; - assert_ok!(Dex::create_pool(dai)); + let dai = Coin::External(ExternalCoin::Dai); + assert_ok!(Dex::create_pool(dai.try_into().unwrap())); const UNIT: u64 = 1_000_000_000; @@ -620,7 +690,7 @@ fn can_swap_with_realistic_values() { let liquidity_dai = 1_000_000 * UNIT; assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - dai, + dai.try_into().unwrap(), liquidity_dai, liquidity_sri, 1, @@ -653,9 +723,9 @@ fn can_not_swap_in_pool_with_no_liquidity_added_yet() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Monero); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); // Check can't swap an empty pool assert_noop!( @@ -676,11 +746,11 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; + let coin2 = Coin::External(ExternalCoin::Bitcoin); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); let lp_token = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(10000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); @@ -690,7 +760,7 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -714,7 +784,7 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(Dex::remove_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), lp_token_minted, 1, 1, @@ -787,9 +857,9 @@ fn swap_should_not_work_if_too_much_slippage() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Ether); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(10000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); @@ -799,7 +869,7 @@ fn swap_should_not_work_if_too_much_slippage() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -827,10 +897,10 @@ fn can_swap_tokens_for_exact_tokens() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Dai; + let coin2 = Coin::External(ExternalCoin::Dai); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(20000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); @@ -844,7 +914,7 @@ fn can_swap_tokens_for_exact_tokens() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -882,11 +952,11 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { let user = system_address(b"user1").into(); let user2 = system_address(b"user2").into(); let coin1 = Coin::native(); - let coin2 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Monero); let pool_id = Dex::get_pool_id(coin1, coin2).unwrap(); let lp_token = coin2; - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); let base1 = 10000; let base2 = 1000; @@ -903,7 +973,7 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user2), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -947,7 +1017,7 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(Dex::remove_liquidity( RuntimeOrigin::signed(user2), - coin2, + coin2.try_into().unwrap(), lp_token_minted, 0, 0, @@ -961,9 +1031,9 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Ether); - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(20000) })); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin2, amount: Amount(1000) })); @@ -973,7 +1043,7 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -1001,11 +1071,11 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Dai; - let coin3 = Coin::Monero; + let coin2 = Coin::External(ExternalCoin::Dai); + let coin3 = Coin::External(ExternalCoin::Monero); - assert_ok!(Dex::create_pool(coin2)); - assert_ok!(Dex::create_pool(coin3)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); + assert_ok!(Dex::create_pool(coin3.try_into().unwrap())); let base1 = 10000; let base2 = 10000; @@ -1019,7 +1089,7 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -1028,7 +1098,7 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { )); assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin3, + coin3.try_into().unwrap(), liquidity3, liquidity1, 1, @@ -1089,11 +1159,11 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); let coin1 = Coin::native(); - let coin2 = Coin::Bitcoin; - let coin3 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Bitcoin); + let coin3 = Coin::External(ExternalCoin::Ether); - assert_ok!(Dex::create_pool(coin2)); - assert_ok!(Dex::create_pool(coin3)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); + assert_ok!(Dex::create_pool(coin3.try_into().unwrap())); let base1 = 10000; let base2 = 10000; @@ -1107,7 +1177,7 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin2, + coin2.try_into().unwrap(), liquidity2, liquidity1, 1, @@ -1116,7 +1186,7 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { )); assert_ok!(Dex::add_liquidity( RuntimeOrigin::signed(user), - coin3, + coin3.try_into().unwrap(), liquidity3, liquidity1, 1, @@ -1154,7 +1224,7 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { fn can_not_swap_same_coin() { new_test_ext().execute_with(|| { let user = system_address(b"user1").into(); - let coin1 = Coin::Dai; + let coin1 = Coin::External(ExternalCoin::Dai); assert_ok!(CoinsPallet::::mint(user, Balance { coin: coin1, amount: Amount(1000) })); let exchange_amount = 10; @@ -1188,10 +1258,10 @@ fn validate_pool_id_sorting() { // Serai < Bitcoin < Ether < Dai < Monero. // coin1 <= coin2 for this test to pass. let native = Coin::native(); - let coin1 = Coin::Bitcoin; - let coin2 = Coin::Monero; - assert_eq!(Dex::get_pool_id(native, coin2).unwrap(), coin2); - assert_eq!(Dex::get_pool_id(coin2, native).unwrap(), coin2); + let coin1 = Coin::External(ExternalCoin::Bitcoin); + let coin2 = Coin::External(ExternalCoin::Monero); + assert_eq!(Dex::get_pool_id(native, coin2).unwrap(), coin2.try_into().unwrap()); + assert_eq!(Dex::get_pool_id(coin2, native).unwrap(), coin2.try_into().unwrap()); assert!(matches!(Dex::get_pool_id(native, native), Err(Error::::EqualCoins))); assert!(matches!(Dex::get_pool_id(coin2, coin1), Err(Error::::PoolNotFound))); assert!(coin2 > coin1); @@ -1216,7 +1286,7 @@ fn cannot_block_pool_creation() { // The target pool the user wants to create is Native <=> Coin(2) let coin1 = Coin::native(); - let coin2 = Coin::Ether; + let coin2 = Coin::External(ExternalCoin::Ether); // Attacker computes the still non-existing pool account for the target pair let pool_account = Dex::get_pool_account(Dex::get_pool_id(coin2, coin1).unwrap()); @@ -1238,7 +1308,7 @@ fn cannot_block_pool_creation() { } // User can still create the pool - assert_ok!(Dex::create_pool(coin2)); + assert_ok!(Dex::create_pool(coin2.try_into().unwrap())); // User has to transfer one Coin(2) token to the pool account (otherwise add_liquidity will // fail with `CoinTwoDepositDidNotMeetMinimum`), also transfer native token for the same error. @@ -1256,7 +1326,15 @@ fn cannot_block_pool_creation() { )); // add_liquidity shouldn't fail because of the number of consumers - assert_ok!(Dex::add_liquidity(RuntimeOrigin::signed(user), coin2, 100, 9900, 10, 9900, user,)); + assert_ok!(Dex::add_liquidity( + RuntimeOrigin::signed(user), + coin2.try_into().unwrap(), + 100, + 9900, + 10, + 9900, + user, + )); }); } @@ -1281,7 +1359,7 @@ fn test_median_price() { prices.push(OsRng.next_u64()); } } - let coin = Coin::Bitcoin; + let coin = ExternalCoin::Bitcoin; assert!(prices.len() >= (2 * usize::from(MEDIAN_PRICE_WINDOW_LENGTH))); for i in 0 .. prices.len() { diff --git a/substrate/economic-security/pallet/src/lib.rs b/substrate/economic-security/pallet/src/lib.rs index 65b827941..045297f46 100644 --- a/substrate/economic-security/pallet/src/lib.rs +++ b/substrate/economic-security/pallet/src/lib.rs @@ -24,7 +24,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(fn deposit_event)] pub enum Event { - EconomicSecurityReached { network: NetworkId }, + EconomicSecurityReached { network: ExternalNetworkId }, } #[pallet::pallet] @@ -33,17 +33,19 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn economic_security_block)] pub(crate) type EconomicSecurityBlock = - StorageMap<_, Identity, NetworkId, BlockNumberFor, OptionQuery>; + StorageMap<_, Identity, ExternalNetworkId, BlockNumberFor, OptionQuery>; #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(n: BlockNumberFor) -> Weight { // we accept we reached economic security once we can mint smallest amount of a network's coin - for coin in COINS { + for coin in EXTERNAL_COINS { let existing = EconomicSecurityBlock::::get(coin.network()); + // TODO: we don't need to check for oracle value if is_allowed returns false when there is + // no coin value if existing.is_none() && Dex::::security_oracle_value(coin).is_some() && - ::AllowMint::is_allowed(&Balance { coin, amount: Amount(1) }) + ::AllowMint::is_allowed(&ExternalBalance { coin, amount: Amount(1) }) { EconomicSecurityBlock::::set(coin.network(), Some(n)); Self::deposit_event(Event::EconomicSecurityReached { network: coin.network() }); diff --git a/substrate/emissions/pallet/src/lib.rs b/substrate/emissions/pallet/src/lib.rs index 400f89212..99e22e8bd 100644 --- a/substrate/emissions/pallet/src/lib.rs +++ b/substrate/emissions/pallet/src/lib.rs @@ -84,7 +84,8 @@ pub mod pallet { pub type CurrentSession = StorageMap<_, Identity, NetworkId, u32, ValueQuery>; #[pallet::storage] - pub(crate) type LastSwapVolume = StorageMap<_, Identity, Coin, u64, OptionQuery>; + pub(crate) type LastSwapVolume = + StorageMap<_, Identity, ExternalCoin, u64, OptionQuery>; #[pallet::genesis_build] impl BuildGenesisConfig for GenesisConfig { @@ -136,19 +137,16 @@ pub mod pallet { let mut total_distance: u64 = 0; let reward_this_epoch = if pre_ec_security { // calculate distance to economic security per network - for n in NETWORKS { - if n == NetworkId::Serai { - continue; - } - + for n in EXTERNAL_NETWORKS { let required = ValidatorSets::::required_stake_for_network(n); - let mut current = ValidatorSets::::total_allocated_stake(n).unwrap_or(Amount(0)).0; + let mut current = + ValidatorSets::::total_allocated_stake(NetworkId::from(n)).unwrap_or(Amount(0)).0; if current > required { current = required; } let distance = required - current; - distances.insert(n, distance); + distances.insert(NetworkId::from(n), distance); total_distance = total_distance.saturating_add(distance); } @@ -192,9 +190,8 @@ pub mod pallet { ) } else { // get swap volumes - let mut volume_per_coin: BTreeMap = BTreeMap::new(); - for c in COINS { - // this should return 0 for SRI and so it shouldn't affect the total volume. + let mut volume_per_coin: BTreeMap = BTreeMap::new(); + for c in EXTERNAL_COINS { let current_volume = Dex::::swap_volume(c).unwrap_or(0); let last_volume = LastSwapVolume::::get(c).unwrap_or(0); let vol_this_epoch = current_volume.saturating_sub(last_volume); @@ -209,11 +206,13 @@ pub mod pallet { let mut volume_per_network: BTreeMap = BTreeMap::new(); for (c, vol) in &volume_per_coin { volume_per_network.insert( - c.network(), - (*volume_per_network.get(&c.network()).unwrap_or(&0)).saturating_add(*vol), + c.network().into(), + (*volume_per_network.get(&c.network().into()).unwrap_or(&0)).saturating_add(*vol), ); total_volume = total_volume.saturating_add(*vol); } + // we add the serai network now + volume_per_network.insert(NetworkId::Serai, 0); ( volume_per_network @@ -245,12 +244,13 @@ pub mod pallet { // distribute the rewards within the network for (n, reward) in rewards_per_network { - let (validators_reward, network_pool_reward) = if n == NetworkId::Serai { - (reward, 0) - } else { + let validators_reward = if let NetworkId::External(external_network) = n { // calculate pool vs validator share - let capacity = ValidatorSets::::total_allocated_stake(n).unwrap_or(Amount(0)).0; - let required = ValidatorSets::::required_stake_for_network(n); + let capacity = + ValidatorSets::::total_allocated_stake(NetworkId::from(external_network)) + .unwrap_or(Amount(0)) + .0; + let required = ValidatorSets::::required_stake_for_network(external_network); let unused_capacity = capacity.saturating_sub(required); let distribution = unused_capacity.saturating_mul(ACCURACY_MULTIPLIER) / capacity; @@ -258,41 +258,44 @@ pub mod pallet { let validators_reward = DESIRED_DISTRIBUTION.saturating_mul(reward) / total; let network_pool_reward = reward.saturating_sub(validators_reward); - (validators_reward, network_pool_reward) - }; - // distribute validators rewards - Self::distribute_to_validators(n, validators_reward); + // send the rest to the pool + if network_pool_reward != 0 { + // these should be available to unwrap if we have a network_pool_reward. Because that + // means we had an unused capacity hence in a post-ec era. + let vpn = volume_per_network.as_ref().unwrap(); + let vpc = volume_per_coin.as_ref().unwrap(); + for c in external_network.coins() { + let pool_reward = u64::try_from( + u128::from(network_pool_reward).saturating_mul(u128::from(vpc[&c])) / + u128::from(vpn[&n]), + ) + .unwrap(); - // send the rest to the pool - if network_pool_reward != 0 { - // these should be available to unwrap if we have a network_pool_reward. Because that - // means we had an unused capacity hence in a post-ec era. - let vpn = volume_per_network.as_ref().unwrap(); - let vpc = volume_per_coin.as_ref().unwrap(); - for c in n.coins() { - let pool_reward = u64::try_from( - u128::from(network_pool_reward).saturating_mul(u128::from(vpc[c])) / - u128::from(vpn[&n]), - ) - .unwrap(); - - if Coins::::mint( - Dex::::get_pool_account(*c), - Balance { coin: Coin::Serai, amount: Amount(pool_reward) }, - ) - .is_err() - { - // TODO: log the failure - continue; + if Coins::::mint( + Dex::::get_pool_account(c), + Balance { coin: Coin::Serai, amount: Amount(pool_reward) }, + ) + .is_err() + { + // TODO: log the failure + continue; + } } } - } + + validators_reward + } else { + reward + }; + + // distribute validators rewards + Self::distribute_to_validators(n, validators_reward); } // TODO: we have the past session participants here in the emissions pallet so that we can // distribute rewards to them in the next session. Ideally we should be able to fetch this - // information from valiadtor sets pallet. + // information from validator sets pallet. Self::update_participants(); Weight::zero() // TODO } @@ -318,11 +321,7 @@ pub mod pallet { /// Returns true if any of the external networks haven't reached economic security yet. fn pre_ec_security() -> bool { - for n in NETWORKS { - if n == NetworkId::Serai { - continue; - } - + for n in EXTERNAL_NETWORKS { if EconomicSecurity::::economic_security_block(n).is_none() { return true; } @@ -362,16 +361,30 @@ pub mod pallet { pub fn swap_to_staked_sri( to: PublicKey, network: NetworkId, - balance: Balance, + balance: ExternalBalance, ) -> DispatchResult { // check the network didn't reach the economic security yet - if EconomicSecurity::::economic_security_block(network).is_some() { - Err(Error::::NetworkHasEconomicSecurity)?; + if let NetworkId::External(n) = network { + if EconomicSecurity::::economic_security_block(n).is_some() { + Err(Error::::NetworkHasEconomicSecurity)?; + } + } else { + // we target 20% of the network's stake to be behind the Serai network + let mut total_stake = 0; + for n in NETWORKS { + total_stake += ValidatorSets::::total_allocated_stake(n).unwrap_or(Amount(0)).0; + } + + let stake = ValidatorSets::::total_allocated_stake(network).unwrap_or(Amount(0)).0; + let desired_stake = total_stake / (100 / SERAI_VALIDATORS_DESIRED_PERCENTAGE); + if stake >= desired_stake { + Err(Error::::NetworkHasEconomicSecurity)?; + } } // swap half of the liquidity for SRI to form PoL. let half = balance.amount.0 / 2; - let path = BoundedVec::try_from(vec![balance.coin, Coin::Serai]).unwrap(); + let path = BoundedVec::try_from(vec![balance.coin.into(), Coin::Serai]).unwrap(); let origin = RawOrigin::Signed(POL_ACCOUNT.into()); Dex::::swap_exact_tokens_for_tokens( origin.clone().into(), diff --git a/substrate/genesis-liquidity/pallet/src/lib.rs b/substrate/genesis-liquidity/pallet/src/lib.rs index ec77fff99..a5f44f1ab 100644 --- a/substrate/genesis-liquidity/pallet/src/lib.rs +++ b/substrate/genesis-liquidity/pallet/src/lib.rs @@ -60,9 +60,9 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(fn deposit_event)] pub enum Event { - GenesisLiquidityAdded { by: SeraiAddress, balance: Balance }, - GenesisLiquidityRemoved { by: SeraiAddress, balance: Balance }, - GenesisLiquidityAddedToPool { coin1: Balance, sri: Amount }, + GenesisLiquidityAdded { by: SeraiAddress, balance: ExternalBalance }, + GenesisLiquidityRemoved { by: SeraiAddress, balance: ExternalBalance }, + GenesisLiquidityAddedToPool { coin: ExternalBalance, sri: Amount }, } #[pallet::pallet] @@ -70,17 +70,23 @@ pub mod pallet { /// Keeps shares and the amount of coins per account. #[pallet::storage] - #[pallet::getter(fn liquidity)] - pub(crate) type Liquidity = - StorageDoubleMap<_, Identity, Coin, Blake2_128Concat, PublicKey, LiquidityAmount, OptionQuery>; + pub(crate) type Liquidity = StorageDoubleMap< + _, + Identity, + ExternalCoin, + Blake2_128Concat, + PublicKey, + LiquidityAmount, + OptionQuery, + >; /// Keeps the total shares and the total amount of coins per coin. #[pallet::storage] - #[pallet::getter(fn supply)] - pub(crate) type Supply = StorageMap<_, Identity, Coin, LiquidityAmount, OptionQuery>; + pub(crate) type Supply = + StorageMap<_, Identity, ExternalCoin, LiquidityAmount, OptionQuery>; #[pallet::storage] - pub(crate) type Oracle = StorageMap<_, Identity, Coin, u64, OptionQuery>; + pub(crate) type Oracle = StorageMap<_, Identity, ExternalCoin, u64, OptionQuery>; #[pallet::storage] #[pallet::getter(fn genesis_complete_block)] @@ -104,11 +110,7 @@ pub mod pallet { // get pool & total values let mut pool_values = vec![]; let mut total_value: u128 = 0; - for coin in COINS { - if coin == Coin::Serai { - continue; - } - + for coin in EXTERNAL_COINS { // initial coin value in terms of btc let Some(value) = Oracle::::get(coin) else { continue; @@ -160,7 +162,7 @@ pub mod pallet { // let everyone know about the event Self::deposit_event(Event::GenesisLiquidityAddedToPool { - coin1: Balance { coin, amount: Amount(u64::try_from(pool_amount).unwrap()) }, + coin: ExternalBalance { coin, amount: Amount(u64::try_from(pool_amount).unwrap()) }, sri: Amount(sri_amount), }); } @@ -182,7 +184,7 @@ pub mod pallet { impl Pallet { /// Add genesis liquidity for the given account. All accounts that provide liquidity /// will receive the genesis SRI according to their liquidity ratio. - pub fn add_coin_liquidity(account: PublicKey, balance: Balance) -> DispatchResult { + pub fn add_coin_liquidity(account: PublicKey, balance: ExternalBalance) -> DispatchResult { // check we are still in genesis period if Self::genesis_ended() { Err(Error::::GenesisPeriodEnded)?; @@ -229,7 +231,7 @@ pub mod pallet { /// If networks is yet to be reached that threshold, None is returned. fn blocks_since_ec_security() -> Option { let mut min = u64::MAX; - for n in &NETWORKS[1 ..] { + for n in EXTERNAL_NETWORKS { let ec_security_block = EconomicSecurity::::economic_security_block(n)?.saturated_into::(); let current = >::block_number().saturated_into::(); @@ -245,11 +247,7 @@ pub mod pallet { } fn oraclization_is_done() -> bool { - for c in COINS { - if c == Coin::Serai { - continue; - } - + for c in EXTERNAL_COINS { if Oracle::::get(c).is_none() { return false; } @@ -278,7 +276,7 @@ pub mod pallet { /// Remove the provided genesis liquidity for an account. #[pallet::call_index(0)] #[pallet::weight((0, DispatchClass::Operational))] // TODO - pub fn remove_coin_liquidity(origin: OriginFor, balance: Balance) -> DispatchResult { + pub fn remove_coin_liquidity(origin: OriginFor, balance: ExternalBalance) -> DispatchResult { let account = ensure_signed(origin)?; let origin = RawOrigin::Signed(GENESIS_LIQUIDITY_ACCOUNT.into()); let supply = Supply::::get(balance.coin).ok_or(Error::::NotEnoughLiquidity)?; @@ -287,7 +285,8 @@ pub mod pallet { let (new_liquidity, new_supply) = if Self::genesis_ended() { // see how much liq tokens we have let total_liq_tokens = - LiquidityTokens::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), balance.coin).0; + LiquidityTokens::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), Coin::from(balance.coin)) + .0; // get how much user wants to remove let LiquidityAmount { shares, coins } = @@ -301,7 +300,7 @@ pub mod pallet { // remove liquidity from pool let prev_sri = Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), Coin::Serai); - let prev_coin = Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), balance.coin); + let prev_coin = Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), balance.coin.into()); Dex::::remove_liquidity( origin.clone().into(), balance.coin, @@ -311,7 +310,8 @@ pub mod pallet { GENESIS_LIQUIDITY_ACCOUNT.into(), )?; let current_sri = Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), Coin::Serai); - let current_coin = Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), balance.coin); + let current_coin = + Coins::::balance(GENESIS_LIQUIDITY_ACCOUNT.into(), balance.coin.into()); // burn the SRI if necessary // TODO: take into consideration movement between pools. @@ -330,7 +330,7 @@ pub mod pallet { Coins::::transfer( origin.clone().into(), account, - Balance { coin: balance.coin, amount: Amount(coin_out) }, + Balance { coin: balance.coin.into(), amount: Amount(coin_out) }, )?; Coins::::transfer( origin.into(), @@ -365,7 +365,7 @@ pub mod pallet { Coins::::transfer( origin.into(), account, - Balance { coin: balance.coin, amount: Amount(existing.coins) }, + Balance { coin: balance.coin.into(), amount: Amount(existing.coins) }, )?; ( @@ -403,10 +403,10 @@ pub mod pallet { ensure_none(origin)?; // set their relative values - Oracle::::set(Coin::Bitcoin, Some(10u64.pow(Coin::Bitcoin.decimals()))); - Oracle::::set(Coin::Monero, Some(values.monero)); - Oracle::::set(Coin::Ether, Some(values.ether)); - Oracle::::set(Coin::Dai, Some(values.dai)); + Oracle::::set(ExternalCoin::Bitcoin, Some(10u64.pow(ExternalCoin::Bitcoin.decimals()))); + Oracle::::set(ExternalCoin::Monero, Some(values.monero)); + Oracle::::set(ExternalCoin::Ether, Some(values.ether)); + Oracle::::set(ExternalCoin::Dai, Some(values.dai)); Ok(()) } } diff --git a/substrate/in-instructions/pallet/src/lib.rs b/substrate/in-instructions/pallet/src/lib.rs index f90ae4122..e3f69f417 100644 --- a/substrate/in-instructions/pallet/src/lib.rs +++ b/substrate/in-instructions/pallet/src/lib.rs @@ -4,7 +4,7 @@ use sp_io::hashing::blake2_256; -use serai_primitives::{BlockHash, NetworkId}; +use serai_primitives::*; pub use in_instructions_primitives as primitives; use primitives::*; @@ -23,8 +23,6 @@ pub mod pallet { use sp_runtime::traits::Zero; use sp_core::sr25519::Public; - use serai_primitives::{Coin, Amount, Balance}; - use frame_support::pallet_prelude::*; use frame_system::{pallet_prelude::*, RawOrigin}; @@ -34,7 +32,7 @@ pub mod pallet { }; use dex_pallet::{Config as DexConfig, Pallet as Dex}; use validator_sets_pallet::{ - primitives::{Session, ValidatorSet}, + primitives::{Session, ValidatorSet, ExternalValidatorSet}, Config as ValidatorSetsConfig, Pallet as ValidatorSets, }; @@ -60,9 +58,9 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(fn deposit_event)] pub enum Event { - Batch { network: NetworkId, id: u32, block: BlockHash, instructions_hash: [u8; 32] }, - InstructionFailure { network: NetworkId, id: u32, index: u32 }, - Halt { network: NetworkId }, + Batch { network: ExternalNetworkId, id: u32, block: BlockHash, instructions_hash: [u8; 32] }, + InstructionFailure { network: ExternalNetworkId, id: u32, index: u32 }, + Halt { network: ExternalNetworkId }, } #[pallet::error] @@ -77,23 +75,24 @@ pub mod pallet { // The ID of the last executed Batch for a network. #[pallet::storage] #[pallet::getter(fn batches)] - pub(crate) type LastBatch = StorageMap<_, Identity, NetworkId, u32, OptionQuery>; + pub(crate) type LastBatch = + StorageMap<_, Identity, ExternalNetworkId, u32, OptionQuery>; // The last Serai block in which this validator set included a batch #[pallet::storage] #[pallet::getter(fn last_batch_block)] pub(crate) type LastBatchBlock = - StorageMap<_, Identity, NetworkId, BlockNumberFor, OptionQuery>; + StorageMap<_, Identity, ExternalNetworkId, BlockNumberFor, OptionQuery>; // Halted networks. #[pallet::storage] - pub(crate) type Halted = StorageMap<_, Identity, NetworkId, (), OptionQuery>; + pub(crate) type Halted = StorageMap<_, Identity, ExternalNetworkId, (), OptionQuery>; // The latest block a network has acknowledged as finalized #[pallet::storage] #[pallet::getter(fn latest_network_block)] pub(crate) type LatestNetworkBlock = - StorageMap<_, Identity, NetworkId, BlockHash, OptionQuery>; + StorageMap<_, Identity, ExternalNetworkId, BlockHash, OptionQuery>; impl Pallet { // Use a dedicated transaction layer when executing this InInstruction @@ -102,7 +101,7 @@ pub mod pallet { fn execute(instruction: InInstructionWithBalance) -> Result<(), DispatchError> { match instruction.instruction { InInstruction::Transfer(address) => { - Coins::::mint(address.into(), instruction.balance)?; + Coins::::mint(address.into(), instruction.balance.into())?; } InInstruction::Dex(call) => { // This will only be initiated by external chain transactions. That is why we only need @@ -114,11 +113,11 @@ pub mod pallet { let coin = instruction.balance.coin; // mint the given coin on the account - Coins::::mint(IN_INSTRUCTION_EXECUTOR.into(), instruction.balance)?; + Coins::::mint(IN_INSTRUCTION_EXECUTOR.into(), instruction.balance.into())?; // swap half of it for SRI let half = instruction.balance.amount.0 / 2; - let path = BoundedVec::try_from(vec![coin, Coin::Serai]).unwrap(); + let path = BoundedVec::try_from(vec![coin.into(), Coin::Serai]).unwrap(); Dex::::swap_exact_tokens_for_tokens( origin.clone().into(), path, @@ -144,13 +143,13 @@ pub mod pallet { // TODO: minimums are set to 1 above to guarantee successful adding liq call. // Ideally we either get this info from user or send the leftovers back to user. // Let's send the leftovers back to user for now. - let coin_balance = Coins::::balance(IN_INSTRUCTION_EXECUTOR.into(), coin); + let coin_balance = Coins::::balance(IN_INSTRUCTION_EXECUTOR.into(), coin.into()); let sri_balance = Coins::::balance(IN_INSTRUCTION_EXECUTOR.into(), Coin::Serai); if coin_balance != Amount(0) { Coins::::transfer_internal( IN_INSTRUCTION_EXECUTOR.into(), address.into(), - Balance { coin, amount: coin_balance }, + Balance { coin: coin.into(), amount: coin_balance }, )?; } if sri_balance != Amount(0) { @@ -171,10 +170,10 @@ pub mod pallet { } // mint the given coin on our account - Coins::::mint(IN_INSTRUCTION_EXECUTOR.into(), instruction.balance)?; + Coins::::mint(IN_INSTRUCTION_EXECUTOR.into(), instruction.balance.into())?; // get the path - let mut path = vec![instruction.balance.coin, Coin::Serai]; + let mut path = vec![instruction.balance.coin.into(), Coin::Serai]; if !native_coin { path.push(out_balance.coin); } @@ -210,7 +209,10 @@ pub mod pallet { // TODO: Properly pass data. Replace address with an OutInstruction entirely? data: None, }, - balance: Balance { coin: out_balance.coin, amount: coin_balance }, + balance: ExternalBalance { + coin: out_balance.coin.try_into().unwrap(), + amount: coin_balance, + }, }; Coins::::burn_with_instruction(origin.into(), instruction)?; } @@ -218,18 +220,18 @@ pub mod pallet { } } InInstruction::GenesisLiquidity(address) => { - Coins::::mint(GENESIS_LIQUIDITY_ACCOUNT.into(), instruction.balance)?; + Coins::::mint(GENESIS_LIQUIDITY_ACCOUNT.into(), instruction.balance.into())?; GenesisLiq::::add_coin_liquidity(address.into(), instruction.balance)?; } InInstruction::SwapToStakedSRI(address, network) => { - Coins::::mint(POL_ACCOUNT.into(), instruction.balance)?; + Coins::::mint(POL_ACCOUNT.into(), instruction.balance.into())?; Emissions::::swap_to_staked_sri(address.into(), network, instruction.balance)?; } } Ok(()) } - pub fn halt(network: NetworkId) -> Result<(), DispatchError> { + pub fn halt(network: ExternalNetworkId) -> Result<(), DispatchError> { Halted::::set(network, Some(())); Self::deposit_event(Event::Halt { network }); Ok(()) @@ -237,13 +239,13 @@ pub mod pallet { } fn keys_for_network( - network: NetworkId, + network: ExternalNetworkId, ) -> Result<(Session, Option, Option), InvalidTransaction> { // If there's no session set, and therefore no keys set, then this must be an invalid signature - let Some(session) = ValidatorSets::::session(network) else { + let Some(session) = ValidatorSets::::session(NetworkId::from(network)) else { Err(InvalidTransaction::BadProof)? }; - let mut set = ValidatorSet { session, network }; + let mut set = ExternalValidatorSet { network, session }; let latest = ValidatorSets::::keys(set).map(|keys| keys.0); let prior = if set.session.0 != 0 { set.session.0 -= 1; @@ -303,12 +305,7 @@ pub mod pallet { if batch.batch.encode().len() > MAX_BATCH_SIZE { Err(InvalidTransaction::ExhaustsResources)?; } - let network = batch.batch.network; - // Don't allow the Serai set to publish `Batch`s as-if Serai itself was an external network - if network == NetworkId::Serai { - Err(InvalidTransaction::Custom(0))?; - } // verify the signature let (current_session, prior, current) = keys_for_network::(network)?; @@ -336,7 +333,7 @@ pub mod pallet { // `Batch`s published by the prior key, meaning they are accepting the hand-over. if prior.is_some() && (!valid_by_prior) { ValidatorSets::::retire_set(ValidatorSet { - network, + network: network.into(), session: Session(current_session.0 - 1), }); } diff --git a/substrate/in-instructions/primitives/src/lib.rs b/substrate/in-instructions/primitives/src/lib.rs index 1455e4236..3944fd731 100644 --- a/substrate/in-instructions/primitives/src/lib.rs +++ b/substrate/in-instructions/primitives/src/lib.rs @@ -20,7 +20,7 @@ use sp_std::vec::Vec; use sp_runtime::RuntimeDebug; #[rustfmt::skip] -use serai_primitives::{BlockHash, Balance, NetworkId, SeraiAddress, ExternalAddress, system_address}; +use serai_primitives::{BlockHash, Balance, ExternalNetworkId, NetworkId, SeraiAddress, ExternalBalance, ExternalAddress, system_address}; mod shorthand; pub use shorthand::*; @@ -97,7 +97,7 @@ pub struct RefundableInInstruction { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct InInstructionWithBalance { pub instruction: InInstruction, - pub balance: Balance, + pub balance: ExternalBalance, } #[derive(Clone, PartialEq, Eq, Encode, Decode, TypeInfo, RuntimeDebug)] @@ -105,7 +105,7 @@ pub struct InInstructionWithBalance { #[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Batch { - pub network: NetworkId, + pub network: ExternalNetworkId, pub id: u32, pub block: BlockHash, pub instructions: Vec, diff --git a/substrate/in-instructions/primitives/src/shorthand.rs b/substrate/in-instructions/primitives/src/shorthand.rs index 8b1103c3b..6f29f6f3d 100644 --- a/substrate/in-instructions/primitives/src/shorthand.rs +++ b/substrate/in-instructions/primitives/src/shorthand.rs @@ -9,7 +9,7 @@ use serde::{Serialize, Deserialize}; use scale::{Encode, Decode, MaxEncodedLen}; use scale_info::TypeInfo; -use serai_primitives::{Coin, Amount, SeraiAddress, ExternalAddress}; +use serai_primitives::{Amount, ExternalAddress, ExternalCoin, SeraiAddress}; use coins_primitives::OutInstruction; @@ -25,7 +25,7 @@ pub enum Shorthand { Raw(RefundableInInstruction), Swap { origin: Option, - coin: Coin, + coin: ExternalCoin, minimum: Amount, out: OutInstruction, }, diff --git a/substrate/node/src/chain_spec.rs b/substrate/node/src/chain_spec.rs index e67674cc5..972b4dd6f 100644 --- a/substrate/node/src/chain_spec.rs +++ b/substrate/node/src/chain_spec.rs @@ -33,6 +33,22 @@ fn devnet_genesis( endowed_accounts: Vec, ) -> RuntimeGenesisConfig { let validators = validators.iter().map(|name| account_from_name(name)).collect::>(); + let key_shares = NETWORKS + .iter() + .map(|network| match network { + NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), + NetworkId::External(ExternalNetworkId::Bitcoin) => { + (NetworkId::External(ExternalNetworkId::Bitcoin), Amount(1_000_000 * 10_u64.pow(8))) + } + NetworkId::External(ExternalNetworkId::Ethereum) => { + (NetworkId::External(ExternalNetworkId::Ethereum), Amount(1_000_000 * 10_u64.pow(8))) + } + NetworkId::External(ExternalNetworkId::Monero) => { + (NetworkId::External(ExternalNetworkId::Monero), Amount(100_000 * 10_u64.pow(8))) + } + }) + .collect::>(); + RuntimeGenesisConfig { system: SystemConfig { code: wasm_binary.to_vec(), _config: PhantomData }, @@ -47,29 +63,10 @@ fn devnet_genesis( }, validator_sets: ValidatorSetsConfig { - networks: serai_runtime::primitives::NETWORKS - .iter() - .map(|network| match network { - NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), - NetworkId::Bitcoin => (NetworkId::Bitcoin, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Ethereum => (NetworkId::Ethereum, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Monero => (NetworkId::Monero, Amount(100_000 * 10_u64.pow(8))), - }) - .collect(), - participants: validators.clone(), - }, - emissions: EmissionsConfig { - networks: serai_runtime::primitives::NETWORKS - .iter() - .map(|network| match network { - NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), - NetworkId::Bitcoin => (NetworkId::Bitcoin, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Ethereum => (NetworkId::Ethereum, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Monero => (NetworkId::Monero, Amount(100_000 * 10_u64.pow(8))), - }) - .collect(), + networks: key_shares.clone(), participants: validators.clone(), }, + emissions: EmissionsConfig { networks: key_shares, participants: validators.clone() }, signals: SignalsConfig::default(), babe: BabeConfig { authorities: validators.iter().map(|validator| ((*validator).into(), 1)).collect(), @@ -88,6 +85,21 @@ fn testnet_genesis(wasm_binary: &[u8], validators: Vec<&'static str>) -> Runtime .into_iter() .map(|validator| Public::decode(&mut hex::decode(validator).unwrap().as_slice()).unwrap()) .collect::>(); + let key_shares = NETWORKS + .iter() + .map(|network| match network { + NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), + NetworkId::External(ExternalNetworkId::Bitcoin) => { + (NetworkId::External(ExternalNetworkId::Bitcoin), Amount(1_000_000 * 10_u64.pow(8))) + } + NetworkId::External(ExternalNetworkId::Ethereum) => { + (NetworkId::External(ExternalNetworkId::Ethereum), Amount(1_000_000 * 10_u64.pow(8))) + } + NetworkId::External(ExternalNetworkId::Monero) => { + (NetworkId::External(ExternalNetworkId::Monero), Amount(100_000 * 10_u64.pow(8))) + } + }) + .collect::>(); assert_eq!(validators.iter().collect::>().len(), validators.len()); @@ -105,29 +117,10 @@ fn testnet_genesis(wasm_binary: &[u8], validators: Vec<&'static str>) -> Runtime }, validator_sets: ValidatorSetsConfig { - networks: serai_runtime::primitives::NETWORKS - .iter() - .map(|network| match network { - NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), - NetworkId::Bitcoin => (NetworkId::Bitcoin, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Ethereum => (NetworkId::Ethereum, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Monero => (NetworkId::Monero, Amount(100_000 * 10_u64.pow(8))), - }) - .collect(), - participants: validators.clone(), - }, - emissions: EmissionsConfig { - networks: serai_runtime::primitives::NETWORKS - .iter() - .map(|network| match network { - NetworkId::Serai => (NetworkId::Serai, Amount(50_000 * 10_u64.pow(8))), - NetworkId::Bitcoin => (NetworkId::Bitcoin, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Ethereum => (NetworkId::Ethereum, Amount(1_000_000 * 10_u64.pow(8))), - NetworkId::Monero => (NetworkId::Monero, Amount(100_000 * 10_u64.pow(8))), - }) - .collect(), + networks: key_shares.clone(), participants: validators.clone(), }, + emissions: EmissionsConfig { networks: key_shares, participants: validators.clone() }, signals: SignalsConfig::default(), babe: BabeConfig { authorities: validators.iter().map(|validator| ((*validator).into(), 1)).collect(), diff --git a/substrate/primitives/Cargo.toml b/substrate/primitives/Cargo.toml index 0e1e8f387..983b17855 100644 --- a/substrate/primitives/Cargo.toml +++ b/substrate/primitives/Cargo.toml @@ -28,6 +28,7 @@ sp-application-crypto = { git = "https://github.com/serai-dex/substrate", defaul sp-core = { git = "https://github.com/serai-dex/substrate", default-features = false } sp-runtime = { git = "https://github.com/serai-dex/substrate", default-features = false } sp-io = { git = "https://github.com/serai-dex/substrate", default-features = false } +sp-std = { git = "https://github.com/serai-dex/substrate", default-features = false } frame-support = { git = "https://github.com/serai-dex/substrate", default-features = false } @@ -35,7 +36,7 @@ frame-support = { git = "https://github.com/serai-dex/substrate", default-featur rand_core = { version = "0.6", default-features = false, features = ["getrandom"] } [features] -std = ["zeroize", "scale/std", "borsh?/std", "serde?/std", "scale-info/std", "sp-core/std", "sp-runtime/std", "frame-support/std"] +std = ["zeroize", "scale/std", "borsh?/std", "serde?/std", "scale-info/std", "sp-core/std", "sp-runtime/std", "sp-std/std", "frame-support/std"] borsh = ["dep:borsh"] serde = ["dep:serde"] default = ["std"] diff --git a/substrate/primitives/src/amount.rs b/substrate/primitives/src/amount.rs index 3953b4208..c82fe34d8 100644 --- a/substrate/primitives/src/amount.rs +++ b/substrate/primitives/src/amount.rs @@ -29,6 +29,8 @@ pub type SubstrateAmount = u64; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct Amount(pub SubstrateAmount); +// TODO: these impl shouldn't panic and return error to be dealt with. +// Otherwise we might have a panic that stops the network. impl Add for Amount { type Output = Amount; fn add(self, other: Amount) -> Amount { diff --git a/substrate/primitives/src/balance.rs b/substrate/primitives/src/balance.rs index 62182d43f..6743e6fa6 100644 --- a/substrate/primitives/src/balance.rs +++ b/substrate/primitives/src/balance.rs @@ -11,7 +11,7 @@ use serde::{Serialize, Deserialize}; use scale::{Encode, Decode, MaxEncodedLen}; use scale_info::TypeInfo; -use crate::{Coin, Amount}; +use crate::{Amount, Coin, ExternalCoin}; /// The type used for balances (a Coin and Balance). #[derive(Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)] @@ -23,6 +23,34 @@ pub struct Balance { pub amount: Amount, } +/// The type used for balances (a Coin and Balance). +#[derive(Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)] +#[cfg_attr(feature = "std", derive(Zeroize))] +#[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub struct ExternalBalance { + pub coin: ExternalCoin, + pub amount: Amount, +} + +impl From for Balance { + fn from(balance: ExternalBalance) -> Self { + Balance { coin: balance.coin.into(), amount: balance.amount } + } +} + +impl TryFrom for ExternalBalance { + type Error = (); + + fn try_from(balance: Balance) -> Result { + match balance.coin { + Coin::Serai => Err(())?, + Coin::External(coin) => Ok(ExternalBalance { coin, amount: balance.amount }), + } + } +} + +// TODO: these impl either should be removed or return errors in case of overflows impl Add for Balance { type Output = Balance; fn add(self, other: Amount) -> Balance { diff --git a/substrate/primitives/src/networks.rs b/substrate/primitives/src/networks.rs index 1213378c4..64cf7cc2e 100644 --- a/substrate/primitives/src/networks.rs +++ b/substrate/primitives/src/networks.rs @@ -1,7 +1,7 @@ #[cfg(feature = "std")] use zeroize::Zeroize; -use scale::{Encode, Decode, MaxEncodedLen}; +use scale::{Decode, Encode, EncodeLike, MaxEncodedLen}; use scale_info::TypeInfo; #[cfg(feature = "borsh")] @@ -10,54 +10,342 @@ use borsh::{BorshSerialize, BorshDeserialize}; use serde::{Serialize, Deserialize}; use sp_core::{ConstU32, bounded::BoundedVec}; +use sp_std::{vec, vec::Vec}; #[cfg(feature = "borsh")] use crate::{borsh_serialize_bounded_vec, borsh_deserialize_bounded_vec}; -/// The type used to identify networks. -#[derive( - Clone, Copy, PartialEq, Eq, Hash, Debug, Encode, Decode, PartialOrd, Ord, MaxEncodedLen, TypeInfo, -)] +/// The type used to identify external networks. +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord, TypeInfo)] #[cfg_attr(feature = "std", derive(Zeroize))] -#[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub enum NetworkId { - Serai, +pub enum ExternalNetworkId { Bitcoin, Ethereum, Monero, } -impl NetworkId { - pub fn coins(&self) -> &'static [Coin] { + +impl Encode for ExternalNetworkId { + fn encode(&self) -> Vec { match self { - Self::Serai => &[Coin::Serai], - Self::Bitcoin => &[Coin::Bitcoin], - Self::Ethereum => &[Coin::Ether, Coin::Dai], - Self::Monero => &[Coin::Monero], + ExternalNetworkId::Bitcoin => vec![1], + ExternalNetworkId::Ethereum => vec![2], + ExternalNetworkId::Monero => vec![3], } } } -pub const NETWORKS: [NetworkId; 4] = - [NetworkId::Serai, NetworkId::Bitcoin, NetworkId::Ethereum, NetworkId::Monero]; +impl Decode for ExternalNetworkId { + fn decode(input: &mut I) -> Result { + let kind = input.read_byte()?; + match kind { + 1 => Ok(Self::Bitcoin), + 2 => Ok(Self::Ethereum), + 3 => Ok(Self::Monero), + _ => Err(scale::Error::from("invalid format")), + } + } +} -pub const COINS: [Coin; 5] = [Coin::Serai, Coin::Bitcoin, Coin::Ether, Coin::Dai, Coin::Monero]; +impl MaxEncodedLen for ExternalNetworkId { + fn max_encoded_len() -> usize { + 1 + } +} -/// The type used to identify coins. -#[derive( - Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Encode, Decode, MaxEncodedLen, TypeInfo, -)] +impl EncodeLike for ExternalNetworkId {} + +#[cfg(feature = "borsh")] +impl BorshSerialize for ExternalNetworkId { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.encode()) + } +} + +#[cfg(feature = "borsh")] +impl BorshDeserialize for ExternalNetworkId { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut kind = [0; 1]; + reader.read_exact(&mut kind)?; + ExternalNetworkId::decode(&mut kind.as_slice()) + .map_err(|_| std::io::Error::other("invalid format")) + } +} + +/// The type used to identify networks. +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord, TypeInfo)] #[cfg_attr(feature = "std", derive(Zeroize))] -#[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub enum Coin { +pub enum NetworkId { Serai, + External(ExternalNetworkId), +} + +impl Encode for NetworkId { + fn encode(&self) -> Vec { + match self { + NetworkId::Serai => vec![0], + NetworkId::External(network) => network.encode(), + } + } +} + +impl Decode for NetworkId { + fn decode(input: &mut I) -> Result { + let kind = input.read_byte()?; + match kind { + 0 => Ok(Self::Serai), + _ => Ok(ExternalNetworkId::decode(&mut [kind].as_slice())?.into()), + } + } +} + +impl MaxEncodedLen for NetworkId { + fn max_encoded_len() -> usize { + 1 + } +} + +impl EncodeLike for NetworkId {} + +#[cfg(feature = "borsh")] +impl BorshSerialize for NetworkId { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.encode()) + } +} + +#[cfg(feature = "borsh")] +impl BorshDeserialize for NetworkId { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut kind = [0; 1]; + reader.read_exact(&mut kind)?; + NetworkId::decode(&mut kind.as_slice()).map_err(|_| std::io::Error::other("invalid format")) + } +} + +impl ExternalNetworkId { + pub fn coins(&self) -> Vec { + match self { + Self::Bitcoin => vec![ExternalCoin::Bitcoin], + Self::Ethereum => vec![ExternalCoin::Ether, ExternalCoin::Dai], + Self::Monero => vec![ExternalCoin::Monero], + } + } +} + +impl NetworkId { + pub fn coins(&self) -> Vec { + match self { + Self::Serai => vec![Coin::Serai], + Self::External(network) => { + network.coins().into_iter().map(core::convert::Into::into).collect() + } + } + } +} + +impl From for NetworkId { + fn from(network: ExternalNetworkId) -> Self { + NetworkId::External(network) + } +} + +impl TryFrom for ExternalNetworkId { + type Error = (); + + fn try_from(network: NetworkId) -> Result { + match network { + NetworkId::Serai => Err(())?, + NetworkId::External(n) => Ok(n), + } + } +} + +pub const EXTERNAL_NETWORKS: [ExternalNetworkId; 3] = + [ExternalNetworkId::Bitcoin, ExternalNetworkId::Ethereum, ExternalNetworkId::Monero]; + +pub const NETWORKS: [NetworkId; 4] = [ + NetworkId::Serai, + NetworkId::External(ExternalNetworkId::Bitcoin), + NetworkId::External(ExternalNetworkId::Ethereum), + NetworkId::External(ExternalNetworkId::Monero), +]; + +pub const EXTERNAL_COINS: [ExternalCoin; 4] = + [ExternalCoin::Bitcoin, ExternalCoin::Ether, ExternalCoin::Dai, ExternalCoin::Monero]; + +pub const COINS: [Coin; 5] = [ + Coin::Serai, + Coin::External(ExternalCoin::Bitcoin), + Coin::External(ExternalCoin::Ether), + Coin::External(ExternalCoin::Dai), + Coin::External(ExternalCoin::Monero), +]; + +/// The type used to identify external coins. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TypeInfo)] +#[cfg_attr(feature = "std", derive(Zeroize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub enum ExternalCoin { Bitcoin, Ether, Dai, Monero, } +impl Encode for ExternalCoin { + fn encode(&self) -> Vec { + match self { + ExternalCoin::Bitcoin => vec![4], + ExternalCoin::Ether => vec![5], + ExternalCoin::Dai => vec![6], + ExternalCoin::Monero => vec![7], + } + } +} + +impl Decode for ExternalCoin { + fn decode(input: &mut I) -> Result { + let kind = input.read_byte()?; + match kind { + 4 => Ok(Self::Bitcoin), + 5 => Ok(Self::Ether), + 6 => Ok(Self::Dai), + 7 => Ok(Self::Monero), + _ => Err(scale::Error::from("invalid format")), + } + } +} +impl MaxEncodedLen for ExternalCoin { + fn max_encoded_len() -> usize { + 1 + } +} + +impl EncodeLike for ExternalCoin {} + +#[cfg(feature = "borsh")] +impl BorshSerialize for ExternalCoin { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.encode()) + } +} + +#[cfg(feature = "borsh")] +impl BorshDeserialize for ExternalCoin { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut kind = [0; 1]; + reader.read_exact(&mut kind)?; + ExternalCoin::decode(&mut kind.as_slice()).map_err(|_| std::io::Error::other("invalid format")) + } +} + +/// The type used to identify coins. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TypeInfo)] +#[cfg_attr(feature = "std", derive(Zeroize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub enum Coin { + Serai, + External(ExternalCoin), +} + +impl Encode for Coin { + fn encode(&self) -> Vec { + match self { + Coin::Serai => vec![0], + Coin::External(ec) => ec.encode(), + } + } +} + +impl Decode for Coin { + fn decode(input: &mut I) -> Result { + let kind = input.read_byte()?; + match kind { + 0 => Ok(Self::Serai), + _ => Ok(ExternalCoin::decode(&mut [kind].as_slice())?.into()), + } + } +} + +impl MaxEncodedLen for Coin { + fn max_encoded_len() -> usize { + 1 + } +} + +impl EncodeLike for Coin {} + +#[cfg(feature = "borsh")] +impl BorshSerialize for Coin { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + writer.write_all(&self.encode()) + } +} + +#[cfg(feature = "borsh")] +impl BorshDeserialize for Coin { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + let mut kind = [0; 1]; + reader.read_exact(&mut kind)?; + Coin::decode(&mut kind.as_slice()).map_err(|_| std::io::Error::other("invalid format")) + } +} + +impl From for Coin { + fn from(coin: ExternalCoin) -> Self { + Coin::External(coin) + } +} + +impl TryFrom for ExternalCoin { + type Error = (); + + fn try_from(coin: Coin) -> Result { + match coin { + Coin::Serai => Err(())?, + Coin::External(c) => Ok(c), + } + } +} + +impl ExternalCoin { + pub fn network(&self) -> ExternalNetworkId { + match self { + ExternalCoin::Bitcoin => ExternalNetworkId::Bitcoin, + ExternalCoin::Ether | ExternalCoin::Dai => ExternalNetworkId::Ethereum, + ExternalCoin::Monero => ExternalNetworkId::Monero, + } + } + + pub fn name(&self) -> &'static str { + match self { + ExternalCoin::Bitcoin => "Bitcoin", + ExternalCoin::Ether => "Ether", + ExternalCoin::Dai => "Dai Stablecoin", + ExternalCoin::Monero => "Monero", + } + } + + pub fn symbol(&self) -> &'static str { + match self { + ExternalCoin::Bitcoin => "BTC", + ExternalCoin::Ether => "ETH", + ExternalCoin::Dai => "DAI", + ExternalCoin::Monero => "XMR", + } + } + + pub fn decimals(&self) -> u32 { + match self { + // Ether and DAI have 18 decimals, yet we only track 8 in order to fit them within u64s + ExternalCoin::Bitcoin | ExternalCoin::Ether | ExternalCoin::Dai => 8, + ExternalCoin::Monero => 12, + } + } +} + impl Coin { pub fn native() -> Coin { Coin::Serai @@ -66,37 +354,28 @@ impl Coin { pub fn network(&self) -> NetworkId { match self { Coin::Serai => NetworkId::Serai, - Coin::Bitcoin => NetworkId::Bitcoin, - Coin::Ether | Coin::Dai => NetworkId::Ethereum, - Coin::Monero => NetworkId::Monero, + Coin::External(c) => c.network().into(), } } pub fn name(&self) -> &'static str { match self { Coin::Serai => "Serai", - Coin::Bitcoin => "Bitcoin", - Coin::Ether => "Ether", - Coin::Dai => "Dai Stablecoin", - Coin::Monero => "Monero", + Coin::External(c) => c.name(), } } pub fn symbol(&self) -> &'static str { match self { Coin::Serai => "SRI", - Coin::Bitcoin => "BTC", - Coin::Ether => "ETH", - Coin::Dai => "DAI", - Coin::Monero => "XMR", + Coin::External(c) => c.symbol(), } } pub fn decimals(&self) -> u32 { match self { - // Ether and DAI have 18 decimals, yet we only track 8 in order to fit them within u64s - Coin::Serai | Coin::Bitcoin | Coin::Ether | Coin::Dai => 8, - Coin::Monero => 12, + Coin::Serai => 8, + Coin::External(c) => c.decimals(), } } diff --git a/substrate/runtime/src/lib.rs b/substrate/runtime/src/lib.rs index e55270cb9..151242712 100644 --- a/substrate/runtime/src/lib.rs +++ b/substrate/runtime/src/lib.rs @@ -53,8 +53,9 @@ use sp_runtime::{ #[allow(unused_imports)] use primitives::{ - NetworkId, PublicKey, AccountLookup, SubstrateAmount, Coin, NETWORKS, MEDIAN_PRICE_WINDOW_LENGTH, - HOURS, DAYS, MINUTES, TARGET_BLOCK_TIME, BLOCK_SIZE, FAST_EPOCH_DURATION, + NetworkId, PublicKey, AccountLookup, SubstrateAmount, Coin, EXTERNAL_NETWORKS, + MEDIAN_PRICE_WINDOW_LENGTH, HOURS, DAYS, MINUTES, TARGET_BLOCK_TIME, BLOCK_SIZE, + FAST_EPOCH_DURATION, }; use support::{ @@ -570,10 +571,7 @@ sp_api::impl_runtime_apis! { .map(|(id, _)| id.into_inner().0) .collect::>(); let mut all = serai_validators; - for network in NETWORKS { - if network == NetworkId::Serai { - continue; - } + for network in EXTERNAL_NETWORKS { // Returning the latest-decided, not latest and active, means the active set // may fail to peer find if there isn't sufficient overlap. If a large amount reboot, // forcing some validators to successfully peer find in order for the threshold to become @@ -581,7 +579,7 @@ sp_api::impl_runtime_apis! { // // This is assumed not to matter in real life, yet an interesting note. let participants = - ValidatorSets::participants_for_latest_decided_set(network) + ValidatorSets::participants_for_latest_decided_set(NetworkId::from(network)) .map_or(vec![], BoundedVec::into_inner); for (participant, _) in participants { all.insert(participant.0); @@ -610,25 +608,25 @@ sp_api::impl_runtime_apis! { impl dex::DexApi for Runtime { fn quote_price_exact_tokens_for_tokens( - asset1: Coin, - asset2: Coin, + coin1: Coin, + coin2: Coin, amount: SubstrateAmount, include_fee: bool ) -> Option { - Dex::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) + Dex::quote_price_exact_tokens_for_tokens(coin1, coin2, amount, include_fee) } fn quote_price_tokens_for_exact_tokens( - asset1: Coin, - asset2: Coin, + coin1: Coin, + coin2: Coin, amount: SubstrateAmount, include_fee: bool ) -> Option { - Dex::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) + Dex::quote_price_tokens_for_exact_tokens(coin1, coin2, amount, include_fee) } - fn get_reserves(asset1: Coin, asset2: Coin) -> Option<(SubstrateAmount, SubstrateAmount)> { - Dex::get_reserves(&asset1, &asset2).ok() + fn get_reserves(coin1: Coin, coin2: Coin) -> Option<(SubstrateAmount, SubstrateAmount)> { + Dex::get_reserves(&coin1, &coin2).ok() } } } diff --git a/substrate/signals/primitives/src/lib.rs b/substrate/signals/primitives/src/lib.rs index cfd8aac56..c7f0565ac 100644 --- a/substrate/signals/primitives/src/lib.rs +++ b/substrate/signals/primitives/src/lib.rs @@ -5,7 +5,7 @@ use scale::{Encode, Decode, MaxEncodedLen}; use scale_info::TypeInfo; -use serai_primitives::NetworkId; +use serai_primitives::ExternalNetworkId; #[derive(Clone, Copy, PartialEq, Eq, Debug, Encode, Decode, MaxEncodedLen, TypeInfo)] #[cfg_attr(feature = "std", derive(zeroize::Zeroize))] @@ -13,5 +13,5 @@ use serai_primitives::NetworkId; #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum SignalId { Retirement([u8; 32]), - Halt(NetworkId), + Halt(ExternalNetworkId), } diff --git a/substrate/validator-sets/pallet/src/lib.rs b/substrate/validator-sets/pallet/src/lib.rs index b5395660c..cf87abfe3 100644 --- a/substrate/validator-sets/pallet/src/lib.rs +++ b/substrate/validator-sets/pallet/src/lib.rs @@ -316,11 +316,13 @@ pub mod pallet { /// The generated key pair for a given validator set instance. #[pallet::storage] #[pallet::getter(fn keys)] - pub type Keys = StorageMap<_, Twox64Concat, ValidatorSet, KeyPair, OptionQuery>; + pub type Keys = + StorageMap<_, Twox64Concat, ExternalValidatorSet, KeyPair, OptionQuery>; /// The key for validator sets which can (and still need to) publish their slash reports. #[pallet::storage] - pub type PendingSlashReport = StorageMap<_, Identity, NetworkId, Public, OptionQuery>; + pub type PendingSlashReport = + StorageMap<_, Identity, ExternalNetworkId, Public, OptionQuery>; /// Disabled validators. #[pallet::storage] @@ -343,7 +345,7 @@ pub mod pallet { removed: T::AccountId, }, KeyGen { - set: ValidatorSet, + set: ExternalValidatorSet, key_pair: KeyPair, }, AcceptedHandover { @@ -600,14 +602,16 @@ pub mod pallet { amount: Amount, ) -> Result { // Check it's safe to decrease this set's stake by this amount - let new_total_staked = Self::total_allocated_stake(network) - .unwrap() - .0 - .checked_sub(amount.0) - .ok_or(Error::::NotEnoughAllocated)?; - let required_stake = Self::required_stake_for_network(network); - if new_total_staked < required_stake { - Err(Error::::DeallocationWouldRemoveEconomicSecurity)?; + if let NetworkId::External(n) = network { + let new_total_staked = Self::total_allocated_stake(NetworkId::from(n)) + .unwrap() + .0 + .checked_sub(amount.0) + .ok_or(Error::::NotEnoughAllocated)?; + let required_stake = Self::required_stake_for_network(n); + if new_total_staked < required_stake { + Err(Error::::DeallocationWouldRemoveEconomicSecurity)?; + } } let old_allocation = @@ -690,20 +694,23 @@ pub mod pallet { return false; } - // Handover is automatically complete for Serai as it doesn't have a handover protocol - if network == NetworkId::Serai { + let NetworkId::External(n) = network else { + // Handover is automatically complete for Serai as it doesn't have a handover protocol return true; - } + }; // The current session must have set keys for its handover to be completed - if !Keys::::contains_key(ValidatorSet { network, session }) { + if !Keys::::contains_key(ExternalValidatorSet { network: n, session }) { return false; } // This must be the first session (which has set keys) OR the prior session must have been // retired (signified by its keys no longer being present) (session.0 == 0) || - (!Keys::::contains_key(ValidatorSet { network, session: Session(session.0 - 1) })) + (!Keys::::contains_key(ExternalValidatorSet { + network: n, + session: Session(session.0 - 1), + })) } pub fn new_session() { @@ -733,19 +740,23 @@ pub mod pallet { // TODO: This is called retire_set, yet just starts retiring the set // Update the nomenclature within this function pub fn retire_set(set: ValidatorSet) { - // If the prior prior set didn't report, emit they're retired now - if PendingSlashReport::::get(set.network).is_some() { - Self::deposit_event(Event::SetRetired { - set: ValidatorSet { network: set.network, session: Session(set.session.0 - 1) }, - }); - } - // Serai doesn't set keys and network slashes are handled by BABE/GRANDPA - if set.network != NetworkId::Serai { + if let NetworkId::External(n) = set.network { + // If the prior prior set didn't report, emit they're retired now + if PendingSlashReport::::get(n).is_some() { + Self::deposit_event(Event::SetRetired { + set: ValidatorSet { network: set.network, session: Session(set.session.0 - 1) }, + }); + } + // This overwrites the prior value as the prior to-report set's stake presumably just // unlocked, making their report unenforceable - let keys = Keys::::take(set).unwrap(); - PendingSlashReport::::set(set.network, Some(keys.0)); + let keys = + Keys::::take(ExternalValidatorSet { network: n, session: set.session }).unwrap(); + PendingSlashReport::::set(n, Some(keys.0)); + } else { + // emit the event for serai network + Self::deposit_event(Event::SetRetired { set }); } // We're retiring this set because the set after it accepted the handover @@ -817,7 +828,7 @@ pub mod pallet { } /// Returns the required stake in terms SRI for a given `Balance`. - pub fn required_stake(balance: &Balance) -> SubstrateAmount { + pub fn required_stake(balance: &ExternalBalance) -> SubstrateAmount { use dex_pallet::HigherPrecisionBalance; // This is inclusive to an increase in accuracy @@ -840,11 +851,11 @@ pub mod pallet { } /// Returns the current total required stake for a given `network`. - pub fn required_stake_for_network(network: NetworkId) -> SubstrateAmount { + pub fn required_stake_for_network(network: ExternalNetworkId) -> SubstrateAmount { let mut total_required = 0; for coin in network.coins() { - let supply = Coins::::supply(coin); - total_required += Self::required_stake(&Balance { coin: *coin, amount: Amount(supply) }); + let supply = Coins::::supply(Coin::from(coin)); + total_required += Self::required_stake(&ExternalBalance { coin, amount: Amount(supply) }); } total_required } @@ -940,7 +951,7 @@ pub mod pallet { #[pallet::weight(0)] // TODO pub fn set_keys( origin: OriginFor, - network: NetworkId, + network: ExternalNetworkId, removed_participants: BoundedVec>, key_pair: KeyPair, signature: Signature, @@ -951,8 +962,8 @@ pub mod pallet { // (called by pre_dispatch) checks it let _ = signature; - let session = Self::session(network).unwrap(); - let set = ValidatorSet { network, session }; + let session = Self::session(NetworkId::from(network)).unwrap(); + let set = ExternalValidatorSet { network, session }; Keys::::set(set, Some(key_pair.clone())); @@ -960,7 +971,7 @@ pub mod pallet { // We generally set TotalAllocatedStake when the prior set retires, and the new set is fully // active and liable. Since this is the first set, there is no prior set to wait to retire if session == Session(0) { - Self::set_total_allocated_stake(network); + Self::set_total_allocated_stake(NetworkId::from(network)); } // This does not remove from TotalAllocatedStake or InSet in order to: @@ -970,7 +981,7 @@ pub mod pallet { // 2) Not allow parties removed to immediately deallocate, per commentary on deallocation // scheduling (https://github.com/serai-dex/serai/issues/394). for removed in removed_participants { - Self::deposit_event(Event::ParticipantRemoved { set, removed }); + Self::deposit_event(Event::ParticipantRemoved { set: set.into(), removed }); } Self::deposit_event(Event::KeyGen { set, key_pair }); @@ -981,7 +992,7 @@ pub mod pallet { #[pallet::weight(0)] // TODO pub fn report_slashes( origin: OriginFor, - network: NetworkId, + network: ExternalNetworkId, slashes: BoundedVec<(Public, u32), ConstU32<{ MAX_KEY_SHARES_PER_SET / 3 }>>, signature: Signature, ) -> DispatchResult { @@ -996,7 +1007,10 @@ pub mod pallet { // Emit set retireed Pallet::::deposit_event(Event::SetRetired { - set: ValidatorSet { network, session: Session(Self::session(network).unwrap().0 - 1) }, + set: ValidatorSet { + network: network.into(), + session: Session(Self::session(NetworkId::from(network)).unwrap().0 - 1), + }, }); Ok(()) @@ -1062,17 +1076,12 @@ pub mod pallet { Call::set_keys { network, ref removed_participants, ref key_pair, ref signature } => { let network = *network; - // Don't allow the Serai set to set_keys, as they have no reason to do so - if network == NetworkId::Serai { - Err(InvalidTransaction::Custom(0))?; - } - // Confirm this set has a session - let Some(current_session) = Self::session(network) else { + let Some(current_session) = Self::session(NetworkId::from(network)) else { Err(InvalidTransaction::Custom(1))? }; - let set = ValidatorSet { network, session: current_session }; + let set = ExternalValidatorSet { network, session: current_session }; // Confirm it has yet to set keys if Keys::::get(set).is_some() { @@ -1081,7 +1090,7 @@ pub mod pallet { // This is a needed precondition as this uses storage variables for the latest decided // session on this assumption - assert_eq!(Pallet::::latest_decided_session(network), Some(current_session)); + assert_eq!(Pallet::::latest_decided_session(network.into()), Some(current_session)); // This does not slash the removed participants as that'll be done at the end of the // set's lifetime @@ -1094,15 +1103,15 @@ pub mod pallet { removed.insert(participant.0); } - let participants = - Participants::::get(network).expect("session existed without participants"); + let participants = Participants::::get(NetworkId::from(network)) + .expect("session existed without participants"); let mut all_key_shares = 0; let mut signers = vec![]; let mut signing_key_shares = 0; for participant in participants { let participant = participant.0; - let shares = InSet::::get(network, participant) + let shares = InSet::::get(NetworkId::from(network), participant) .expect("participant from Participants wasn't InSet"); all_key_shares += shares; @@ -1124,7 +1133,7 @@ pub mod pallet { // Verify the signature with the MuSig key of the signers // We theoretically don't need set_keys_message to bind to removed_participants, as the // key we're signing with effectively already does so, yet there's no reason not to - if !musig_key(set, &signers) + if !musig_key(set.into(), &signers) .verify(&set_keys_message(&set, removed_participants, key_pair), signature) { Err(InvalidTransaction::BadProof)?; @@ -1138,17 +1147,16 @@ pub mod pallet { } Call::report_slashes { network, ref slashes, ref signature } => { let network = *network; - // Don't allow Serai to publish a slash report as BABE/GRANDPA handles slashes directly - if network == NetworkId::Serai { - Err(InvalidTransaction::Custom(0))?; - } let Some(key) = PendingSlashReport::::take(network) else { // Assumed already published Err(InvalidTransaction::Stale)? }; + // There must have been a previous session is PendingSlashReport is populated - let set = - ValidatorSet { network, session: Session(Self::session(network).unwrap().0 - 1) }; + let set = ExternalValidatorSet { + network, + session: Session(Self::session(NetworkId::from(network)).unwrap().0 - 1), + }; if !key.verify(&report_slashes_message(&set, slashes), signature) { Err(InvalidTransaction::BadProof)?; } @@ -1173,13 +1181,14 @@ pub mod pallet { } impl AllowMint for Pallet { - fn is_allowed(balance: &Balance) -> bool { + fn is_allowed(balance: &ExternalBalance) -> bool { // get the required stake let current_required = Self::required_stake_for_network(balance.coin.network()); let new_required = current_required + Self::required_stake(balance); // get the total stake for the network & compare. - let staked = Self::total_allocated_stake(balance.coin.network()).unwrap_or(Amount(0)); + let staked = + Self::total_allocated_stake(NetworkId::from(balance.coin.network())).unwrap_or(Amount(0)); staked.0 >= new_required } } diff --git a/substrate/validator-sets/primitives/src/lib.rs b/substrate/validator-sets/primitives/src/lib.rs index c900b0a99..9944d4852 100644 --- a/substrate/validator-sets/primitives/src/lib.rs +++ b/substrate/validator-sets/primitives/src/lib.rs @@ -17,7 +17,7 @@ use sp_core::{ConstU32, sr25519::Public, bounded::BoundedVec}; #[cfg(not(feature = "std"))] use sp_std::vec::Vec; -use serai_primitives::NetworkId; +use serai_primitives::{ExternalNetworkId, NetworkId}; /// The maximum amount of key shares per set. pub const MAX_KEY_SHARES_PER_SET: u32 = 150; @@ -43,6 +43,33 @@ pub struct ValidatorSet { pub network: NetworkId, } +/// The type used to identify a specific validator set during a specific session. +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(Zeroize))] +#[cfg_attr(feature = "borsh", derive(BorshSerialize, BorshDeserialize))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +pub struct ExternalValidatorSet { + pub session: Session, + pub network: ExternalNetworkId, +} + +impl From for ValidatorSet { + fn from(set: ExternalValidatorSet) -> Self { + ValidatorSet { session: set.session, network: set.network.into() } + } +} + +impl TryFrom for ExternalValidatorSet { + type Error = (); + + fn try_from(set: ValidatorSet) -> Result { + match set.network { + NetworkId::Serai => Err(())?, + NetworkId::External(network) => Ok(ExternalValidatorSet { session: set.session, network }), + } + } +} + type MaxKeyLen = ConstU32; /// The type representing a Key from an external network. pub type ExternalKey = BoundedVec; @@ -100,14 +127,14 @@ pub fn musig_key(set: ValidatorSet, set_keys: &[Public]) -> Public { /// The message for the set_keys signature. pub fn set_keys_message( - set: &ValidatorSet, + set: &ExternalValidatorSet, removed_participants: &[Public], key_pair: &KeyPair, ) -> Vec { (b"ValidatorSets-set_keys", set, removed_participants, key_pair).encode() } -pub fn report_slashes_message(set: &ValidatorSet, slashes: &[(Public, u32)]) -> Vec { +pub fn report_slashes_message(set: &ExternalValidatorSet, slashes: &[(Public, u32)]) -> Vec { (b"ValidatorSets-report_slashes", set, slashes).encode() } diff --git a/tests/coordinator/src/lib.rs b/tests/coordinator/src/lib.rs index c364128ca..a1efcf41c 100644 --- a/tests/coordinator/src/lib.rs +++ b/tests/coordinator/src/lib.rs @@ -19,7 +19,7 @@ use ciphersuite::{ Ciphersuite, Ristretto, }; -use serai_client::primitives::NetworkId; +use serai_client::primitives::ExternalNetworkId; use messages::{ coordinator::{SubstrateSignableId, SubstrateSignId, cosign_block_msg}, @@ -108,7 +108,7 @@ pub struct Handles { } pub struct Processor { - network: NetworkId, + network: ExternalNetworkId, serai_rpc: String, #[allow(unused)] @@ -132,7 +132,7 @@ impl Drop for Processor { impl Processor { pub async fn new( raw_i: u8, - network: NetworkId, + network: ExternalNetworkId, ops: &DockerOperations, handles: Handles, processor_key: ::F, diff --git a/tests/coordinator/src/tests/batch.rs b/tests/coordinator/src/tests/batch.rs index bfe4e36eb..4fb5e8583 100644 --- a/tests/coordinator/src/tests/batch.rs +++ b/tests/coordinator/src/tests/batch.rs @@ -16,7 +16,7 @@ use dkg::Participant; use scale::Encode; use serai_client::{ - primitives::{NetworkId, BlockHash, Signature}, + primitives::{BlockHash, Signature}, in_instructions::{ primitives::{Batch, SignedBatch, batch_message}, InInstructionsEvent, @@ -274,7 +274,7 @@ async fn batch_test() { Session(0), &substrate_key, Batch { - network: NetworkId::Bitcoin, + network: ExternalNetworkId::Bitcoin, id: 0, block: BlockHash([0x22; 32]), instructions: vec![], diff --git a/tests/coordinator/src/tests/key_gen.rs b/tests/coordinator/src/tests/key_gen.rs index 8ea14cbc0..66aa9f5bb 100644 --- a/tests/coordinator/src/tests/key_gen.rs +++ b/tests/coordinator/src/tests/key_gen.rs @@ -13,9 +13,8 @@ use ciphersuite::{ use dkg::ThresholdParams; use serai_client::{ - primitives::NetworkId, + validator_sets::primitives::{ExternalValidatorSet, KeyPair, Session}, Public, - validator_sets::primitives::{Session, ValidatorSet, KeyPair}, }; use messages::{key_gen::KeyGenId, CoordinatorMessage}; @@ -28,7 +27,7 @@ pub async fn key_gen( let coordinators = processors.len(); let mut participant_is = vec![]; - let set = ValidatorSet { session, network: NetworkId::Bitcoin }; + let set = ExternalValidatorSet { session, network: ExternalNetworkId::Bitcoin }; let id = KeyGenId { session: set.session, attempt: 0 }; for (i, processor) in processors.iter_mut().enumerate() { diff --git a/tests/coordinator/src/tests/mod.rs b/tests/coordinator/src/tests/mod.rs index ef67b0ac5..a488d01ad 100644 --- a/tests/coordinator/src/tests/mod.rs +++ b/tests/coordinator/src/tests/mod.rs @@ -104,7 +104,7 @@ pub(crate) async fn new_test(test_body: impl TestBody, fast_epoch: bool) { handles.insert(name, handle); } - let processor_key = message_queue_keys[&NetworkId::Bitcoin]; + let processor_key = message_queue_keys[&ExternalNetworkId::Bitcoin]; coordinators.push(( Handles { @@ -198,7 +198,7 @@ pub(crate) async fn new_test(test_body: impl TestBody, fast_epoch: bool) { processors.push( Processor::new( i.try_into().unwrap(), - NetworkId::Bitcoin, + ExternalNetworkId::Bitcoin, &outer_ops, handles.clone(), *key, diff --git a/tests/coordinator/src/tests/rotation.rs b/tests/coordinator/src/tests/rotation.rs index 1ebeec16a..c3659a9e2 100644 --- a/tests/coordinator/src/tests/rotation.rs +++ b/tests/coordinator/src/tests/rotation.rs @@ -132,13 +132,13 @@ async fn set_rotation_test() { // excluded participant let pair5 = insecure_pair_from_name("Eve"); - let network = NetworkId::Bitcoin; + let network = ExternalNetworkId::Bitcoin; let amount = Amount(1_000_000 * 10_u64.pow(8)); let serai = processors[0].serai().await; // allocate now for the last participant so that it is guaranteed to be included into session // 1 set. This doesn't affect the genesis set at all since that is a predetermined set. - allocate_stake(&serai, network, amount, &pair5, 0).await; + allocate_stake(&serai, network.into(), amount, &pair5, 0).await; // genesis keygen let _ = key_gen::(&mut processors, Session(0)).await; @@ -151,12 +151,14 @@ async fn set_rotation_test() { } // wait until next session to see the effect on coordinator - wait_till_session_1(&serai, network).await; + wait_till_session_1(&serai, network.into()).await; // Ensure the new validator was included in the new set assert_eq!( - most_recent_new_set_event(&serai, network).await, - ValidatorSetsEvent::NewSet { set: ValidatorSet { session: Session(1), network } }, + most_recent_new_set_event(&serai, network.into()).await, + ValidatorSetsEvent::NewSet { + set: ValidatorSet { session: Session(1), network: network.into() } + }, ); // add the last participant & do the keygen diff --git a/tests/coordinator/src/tests/sign.rs b/tests/coordinator/src/tests/sign.rs index db8a72034..f6fdb6e6e 100644 --- a/tests/coordinator/src/tests/sign.rs +++ b/tests/coordinator/src/tests/sign.rs @@ -10,18 +10,17 @@ use ciphersuite::Secp256k1; use dkg::Participant; use serai_client::{ - PairTrait, - primitives::{ - NetworkId, Coin, Amount, Balance, BlockHash, SeraiAddress, ExternalAddress, - insecure_pair_from_name, - }, coins::{ primitives::{OutInstruction, OutInstructionWithBalance}, CoinsEvent, }, - in_instructions::primitives::{InInstruction, InInstructionWithBalance, Batch}, + in_instructions::primitives::{Batch, InInstruction, InInstructionWithBalance}, + primitives::{ + insecure_pair_from_name, Amount, Balance, BlockHash, Coin, ExternalAddress, ExternalBalance, + ExternalCoin, SeraiAddress, + }, validator_sets::primitives::Session, - SeraiCoins, + PairTrait, SeraiCoins, }; use messages::{coordinator::PlanMeta, sign::SignId, SubstrateContext, CoordinatorMessage}; @@ -202,7 +201,7 @@ async fn sign_test() { #[allow(clippy::inconsistent_digit_grouping)] let amount = Amount(1_000_000_00); - let balance = Balance { coin: Coin::Bitcoin, amount }; + let balance = ExternalBalance { coin: ExternalCoin::Bitcoin, amount }; let coin_block = BlockHash([0x33; 32]); let block_included_in = batch( @@ -211,7 +210,7 @@ async fn sign_test() { Session(0), &substrate_key, Batch { - network: NetworkId::Bitcoin, + network: balance.coin.network(), id: 0, block: coin_block, instructions: vec![InInstructionWithBalance { @@ -236,10 +235,13 @@ async fn sign_test() { // Verify the mint occurred as expected assert_eq!( serai.mint_events().await.unwrap(), - vec![CoinsEvent::Mint { to: serai_addr, balance }] + vec![CoinsEvent::Mint { to: serai_addr, balance: balance.into() }] + ); + assert_eq!(serai.coin_supply(ExternalCoin::Bitcoin.into()).await.unwrap(), amount); + assert_eq!( + serai.coin_balance(ExternalCoin::Bitcoin.into(), serai_addr).await.unwrap(), + amount ); - assert_eq!(serai.coin_supply(Coin::Bitcoin).await.unwrap(), amount); - assert_eq!(serai.coin_balance(Coin::Bitcoin, serai_addr).await.unwrap(), amount); } // Trigger a burn @@ -296,8 +298,11 @@ async fn sign_test() { let last_serai_block_hash = last_serai_block.hash(); let serai = serai.as_of(last_serai_block_hash); let serai = serai.coins(); - assert_eq!(serai.coin_supply(Coin::Bitcoin).await.unwrap(), Amount(0)); - assert_eq!(serai.coin_balance(Coin::Bitcoin, serai_addr).await.unwrap(), Amount(0)); + assert_eq!(serai.coin_supply(ExternalCoin::Bitcoin.into()).await.unwrap(), Amount(0)); + assert_eq!( + serai.coin_balance(ExternalCoin::Bitcoin.into(), serai_addr).await.unwrap(), + Amount(0) + ); let mut plan_id = [0; 32]; OsRng.fill_bytes(&mut plan_id); diff --git a/tests/full-stack/src/tests/mint_and_burn.rs b/tests/full-stack/src/tests/mint_and_burn.rs index ce19808fd..26ffb442c 100644 --- a/tests/full-stack/src/tests/mint_and_burn.rs +++ b/tests/full-stack/src/tests/mint_and_burn.rs @@ -9,12 +9,13 @@ use rand_core::{RngCore, OsRng}; use scale::Encode; use serai_client::{ + coins::primitives::{OutInstruction, OutInstructionWithBalance}, + in_instructions::primitives::Shorthand, primitives::{ - NetworkId, Coin, Amount, Balance, SeraiAddress, ExternalAddress, insecure_pair_from_name, + insecure_pair_from_name, Amount, Balance, Coin, ExternalAddress, ExternalBalance, ExternalCoin, + SeraiAddress, }, - validator_sets::primitives::{Session, ValidatorSet}, - in_instructions::primitives::Shorthand, - coins::primitives::{OutInstruction, OutInstructionWithBalance}, + validator_sets::primitives::{ExternalValidatorSet, Session}, PairTrait, SeraiCoins, }; @@ -199,7 +200,7 @@ async fn mint_and_burn_test() { .await .unwrap() .validator_sets() - .keys(ValidatorSet { network, session: Session(0) }) + .keys(ExternalValidatorSet { network, session: Session(0) }) .await .unwrap() { @@ -224,7 +225,10 @@ async fn mint_and_burn_test() { } }; - (key_pair(false, NetworkId::Bitcoin).await, key_pair(true, NetworkId::Monero).await) + ( + key_pair(false, ExternalNetworkId::Bitcoin).await, + key_pair(true, ExternalNetworkId::Monero).await, + ) }; // Because the initial keys only become active when the network's time matches the Serai @@ -439,8 +443,8 @@ async fn mint_and_burn_test() { ); } }; - wait_for_batch(false, NetworkId::Bitcoin).await; - wait_for_batch(true, NetworkId::Monero).await; + wait_for_batch(false, ExternalNetworkId::Bitcoin).await; + wait_for_batch(true, ExternalNetworkId::Monero).await; } // TODO: Verify the mints @@ -492,7 +496,7 @@ async fn mint_and_burn_test() { let serai_pair = &serai_pair; move |nonce, coin, amount, address| async move { let out_instruction = OutInstructionWithBalance { - balance: Balance { coin, amount: Amount(amount) }, + balance: ExternalBalance { coin, amount: Amount(amount) }, instruction: OutInstruction { address, data: None }, }; @@ -511,7 +515,7 @@ async fn mint_and_burn_test() { #[allow(clippy::inconsistent_digit_grouping)] burn( 0, - Coin::Bitcoin, + ExternalCoin::Bitcoin, 1_000_000_00, ExternalAddress::new( serai_client::networks::bitcoin::Address::new(bitcoin_addr.clone()).unwrap().into(), @@ -522,7 +526,7 @@ async fn mint_and_burn_test() { burn( 1, - Coin::Monero, + ExternalCoin::Monero, 1_000_000_000_000, ExternalAddress::new( serai_client::networks::monero::Address::new(monero_addr).unwrap().into(), diff --git a/tests/full-stack/src/tests/mod.rs b/tests/full-stack/src/tests/mod.rs index 7d92070ef..b82ff177e 100644 --- a/tests/full-stack/src/tests/mod.rs +++ b/tests/full-stack/src/tests/mod.rs @@ -3,7 +3,7 @@ use std::{sync::OnceLock, collections::HashMap}; use tokio::sync::Mutex; -use serai_client::primitives::NetworkId; +use serai_client::primitives::ExternalNetworkId; use dockertest::{ LogAction, LogPolicy, LogSource, LogOptions, StartPolicy, TestBodySpecification, @@ -56,15 +56,21 @@ pub(crate) async fn new_test(test_body: impl TestBody) { let (coord_key, message_queue_keys, message_queue_composition) = message_queue_instance(); - let (bitcoin_composition, bitcoin_port) = network_instance(NetworkId::Bitcoin); - let mut bitcoin_processor_composition = - processor_instance(NetworkId::Bitcoin, bitcoin_port, message_queue_keys[&NetworkId::Bitcoin]); + let (bitcoin_composition, bitcoin_port) = network_instance(ExternalNetworkId::Bitcoin); + let mut bitcoin_processor_composition = processor_instance( + ExternalNetworkId::Bitcoin, + bitcoin_port, + message_queue_keys[&ExternalNetworkId::Bitcoin], + ); assert_eq!(bitcoin_processor_composition.len(), 1); let bitcoin_processor_composition = bitcoin_processor_composition.swap_remove(0); - let (monero_composition, monero_port) = network_instance(NetworkId::Monero); - let mut monero_processor_composition = - processor_instance(NetworkId::Monero, monero_port, message_queue_keys[&NetworkId::Monero]); + let (monero_composition, monero_port) = network_instance(ExternalNetworkId::Monero); + let mut monero_processor_composition = processor_instance( + ExternalNetworkId::Monero, + monero_port, + message_queue_keys[&ExternalNetworkId::Monero], + ); assert_eq!(monero_processor_composition.len(), 1); let monero_processor_composition = monero_processor_composition.swap_remove(0); diff --git a/tests/message-queue/src/lib.rs b/tests/message-queue/src/lib.rs index e2bfd3a75..d59273d95 100644 --- a/tests/message-queue/src/lib.rs +++ b/tests/message-queue/src/lib.rs @@ -7,23 +7,25 @@ use ciphersuite::{ Ciphersuite, Ristretto, }; -use serai_primitives::NetworkId; +use serai_primitives::{ExternalNetworkId, EXTERNAL_NETWORKS}; use dockertest::{ PullPolicy, Image, LogAction, LogPolicy, LogSource, LogOptions, TestBodySpecification, }; pub type MessageQueuePrivateKey = ::F; -pub fn instance( -) -> (MessageQueuePrivateKey, HashMap, TestBodySpecification) { +pub fn instance() -> ( + MessageQueuePrivateKey, + HashMap, + TestBodySpecification, +) { serai_docker_tests::build("message-queue".to_string()); let coord_key = ::F::random(&mut OsRng); - let priv_keys = HashMap::from([ - (NetworkId::Bitcoin, ::F::random(&mut OsRng)), - (NetworkId::Ethereum, ::F::random(&mut OsRng)), - (NetworkId::Monero, ::F::random(&mut OsRng)), - ]); + let priv_keys = EXTERNAL_NETWORKS + .into_iter() + .map(|n| (n, ::F::random(&mut OsRng))) + .collect::>(); let composition = TestBodySpecification::with_image( Image::with_repository("serai-dev-message-queue").pull_policy(PullPolicy::Never), @@ -38,15 +40,15 @@ pub fn instance( ("COORDINATOR_KEY".to_string(), hex::encode((Ristretto::generator() * coord_key).to_bytes())), ( "BITCOIN_KEY".to_string(), - hex::encode((Ristretto::generator() * priv_keys[&NetworkId::Bitcoin]).to_bytes()), + hex::encode((Ristretto::generator() * priv_keys[&ExternalNetworkId::Bitcoin]).to_bytes()), ), ( "ETHEREUM_KEY".to_string(), - hex::encode((Ristretto::generator() * priv_keys[&NetworkId::Ethereum]).to_bytes()), + hex::encode((Ristretto::generator() * priv_keys[&ExternalNetworkId::Ethereum]).to_bytes()), ), ( "MONERO_KEY".to_string(), - hex::encode((Ristretto::generator() * priv_keys[&NetworkId::Monero]).to_bytes()), + hex::encode((Ristretto::generator() * priv_keys[&ExternalNetworkId::Monero]).to_bytes()), ), ("DB_PATH".to_string(), "./message-queue-db".to_string()), ("RUST_LOG".to_string(), "serai_message_queue=trace,".to_string()), @@ -85,7 +87,7 @@ fn basic_functionality() { .queue( Metadata { from: Service::Coordinator, - to: Service::Processor(NetworkId::Bitcoin), + to: Service::Processor(ExternalNetworkId::Bitcoin), intent: b"intent".to_vec(), }, b"Hello, World!".to_vec(), @@ -98,7 +100,7 @@ fn basic_functionality() { .queue( Metadata { from: Service::Coordinator, - to: Service::Processor(NetworkId::Bitcoin), + to: Service::Processor(ExternalNetworkId::Bitcoin), intent: b"intent 2".to_vec(), }, b"Hello, World, again!".to_vec(), @@ -108,9 +110,9 @@ fn basic_functionality() { // Successfully get it let bitcoin = MessageQueue::new( - Service::Processor(NetworkId::Bitcoin), + Service::Processor(ExternalNetworkId::Bitcoin), rpc.clone(), - Zeroizing::new(priv_keys[&NetworkId::Bitcoin]), + Zeroizing::new(priv_keys[&ExternalNetworkId::Bitcoin]), ); let msg = bitcoin.next(Service::Coordinator).await; assert_eq!(msg.from, Service::Coordinator); @@ -140,7 +142,7 @@ fn basic_functionality() { .queue( Metadata { from: Service::Coordinator, - to: Service::Processor(NetworkId::Monero), + to: Service::Processor(ExternalNetworkId::Monero), // Intents should be per-from-to, making this valid intent: b"intent".to_vec(), }, @@ -149,9 +151,9 @@ fn basic_functionality() { .await; let monero = MessageQueue::new( - Service::Processor(NetworkId::Monero), + Service::Processor(ExternalNetworkId::Monero), rpc, - Zeroizing::new(priv_keys[&NetworkId::Monero]), + Zeroizing::new(priv_keys[&ExternalNetworkId::Monero]), ); assert_eq!(monero.next(Service::Coordinator).await.id, 0); monero.ack(Service::Coordinator, 0).await; diff --git a/tests/no-std/Cargo.toml b/tests/no-std/Cargo.toml index 5023a80e4..16ca5d246 100644 --- a/tests/no-std/Cargo.toml +++ b/tests/no-std/Cargo.toml @@ -35,4 +35,4 @@ dkg = { path = "../../crypto/dkg", default-features = false } bitcoin-serai = { path = "../../networks/bitcoin", default-features = false, features = ["hazmat"] } -monero-wallet-util = { path = "../../networks/monero/wallet/util", default-features = false, features = ["compile-time-generators"] } +monero-wallet = { path = "../../networks/monero/wallet", default-features = false, features = ["compile-time-generators"] } diff --git a/tests/no-std/src/lib.rs b/tests/no-std/src/lib.rs index fa9da268b..f18240509 100644 --- a/tests/no-std/src/lib.rs +++ b/tests/no-std/src/lib.rs @@ -20,4 +20,4 @@ pub use frost_schnorrkel; pub use bitcoin_serai; -pub use monero_wallet_util; +pub use monero_wallet; diff --git a/tests/processor/src/lib.rs b/tests/processor/src/lib.rs index ec607a551..571916fd4 100644 --- a/tests/processor/src/lib.rs +++ b/tests/processor/src/lib.rs @@ -7,7 +7,7 @@ use rand_core::{RngCore, OsRng}; use ciphersuite::{group::ff::PrimeField, Ciphersuite, Ristretto}; -use serai_client::primitives::NetworkId; +use serai_client::primitives::ExternalNetworkId; use messages::{ProcessorMessage, CoordinatorMessage}; use serai_message_queue::{Service, Metadata, client::MessageQueue}; @@ -25,7 +25,7 @@ mod tests; static UNIQUE_ID: OnceLock> = OnceLock::new(); pub fn processor_instance( - network: NetworkId, + network: ExternalNetworkId, port: u32, message_queue_key: ::F, ) -> Vec { @@ -33,10 +33,9 @@ pub fn processor_instance( OsRng.fill_bytes(&mut entropy); let network_str = match network { - NetworkId::Serai => panic!("starting a processor for Serai"), - NetworkId::Bitcoin => "bitcoin", - NetworkId::Ethereum => "ethereum", - NetworkId::Monero => "monero", + ExternalNetworkId::Bitcoin => "bitcoin", + ExternalNetworkId::Ethereum => "ethereum", + ExternalNetworkId::Monero => "monero", }; let image = format!("{network_str}-processor"); serai_docker_tests::build(image.clone()); @@ -57,7 +56,7 @@ pub fn processor_instance( .into(), )]; - if network == NetworkId::Ethereum { + if network == ExternalNetworkId::Ethereum { serai_docker_tests::build("ethereum-relayer".to_string()); res.push( TestBodySpecification::with_image( @@ -80,7 +79,7 @@ pub fn processor_instance( pub type Handles = (String, String, String, String); pub fn processor_stack( - network: NetworkId, + network: ExternalNetworkId, network_hostname_override: Option, ) -> (Handles, ::F, Vec) { let (network_composition, network_rpc_port) = network_instance(network); @@ -106,10 +105,9 @@ pub fn processor_stack( for (name, composition) in [ Some(( match network { - NetworkId::Serai => unreachable!(), - NetworkId::Bitcoin => "bitcoin", - NetworkId::Ethereum => "ethereum", - NetworkId::Monero => "monero", + ExternalNetworkId::Bitcoin => "bitcoin", + ExternalNetworkId::Ethereum => "ethereum", + ExternalNetworkId::Monero => "monero", }, network_composition, )), @@ -161,7 +159,7 @@ pub fn processor_stack( } pub struct Coordinator { - network: NetworkId, + network: ExternalNetworkId, network_handle: String, #[allow(unused)] @@ -177,7 +175,7 @@ pub struct Coordinator { impl Coordinator { pub fn new( - network: NetworkId, + network: ExternalNetworkId, ops: &DockerOperations, handles: Handles, coord_key: ::F, @@ -213,7 +211,7 @@ impl Coordinator { let mut iters = 0; while iters < 60 { match network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::rpc::Rpc; // Bitcoin's Rpc::new will test the connection @@ -221,7 +219,7 @@ impl Coordinator { break; } } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { use std::sync::Arc; use ethereum_serai::{ alloy::{ @@ -270,7 +268,7 @@ impl Coordinator { break; } } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::rpc::Rpc; @@ -284,7 +282,6 @@ impl Coordinator { break; } } - NetworkId::Serai => panic!("processor is booting with external network of Serai"), } println!("external network RPC has yet to boot, waiting 1 sec, attempt {iters}"); @@ -337,7 +334,7 @@ impl Coordinator { pub async fn add_block(&self, ops: &DockerOperations) -> ([u8; 32], Vec) { let rpc_url = network_rpc(self.network, ops, &self.network_handle); match self.network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::{ bitcoin::{consensus::Encodable, network::Network, Script, Address}, rpc::Rpc, @@ -360,7 +357,7 @@ impl Coordinator { block.consensus_encode(&mut block_buf).unwrap(); (hash, block_buf) } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { use ethereum_serai::alloy::{ simple_request_transport::SimpleRequest, rpc_types::{BlockTransactionsKind, BlockNumberOrTag}, @@ -397,7 +394,7 @@ impl Coordinator { .into_bytes(); (hash.into(), state) } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use curve25519_dalek::{constants::ED25519_BASEPOINT_POINT, scalar::Scalar}; use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::{rpc::Rpc, address::Network, ViewPair}; @@ -415,14 +412,13 @@ impl Coordinator { let hash = rpc.get_block_hash(rpc.get_height().await.unwrap() - 1).await.unwrap(); (hash, rpc.get_block(hash).await.unwrap().serialize()) } - NetworkId::Serai => panic!("processor tests adding block to Serai"), } } pub async fn sync(&self, ops: &DockerOperations, others: &[Coordinator]) { let rpc_url = network_rpc(self.network, ops, &self.network_handle); match self.network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::{bitcoin::consensus::Encodable, rpc::Rpc}; let rpc = Rpc::new(rpc_url).await.expect("couldn't connect to the Bitcoin RPC"); @@ -452,7 +448,7 @@ impl Coordinator { } } } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { use ethereum_serai::alloy::{ simple_request_transport::SimpleRequest, rpc_types::{BlockTransactionsKind, BlockNumberOrTag}, @@ -503,7 +499,7 @@ impl Coordinator { //assert_eq!(expected_number, new_number); } } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::rpc::Rpc; @@ -534,14 +530,13 @@ impl Coordinator { } } } - NetworkId::Serai => panic!("processors tests syncing Serai nodes"), } } pub async fn publish_transaction(&self, ops: &DockerOperations, tx: &[u8]) { let rpc_url = network_rpc(self.network, ops, &self.network_handle); match self.network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::{ bitcoin::{consensus::Decodable, Transaction}, rpc::Rpc, @@ -551,7 +546,7 @@ impl Coordinator { Rpc::new(rpc_url).await.expect("couldn't connect to the coordinator's Bitcoin RPC"); rpc.send_raw_transaction(&Transaction::consensus_decode(&mut &*tx).unwrap()).await.unwrap(); } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { use ethereum_serai::alloy::{ simple_request_transport::SimpleRequest, rpc_client::ClientBuilder, @@ -564,7 +559,7 @@ impl Coordinator { ); let _ = provider.send_raw_transaction(tx).await.unwrap(); } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::{transaction::Transaction, rpc::Rpc}; @@ -573,15 +568,15 @@ impl Coordinator { .expect("couldn't connect to the coordinator's Monero RPC"); rpc.publish_transaction(&Transaction::read(&mut &*tx).unwrap()).await.unwrap(); } - NetworkId::Serai => panic!("processor tests broadcasting block to Serai"), } } pub async fn publish_eventuality_completion(&self, ops: &DockerOperations, tx: &[u8]) { match self.network { - NetworkId::Bitcoin | NetworkId::Monero => self.publish_transaction(ops, tx).await, - NetworkId::Ethereum => (), - NetworkId::Serai => panic!("processor tests broadcasting block to Serai"), + ExternalNetworkId::Bitcoin | ExternalNetworkId::Monero => { + self.publish_transaction(ops, tx).await + } + ExternalNetworkId::Ethereum => (), } } @@ -592,7 +587,7 @@ impl Coordinator { ) -> Option> { let rpc_url = network_rpc(self.network, ops, &self.network_handle); match self.network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::{bitcoin::consensus::Encodable, rpc::Rpc}; let rpc = @@ -614,7 +609,7 @@ impl Coordinator { None } } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { /* let provider = RootProvider::<_, Ethereum>::new( ClientBuilder::default().transport(SimpleRequest::new(rpc_url.clone()), true), @@ -664,7 +659,7 @@ impl Coordinator { None } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::rpc::Rpc; @@ -679,7 +674,6 @@ impl Coordinator { None } } - NetworkId::Serai => panic!("processor tests broadcasting block to Serai"), } } } diff --git a/tests/processor/src/networks.rs b/tests/processor/src/networks.rs index 32563c9fe..f2cc4e862 100644 --- a/tests/processor/src/networks.rs +++ b/tests/processor/src/networks.rs @@ -4,9 +4,9 @@ use rand_core::{RngCore, OsRng}; use scale::Encode; use serai_client::{ - primitives::{Amount, NetworkId, Coin, Balance, ExternalAddress}, - validator_sets::primitives::ExternalKey, in_instructions::primitives::{InInstruction, RefundableInInstruction, Shorthand}, + primitives::{Amount, ExternalAddress, ExternalBalance, ExternalCoin, ExternalNetworkId}, + validator_sets::primitives::ExternalKey, }; use dockertest::{PullPolicy, Image, StartPolicy, TestBodySpecification, DockerOperations}; @@ -52,37 +52,32 @@ pub fn monero_instance() -> (TestBodySpecification, u32) { (composition, XMR_PORT) } -pub fn network_instance(network: NetworkId) -> (TestBodySpecification, u32) { +pub fn network_instance(network: ExternalNetworkId) -> (TestBodySpecification, u32) { match network { - NetworkId::Bitcoin => bitcoin_instance(), - NetworkId::Ethereum => ethereum_instance(), - NetworkId::Monero => monero_instance(), - NetworkId::Serai => { - panic!("Serai is not a valid network to spawn an instance of for a processor") - } + ExternalNetworkId::Bitcoin => bitcoin_instance(), + ExternalNetworkId::Ethereum => ethereum_instance(), + ExternalNetworkId::Monero => monero_instance(), } } -pub fn network_rpc(network: NetworkId, ops: &DockerOperations, handle: &str) -> String { +pub fn network_rpc(network: ExternalNetworkId, ops: &DockerOperations, handle: &str) -> String { let (ip, port) = ops .handle(handle) .host_port(match network { - NetworkId::Bitcoin => BTC_PORT, - NetworkId::Ethereum => ETH_PORT, - NetworkId::Monero => XMR_PORT, - NetworkId::Serai => panic!("getting port for external network yet it was Serai"), + ExternalNetworkId::Bitcoin => BTC_PORT, + ExternalNetworkId::Ethereum => ETH_PORT, + ExternalNetworkId::Monero => XMR_PORT, }) .unwrap(); format!("http://{RPC_USER}:{RPC_PASS}@{ip}:{port}") } -pub fn confirmations(network: NetworkId) -> usize { +pub fn confirmations(network: ExternalNetworkId) -> usize { use processor::networks::*; match network { - NetworkId::Bitcoin => Bitcoin::CONFIRMATIONS, - NetworkId::Ethereum => Ethereum::::CONFIRMATIONS, - NetworkId::Monero => Monero::CONFIRMATIONS, - NetworkId::Serai => panic!("getting confirmations required for Serai"), + ExternalNetworkId::Bitcoin => Bitcoin::CONFIRMATIONS, + ExternalNetworkId::Ethereum => Ethereum::::CONFIRMATIONS, + ExternalNetworkId::Monero => Monero::CONFIRMATIONS, } } @@ -108,11 +103,11 @@ pub enum Wallet { // TODO: Merge these functions with the processor's tests, which offers very similar functionality impl Wallet { - pub async fn new(network: NetworkId, ops: &DockerOperations, handle: String) -> Wallet { + pub async fn new(network: ExternalNetworkId, ops: &DockerOperations, handle: String) -> Wallet { let rpc_url = network_rpc(network, ops, &handle); match network { - NetworkId::Bitcoin => { + ExternalNetworkId::Bitcoin => { use bitcoin_serai::{ bitcoin::{ secp256k1::{SECP256K1, SecretKey}, @@ -153,7 +148,7 @@ impl Wallet { Wallet::Bitcoin { private_key, public_key, input_tx: funds } } - NetworkId::Ethereum => { + ExternalNetworkId::Ethereum => { use ciphersuite::{group::ff::Field, Secp256k1}; use ethereum_serai::alloy::{ primitives::{U256, Address}, @@ -185,7 +180,7 @@ impl Wallet { Wallet::Ethereum { rpc_url: rpc_url.clone(), key, nonce: 0 } } - NetworkId::Monero => { + ExternalNetworkId::Monero => { use curve25519_dalek::{constants::ED25519_BASEPOINT_POINT, scalar::Scalar}; use monero_simple_request_rpc::SimpleRequestRpc; use monero_wallet::{rpc::Rpc, address::Network, ViewPair}; @@ -210,7 +205,6 @@ impl Wallet { last_tx: (height, block.miner_transaction.hash()), } } - NetworkId::Serai => panic!("creating a wallet for for Serai"), } } @@ -219,7 +213,7 @@ impl Wallet { ops: &DockerOperations, to: &ExternalKey, instruction: Option, - ) -> (Vec, Balance) { + ) -> (Vec, ExternalBalance) { match self { Wallet::Bitcoin { private_key, public_key, ref mut input_tx } => { use bitcoin_serai::bitcoin::{ @@ -298,7 +292,7 @@ impl Wallet { let mut buf = vec![]; tx.consensus_encode(&mut buf).unwrap(); *input_tx = tx; - (buf, Balance { coin: Coin::Bitcoin, amount: Amount(AMOUNT) }) + (buf, ExternalBalance { coin: ExternalCoin::Bitcoin, amount: Amount(AMOUNT) }) } Wallet::Ethereum { rpc_url, key, ref mut nonce } => { @@ -400,7 +394,10 @@ impl Wallet { // We drop the bottom 10 decimals ( bytes, - Balance { coin: Coin::Ether, amount: Amount(u64::try_from(eight_decimals).unwrap()) }, + ExternalBalance { + coin: ExternalCoin::Ether, + amount: Amount(u64::try_from(eight_decimals).unwrap()), + }, ) } @@ -417,7 +414,7 @@ impl Wallet { }; use processor::{additional_key, networks::Monero}; - let rpc_url = network_rpc(NetworkId::Monero, ops, handle); + let rpc_url = network_rpc(ExternalNetworkId::Monero, ops, handle); let rpc = SimpleRequestRpc::new(rpc_url).await.expect("couldn't connect to the Monero RPC"); // Prepare inputs @@ -485,7 +482,7 @@ impl Wallet { last_tx.0 = current_height; last_tx.1 = tx.hash(); - (tx.serialize(), Balance { coin: Coin::Monero, amount: Amount(AMOUNT) }) + (tx.serialize(), ExternalBalance { coin: ExternalCoin::Monero, amount: Amount(AMOUNT) }) } } } diff --git a/tests/processor/src/tests/batch.rs b/tests/processor/src/tests/batch.rs index 6170270ac..4a34500ea 100644 --- a/tests/processor/src/tests/batch.rs +++ b/tests/processor/src/tests/batch.rs @@ -8,11 +8,12 @@ use dkg::{Participant, tests::clone_without}; use messages::{coordinator::*, SubstrateContext}; use serai_client::{ - primitives::{ - BlockHash, Amount, Balance, crypto::RuntimePublic, PublicKey, SeraiAddress, NetworkId, - }, in_instructions::primitives::{ - InInstruction, InInstructionWithBalance, Batch, SignedBatch, batch_message, + batch_message, Batch, InInstruction, InInstructionWithBalance, SignedBatch, + }, + primitives::{ + crypto::RuntimePublic, Amount, BlockHash, ExternalBalance, ExternalNetworkId, PublicKey, + SeraiAddress, EXTERNAL_NETWORKS, }, validator_sets::primitives::Session, }; @@ -189,7 +190,7 @@ pub(crate) async fn substrate_block( #[test] fn batch_test() { - for network in [NetworkId::Bitcoin, NetworkId::Ethereum, NetworkId::Monero] { + for network in EXTERNAL_NETWORKS { let (coordinators, test) = new_test(network); test.run(|ops| async move { @@ -255,15 +256,14 @@ fn batch_test() { instructions: if let Some(instruction) = &instruction { vec![InInstructionWithBalance { instruction: instruction.clone(), - balance: Balance { + balance: ExternalBalance { coin: balance_sent.coin, amount: Amount( balance_sent.amount.0 - (2 * match network { - NetworkId::Bitcoin => Bitcoin::COST_TO_AGGREGATE, - NetworkId::Ethereum => Ethereum::::COST_TO_AGGREGATE, - NetworkId::Monero => Monero::COST_TO_AGGREGATE, - NetworkId::Serai => panic!("minted for Serai?"), + ExternalNetworkId::Bitcoin => Bitcoin::COST_TO_AGGREGATE, + ExternalNetworkId::Ethereum => Ethereum::::COST_TO_AGGREGATE, + ExternalNetworkId::Monero => Monero::COST_TO_AGGREGATE, }), ), }, @@ -322,7 +322,9 @@ fn batch_test() { }, ) .await; - if instruction.is_some() || (instruction.is_none() && (network == NetworkId::Monero)) { + if instruction.is_some() || + (instruction.is_none() && (network == ExternalNetworkId::Monero)) + { assert!(plans.is_empty()); } else { // If no instruction was used, and the processor csn presume the origin, it'd have @@ -335,7 +337,7 @@ fn batch_test() { // With the latter InInstruction not existing, we should've triggered a refund if the origin // was detectable // Check this is trying to sign a Plan - if network != NetworkId::Monero { + if network != ExternalNetworkId::Monero { let mut refund_id = None; for coordinator in &mut coordinators { match coordinator.recv_message().await { diff --git a/tests/processor/src/tests/key_gen.rs b/tests/processor/src/tests/key_gen.rs index 7dea0bfd5..ec616b514 100644 --- a/tests/processor/src/tests/key_gen.rs +++ b/tests/processor/src/tests/key_gen.rs @@ -3,8 +3,8 @@ use std::{collections::HashMap, time::SystemTime}; use dkg::{Participant, ThresholdParams, tests::clone_without}; use serai_client::{ - primitives::{NetworkId, BlockHash, PublicKey}, - validator_sets::primitives::{Session, KeyPair}, + primitives::{BlockHash, PublicKey, EXTERNAL_NETWORKS}, + validator_sets::primitives::{KeyPair, Session}, }; use messages::{SubstrateContext, key_gen::KeyGenId, CoordinatorMessage, ProcessorMessage}; @@ -144,7 +144,7 @@ pub(crate) async fn key_gen(coordinators: &mut [Coordinator]) -> KeyPair { #[test] fn key_gen_test() { - for network in [NetworkId::Bitcoin, NetworkId::Ethereum, NetworkId::Monero] { + for network in EXTERNAL_NETWORKS { let (coordinators, test) = new_test(network); test.run(|ops| async move { diff --git a/tests/processor/src/tests/mod.rs b/tests/processor/src/tests/mod.rs index afda97d5e..0347a3dd0 100644 --- a/tests/processor/src/tests/mod.rs +++ b/tests/processor/src/tests/mod.rs @@ -1,7 +1,5 @@ use ciphersuite::{Ciphersuite, Ristretto}; -use serai_client::primitives::NetworkId; - use dockertest::DockerTest; use crate::*; @@ -17,7 +15,9 @@ mod send; pub(crate) const COORDINATORS: usize = 4; pub(crate) const THRESHOLD: usize = ((COORDINATORS * 2) / 3) + 1; -fn new_test(network: NetworkId) -> (Vec<(Handles, ::F)>, DockerTest) { +fn new_test( + network: ExternalNetworkId, +) -> (Vec<(Handles, ::F)>, DockerTest) { let mut coordinators = vec![]; let mut test = DockerTest::new().with_network(dockertest::Network::Isolated); let mut eth_handle = None; @@ -25,7 +25,7 @@ fn new_test(network: NetworkId) -> (Vec<(Handles, ::F) let (handles, coord_key, compositions) = processor_stack(network, eth_handle.clone()); // TODO: Remove this once https://github.com/foundry-rs/foundry/issues/7955 // This has all processors share an Ethereum node until we can sync controlled nodes - if network == NetworkId::Ethereum { + if network == ExternalNetworkId::Ethereum { eth_handle = eth_handle.or_else(|| Some(handles.0.clone())); } coordinators.push((handles, coord_key)); diff --git a/tests/processor/src/tests/send.rs b/tests/processor/src/tests/send.rs index 62e80c095..e50edc3fe 100644 --- a/tests/processor/src/tests/send.rs +++ b/tests/processor/src/tests/send.rs @@ -8,9 +8,9 @@ use dkg::{Participant, tests::clone_without}; use messages::{sign::SignId, SubstrateContext}; use serai_client::{ - primitives::{BlockHash, NetworkId, Amount, Balance, SeraiAddress}, coins::primitives::{OutInstruction, OutInstructionWithBalance}, - in_instructions::primitives::{InInstruction, InInstructionWithBalance, Batch}, + in_instructions::primitives::{Batch, InInstruction, InInstructionWithBalance}, + primitives::{Amount, BlockHash, ExternalBalance, SeraiAddress, EXTERNAL_NETWORKS}, validator_sets::primitives::Session, }; @@ -147,7 +147,7 @@ pub(crate) async fn sign_tx( #[test] fn send_test() { - for network in [NetworkId::Bitcoin, NetworkId::Ethereum, NetworkId::Monero] { + for network in EXTERNAL_NETWORKS { let (coordinators, test) = new_test(network); test.run(|ops| async move { @@ -202,10 +202,9 @@ fn send_test() { let amount_minted = Amount( balance_sent.amount.0 - (2 * match network { - NetworkId::Bitcoin => Bitcoin::COST_TO_AGGREGATE, - NetworkId::Ethereum => Ethereum::::COST_TO_AGGREGATE, - NetworkId::Monero => Monero::COST_TO_AGGREGATE, - NetworkId::Serai => panic!("minted for Serai?"), + ExternalNetworkId::Bitcoin => Bitcoin::COST_TO_AGGREGATE, + ExternalNetworkId::Ethereum => Ethereum::::COST_TO_AGGREGATE, + ExternalNetworkId::Monero => Monero::COST_TO_AGGREGATE, }), ); @@ -215,7 +214,7 @@ fn send_test() { block: BlockHash(block_with_tx.unwrap()), instructions: vec![InInstructionWithBalance { instruction, - balance: Balance { coin: balance_sent.coin, amount: amount_minted }, + balance: ExternalBalance { coin: balance_sent.coin, amount: amount_minted }, }], }; @@ -245,7 +244,7 @@ fn send_test() { block: substrate_block_num, burns: vec![OutInstructionWithBalance { instruction: OutInstruction { address: wallet.address(), data: None }, - balance: Balance { coin: balance_sent.coin, amount: amount_minted }, + balance: ExternalBalance { coin: balance_sent.coin, amount: amount_minted }, }], batches: vec![batch.batch.id], },