diff options
35 files changed, 912 insertions, 613 deletions
diff --git a/Dockerfile b/Dockerfile index 44a1015e9..b64af42ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN curl -s -L -o boost_${BOOST_VERSION}.tar.bz2 https://dl.bintray.com/boostor && tar -xvf boost_${BOOST_VERSION}.tar.bz2 \ && cd boost_${BOOST_VERSION} \ && ./bootstrap.sh \ - && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread threading=multi threadapi=pthread cflags="-fPIC" cxxflags="-fPIC" stage + && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale threading=multi threadapi=pthread cflags="-fPIC" cxxflags="-fPIC" stage ENV BOOST_ROOT /usr/local/boost_${BOOST_VERSION} # OpenSSL diff --git a/src/crypto/chacha.h b/src/crypto/chacha.h index b45c3d7c7..22da53bd0 100644 --- a/src/crypto/chacha.h +++ b/src/crypto/chacha.h @@ -69,10 +69,10 @@ namespace crypto { chacha20(data, length, key.data(), reinterpret_cast<const uint8_t*>(&iv), cipher); } - inline void generate_chacha_key(const void *data, size_t size, chacha_key& key, bool prehashed=false) { + inline void generate_chacha_key(const void *data, size_t size, chacha_key& key, int cn_variant = 0, bool prehashed=false) { static_assert(sizeof(chacha_key) <= sizeof(hash), "Size of hash must be at least that of chacha_key"); tools::scrubbed_arr<char, HASH_SIZE> pwd_hash; - crypto::cn_slow_hash_pre(data, size, pwd_hash.data(), prehashed); + crypto::cn_slow_hash_pre(data, size, pwd_hash.data(), cn_variant, prehashed); memcpy(&key, pwd_hash.data(), sizeof(key)); } diff --git a/src/crypto/hash-ops.h b/src/crypto/hash-ops.h index 130bf02db..934d464de 100644 --- a/src/crypto/hash-ops.h +++ b/src/crypto/hash-ops.h @@ -79,8 +79,8 @@ enum { }; void cn_fast_hash(const void *data, size_t length, char *hash); -void cn_slow_hash(const void *data, size_t length, char *hash); -void cn_slow_hash_pre(const void *data, size_t length, char *hash, bool pre); +void cn_slow_hash(const void *data, size_t length, char *hash, int variant); +void cn_slow_hash_pre(const void *data, size_t length, char *hash, int variant, bool pre); void hash_extra_blake(const void *data, size_t length, char *hash); void hash_extra_groestl(const void *data, size_t length, char *hash); diff --git a/src/crypto/hash.h b/src/crypto/hash.h index 14104699b..bf4f4c096 100644 --- a/src/crypto/hash.h +++ b/src/crypto/hash.h @@ -71,8 +71,8 @@ namespace crypto { return h; } - inline void cn_slow_hash(const void *data, std::size_t length, hash &hash) { - cn_slow_hash(data, length, reinterpret_cast<char *>(&hash)); + inline void cn_slow_hash(const void *data, std::size_t length, hash &hash, int variant = 0) { + cn_slow_hash(data, length, reinterpret_cast<char *>(&hash), variant); } inline void tree_hash(const hash *hashes, std::size_t count, hash &root_hash) { diff --git a/src/crypto/slow-hash.c b/src/crypto/slow-hash.c index 36bfba9fd..8c7dad8e0 100644 --- a/src/crypto/slow-hash.c +++ b/src/crypto/slow-hash.c @@ -32,6 +32,8 @@ #include <stddef.h> #include <stdint.h> #include <string.h> +#include <stdio.h> +#include <unistd.h> #include "common/int-util.h" #include "hash-ops.h" @@ -47,6 +49,46 @@ extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey); extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *expandedKey); +#define VARIANT1_1(p) \ + do if (variant > 0) \ + { \ + const uint8_t tmp = ((const uint8_t*)(p))[11]; \ + static const uint32_t table = 0x75310; \ + const uint8_t index = (((tmp >> 3) & 6) | (tmp & 1)) << 1; \ + ((uint8_t*)(p))[11] = tmp ^ ((table >> index) & 0x30); \ + } while(0) + +#define VARIANT1_2(p) \ + do if (variant > 0) \ + { \ + xor64(p, tweak1_2); \ + } while(0) + +#define VARIANT1_CHECK() \ + do if (length < 43) \ + { \ + fprintf(stderr, "Cryptonight variants need at least 43 bytes of data"); \ + _exit(1); \ + } while(0) + +#define NONCE_POINTER (((const uint8_t*)data)+35) + +#define VARIANT1_PORTABLE_INIT() \ + uint8_t tweak1_2[8]; \ + do if (variant > 0) \ + { \ + VARIANT1_CHECK(); \ + memcpy(&tweak1_2, &state.hs.b[192], sizeof(tweak1_2)); \ + xor64(tweak1_2, NONCE_POINTER); \ + } while(0) + +#define VARIANT1_INIT64() \ + if (variant > 0) \ + { \ + VARIANT1_CHECK(); \ + } \ + const uint64_t tweak1_2 = variant > 0 ? (state.hs.w[24] ^ (*((const uint64_t*)NONCE_POINTER))) : 0 + #if !defined NO_AES && (defined(__x86_64__) || (defined(_MSC_VER) && defined(_WIN64))) // Optimised code below, uses x86-specific intrinsics, SSE2, AES-NI // Fall back to more portable code is down at the bottom @@ -125,6 +167,7 @@ extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *exp _mm_store_si128(R128(c), _c); \ _b = _mm_xor_si128(_b, _c); \ _mm_store_si128(R128(&hp_state[j]), _b); \ + VARIANT1_1(&hp_state[j]); \ j = state_index(c); \ p = U64(&hp_state[j]); \ b[0] = p[0]; b[1] = p[1]; \ @@ -133,6 +176,7 @@ extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *exp p = U64(&hp_state[j]); \ p[0] = a[0]; p[1] = a[1]; \ a[0] ^= b[0]; a[1] ^= b[1]; \ + VARIANT1_2(p + 1); \ _b = _c; \ #if defined(_MSC_VER) @@ -183,6 +227,11 @@ STATIC INLINE void xor_blocks(uint8_t *a, const uint8_t *b) U64(a)[1] ^= U64(b)[1]; } +STATIC INLINE void xor64(uint64_t *a, const uint64_t b) +{ + *a ^= b; +} + /** * @brief uses cpuid to determine if the CPU supports the AES instructions * @return true if the CPU supports AES, false otherwise @@ -515,11 +564,11 @@ void slow_hash_free_state(void) * @param length the length in bytes of the data * @param hash a pointer to a buffer in which the final 256 bit hash will be stored */ -void cn_slow_hash(const void *data, size_t length, char *hash) { - cn_slow_hash_pre(data,length,hash,false); +void cn_slow_hash(const void *data, size_t length, char *hash, int variant) { + cn_slow_hash_pre(data,length,hash,variant,false); } -void cn_slow_hash_pre(const void *data, size_t length, char *hash, bool prehashed) +void cn_slow_hash_pre(const void *data, size_t length, char *hash, int variant, bool prehashed) { RDATA_ALIGN16 uint8_t expandedKey[240]; /* These buffers are aligned to use later with SSE functions */ @@ -553,6 +602,8 @@ void cn_slow_hash_pre(const void *data, size_t length, char *hash, bool prehashe } memcpy(text, state.init, INIT_SIZE_BYTE); + VARIANT1_INIT64(); + /* CryptoNight Step 2: Iteratively encrypt the results from Keccak to fill * the 2MB large random access buffer. */ @@ -676,6 +727,11 @@ void slow_hash_free_state(void) #define U64(x) ((uint64_t *) (x)) +STATIC INLINE void xor64(uint64_t *a, const uint64_t b) +{ + *a ^= b; +} + #pragma pack(push, 1) union cn_slow_hash_state { @@ -712,6 +768,7 @@ union cn_slow_hash_state vst1q_u8((uint8_t *)c, _c); \ _b = veorq_u8(_b, _c); \ vst1q_u8(&hp_state[j], _b); \ + VARIANT1_1(&hp_state[j]); \ j = state_index(c); \ p = U64(&hp_state[j]); \ b[0] = p[0]; b[1] = p[1]; \ @@ -720,6 +777,7 @@ union cn_slow_hash_state p = U64(&hp_state[j]); \ p[0] = a[0]; p[1] = a[1]; \ a[0] ^= b[0]; a[1] ^= b[1]; \ + VARIANT1_2(p + 1); \ _b = _c; \ @@ -851,7 +909,7 @@ STATIC INLINE void aes_pseudo_round_xor(const uint8_t *in, uint8_t *out, const u } } -void cn_slow_hash(const void *data, size_t length, char *hash) +void cn_slow_hash(const void *data, size_t length, char *hash, int variant) { RDATA_ALIGN16 uint8_t expandedKey[240]; RDATA_ALIGN16 uint8_t hp_state[MEMORY]; @@ -877,6 +935,8 @@ void cn_slow_hash(const void *data, size_t length, char *hash) hash_process(&state.hs, data, length); memcpy(text, state.init, INIT_SIZE_BYTE); + VARIANT1_INIT64(); + /* CryptoNight Step 2: Iteratively encrypt the results from Keccak to fill * the 2MB large random access buffer. */ @@ -1045,7 +1105,7 @@ STATIC INLINE void xor_blocks(uint8_t* a, const uint8_t* b) U64(a)[1] ^= U64(b)[1]; } -void cn_slow_hash(const void *data, size_t length, char *hash) +void cn_slow_hash(const void *data, size_t length, char *hash, int variant) { uint8_t text[INIT_SIZE_BYTE]; uint8_t a[AES_BLOCK_SIZE]; @@ -1074,6 +1134,8 @@ void cn_slow_hash(const void *data, size_t length, char *hash) hash_process(&state.hs, data, length); memcpy(text, state.init, INIT_SIZE_BYTE); + VARIANT1_INIT64(); + aes_ctx = (oaes_ctx *) oaes_alloc(); oaes_key_import_data(aes_ctx, state.hs.b, AES_KEY_SIZE); @@ -1103,6 +1165,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash) xor_blocks(b, p); swap_blocks(b, p); swap_blocks(a, b); + VARIANT1_1(p); // Iteration 2 p = &long_state[state_index(a)]; @@ -1112,6 +1175,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash) swap_blocks(b, p); xor_blocks(b, p); swap_blocks(a, b); + VARIANT1_2(U64(p) + 1); } memcpy(text, state.init, INIT_SIZE_BYTE); @@ -1206,6 +1270,15 @@ static void xor_blocks(uint8_t* a, const uint8_t* b) { } } +static void xor64(uint8_t* left, const uint8_t* right) +{ + size_t i; + for (i = 0; i < 8; ++i) + { + left[i] ^= right[i]; + } +} + #pragma pack(push, 1) union cn_slow_hash_state { union hash_state hs; @@ -1216,7 +1289,7 @@ union cn_slow_hash_state { }; #pragma pack(pop) -void cn_slow_hash(const void *data, size_t length, char *hash) { +void cn_slow_hash(const void *data, size_t length, char *hash, int variant) { uint8_t long_state[MEMORY]; union cn_slow_hash_state state; uint8_t text[INIT_SIZE_BYTE]; @@ -1233,6 +1306,8 @@ void cn_slow_hash(const void *data, size_t length, char *hash) { memcpy(aes_key, state.hs.b, AES_KEY_SIZE); aes_ctx = (oaes_ctx *) oaes_alloc(); + VARIANT1_PORTABLE_INIT(); + oaes_key_import_data(aes_ctx, aes_key, AES_KEY_SIZE); for (i = 0; i < MEMORY / INIT_SIZE_BYTE; i++) { for (j = 0; j < INIT_SIZE_BLK; j++) { @@ -1260,6 +1335,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash) { copy_block(&long_state[j * AES_BLOCK_SIZE], c); assert(j == e2i(a, MEMORY / AES_BLOCK_SIZE)); swap_blocks(a, b); + VARIANT1_1(&long_state[j * AES_BLOCK_SIZE]); /* Iteration 2 */ j = e2i(a, MEMORY / AES_BLOCK_SIZE); copy_block(c, &long_state[j * AES_BLOCK_SIZE]); @@ -1267,6 +1343,7 @@ void cn_slow_hash(const void *data, size_t length, char *hash) { sum_half_blocks(b, d); swap_blocks(b, c); xor_blocks(b, c); + VARIANT1_2(c + 8); copy_block(&long_state[j * AES_BLOCK_SIZE], c); assert(j == e2i(a, MEMORY / AES_BLOCK_SIZE)); swap_blocks(a, b); diff --git a/src/cryptonote_basic/account.cpp b/src/cryptonote_basic/account.cpp index 375b17389..70f7533ea 100644 --- a/src/cryptonote_basic/account.cpp +++ b/src/cryptonote_basic/account.cpp @@ -140,9 +140,7 @@ DISABLE_VS_WARNINGS(4244 4345) hwdev.init(); hwdev.connect(); hwdev.get_public_address(m_keys.m_account_address); - #ifdef DEBUG_HWDEVICE hwdev.get_secret_keys(m_keys.m_view_secret_key, m_keys.m_spend_secret_key); - #endif struct tm timestamp = {0}; timestamp.tm_year = 2014 - 1900; // year 2014 timestamp.tm_mon = 4 - 1; // month april diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp index f462d1ca9..a10772424 100644 --- a/src/cryptonote_basic/cryptonote_format_utils.cpp +++ b/src/cryptonote_basic/cryptonote_format_utils.cpp @@ -1022,7 +1022,8 @@ namespace cryptonote return true; } blobdata bd = get_block_hashing_blob(b); - crypto::cn_slow_hash(bd.data(), bd.size(), res); + const int cn_variant = b.major_version >= 7 ? b.major_version - 6 : 0; + crypto::cn_slow_hash(bd.data(), bd.size(), res, cn_variant); return true; } //--------------------------------------------------------------- diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h index 171fc194a..0ad8a6005 100644 --- a/src/cryptonote_config.h +++ b/src/cryptonote_config.h @@ -132,6 +132,7 @@ #define HF_VERSION_DYNAMIC_FEE 4 #define HF_VERSION_MIN_MIXIN_4 6 +#define HF_VERSION_MIN_MIXIN_6 7 #define HF_VERSION_ENFORCE_RCT 6 #define PER_KB_FEE_QUANTIZATION_DECIMALS 8 diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index d88cc1bf9..c97b75f98 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -2531,7 +2531,7 @@ bool Blockchain::check_tx_inputs(transaction& tx, tx_verification_context &tvc, { size_t n_unmixable = 0, n_mixable = 0; size_t mixin = std::numeric_limits<size_t>::max(); - const size_t min_mixin = hf_version >= HF_VERSION_MIN_MIXIN_4 ? 4 : 2; + const size_t min_mixin = hf_version >= HF_VERSION_MIN_MIXIN_6 ? 6 : hf_version >= HF_VERSION_MIN_MIXIN_4 ? 4 : 2; for (const auto& txin : tx.vin) { // non txin_to_key inputs will be rejected below diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp index d0a958e1e..df98feb5a 100644 --- a/src/cryptonote_core/cryptonote_tx_utils.cpp +++ b/src/cryptonote_core/cryptonote_tx_utils.cpp @@ -409,7 +409,7 @@ namespace cryptonote r = crypto::derive_public_key(derivation, output_index, dst_entr.addr.m_spend_public_key, out_eph_public_key, hwdev); CHECK_AND_ASSERT_MES(r, false, "at creation outs: failed to derive_public_key(" << derivation << ", " << output_index << ", "<< dst_entr.addr.m_spend_public_key << ")"); - hwdev.add_output_key_mapping(dst_entr.addr.m_view_public_key, dst_entr.addr.m_spend_public_key, output_index, amount_keys.back(), out_eph_public_key); + hwdev.add_output_key_mapping(dst_entr.addr.m_view_public_key, dst_entr.addr.m_spend_public_key, dst_entr.is_subaddress, output_index, amount_keys.back(), out_eph_public_key); tx_out out; out.amount = dst_entr.amount; diff --git a/src/debug_utilities/CMakeLists.txt b/src/debug_utilities/CMakeLists.txt index 6942399e4..1bcbfd0cf 100644 --- a/src/debug_utilities/CMakeLists.txt +++ b/src/debug_utilities/CMakeLists.txt @@ -38,6 +38,8 @@ target_link_libraries(cn_deserialize LINK_PRIVATE cryptonote_core blockchain_db + device + ringct p2p epee ${CMAKE_THREAD_LIBS_INIT}) diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 26389220f..7eccc1cc2 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -70,8 +70,6 @@ target_link_libraries(device cncrypto ringct ${OPENSSL_CRYPTO_LIBRARIES} - ${GNU_READLINE_LIBRARY} - ${EPEE_READLINE} PRIVATE ${Blocks} ${EXTRA_LIBRARIES}) diff --git a/src/device/device.cpp b/src/device/device.cpp index 080d83c7e..983f59b60 100644 --- a/src/device/device.cpp +++ b/src/device/device.cpp @@ -32,7 +32,7 @@ #ifdef HAVE_PCSC #include "device_ledger.hpp" #endif -#include "common/scoped_message_writer.h" +#include "misc_log_ex.h" namespace hw { @@ -56,16 +56,15 @@ namespace hw { auto device = devices.registry.find(device_descriptor); if (device == devices.registry.end()) { - auto logger = tools::fail_msg_writer(); - logger << "device not found in registry '"<<device_descriptor<<"'\n" << - "known devices:"<<device_descriptor<<"'"; + MERROR("device not found in registry: '" << device_descriptor << "'\n" << + "known devices:"); for( const auto& sm_pair : devices.registry ) { - logger<< " - " << sm_pair.first ; + MERROR(" - " << sm_pair.first); } throw std::runtime_error("device not found: "+ device_descriptor); } return *device->second; } -}
\ No newline at end of file +} diff --git a/src/device/device.hpp b/src/device/device.hpp index bdea7b8f6..614d2c243 100644 --- a/src/device/device.hpp +++ b/src/device/device.hpp @@ -28,6 +28,20 @@ // +/* Note about debug: + * To debug Device you can def the following : + * #define DEBUG_HWDEVICE + * Activate debug mechanism: + * - Add more trace + * - All computation done by device are checked by default device. + * Required IODUMMYCRYPT_HWDEVICE or IONOCRYPT_HWDEVICE for fully working + * #define IODUMMYCRYPT_HWDEVICE 1 + * - It assumes sensitive data encryption is is off on device side. a XOR with 0x55. This allow Ledger Class to make check on clear value + * #define IONOCRYPT_HWDEVICE 1 + * - It assumes sensitive data encryption is off on device side. + */ + + #pragma once #include "cryptonote_basic/cryptonote_basic.h" @@ -128,8 +142,8 @@ namespace hw { virtual bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) = 0; virtual bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) = 0; - virtual bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, size_t real_output_index, - const rct::key &amount_key, const crypto::public_key &out_eph_public_key) = 0; + virtual bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index, + const rct::key &amount_key, const crypto::public_key &out_eph_public_key) = 0; virtual bool mlsag_prehash(const std::string &blob, size_t inputs_size, size_t outputs_size, const rct::keyV &hashes, const rct::ctkeyV &outPk, rct::key &prehash) = 0; diff --git a/src/device/device_declare.hpp b/src/device/device_declare.hpp index 799052ad2..fcf5762af 100644 --- a/src/device/device_declare.hpp +++ b/src/device/device_declare.hpp @@ -29,11 +29,6 @@ #pragma once - -//#define DEBUG_HWDEVICE -//#define IODUMMYCRYPT 1 -//#define IONOCRYPT 1 - namespace hw { class device; diff --git a/src/device/device_default.cpp b/src/device/device_default.cpp index c3ba42000..7ae72af44 100644 --- a/src/device/device_default.cpp +++ b/src/device/device_default.cpp @@ -185,7 +185,7 @@ namespace hw { } - bool device_default::add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, size_t real_output_index, + bool device_default::add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index, const rct::key &amount_key, const crypto::public_key &out_eph_public_key) { return true; } diff --git a/src/device/device_default.hpp b/src/device/device_default.hpp index f5b158a3b..d7fc2b914 100644 --- a/src/device/device_default.hpp +++ b/src/device/device_default.hpp @@ -105,8 +105,8 @@ namespace hw { bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override; bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) override; - bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, size_t real_output_index, - const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override; + bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index, + const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override; bool mlsag_prehash(const std::string &blob, size_t inputs_size, size_t outputs_size, const rct::keyV &hashes, const rct::ctkeyV &outPk, rct::key &prehash) override; diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp index cede834a1..51837b8a2 100644 --- a/src/device/device_ledger.cpp +++ b/src/device/device_ledger.cpp @@ -55,30 +55,29 @@ namespace hw { #define ASSERT_T0(exp) CHECK_AND_ASSERT_THROW_MES(exp, "Protocol assert failure: "#exp ) ; #ifdef DEBUG_HWDEVICE - #define DEVICE_CONTROLE :controle_device(hw::get_device("default")) crypto::secret_key viewkey; crypto::secret_key spendkey; - #else - #define DEVICE_CONTROLE #endif /* ===================================================================== */ /* === Keymap ==== */ /* ===================================================================== */ - ABPkeys::ABPkeys(const rct::key& A, const rct::key& B, size_t real_output_index, const rct::key& P, const rct::key& AK) { + ABPkeys::ABPkeys(const rct::key& A, const rct::key& B, const bool is_subaddr, const size_t real_output_index, const rct::key& P, const rct::key& AK) { Aout = A; Bout = B; + is_subaddress = is_subaddr; index = real_output_index; Pout = P; AKout = AK; } ABPkeys::ABPkeys(const ABPkeys& keys) { - Aout = keys.Aout; - Bout = keys.Bout; + Aout = keys.Aout; + Bout = keys.Bout; + is_subaddress = keys.is_subaddress; index = keys.index; - Pout = keys.Pout; + Pout = keys.Pout; AKout = keys.AKout; } @@ -109,6 +108,7 @@ namespace hw { log_message(" keymap", std::to_string(i)); log_hexbuffer(" Aout", (char*)ABP[i].Aout.bytes, 32); log_hexbuffer(" Bout", (char*)ABP[i].Bout.bytes, 32); + log_message (" is_sub", std::to_string(ABP[i].is_subaddress)); log_message (" index", std::to_string(ABP[i].index)); log_hexbuffer(" Pout", (char*)ABP[i].Pout.bytes, 32); } @@ -189,7 +189,7 @@ namespace hw { } /* -------------------------------------------------------------- */ - device_ledger::device_ledger() DEVICE_CONTROLE { + device_ledger::device_ledger() { this->id = device_id++; this->hCard = 0; this->hContext = 0; @@ -300,6 +300,9 @@ namespace hw { } bool device_ledger::init(void) { + #ifdef DEBUG_HWDEVICE + this->controle_device = &hw::get_device("default"); + #endif LONG rv; this->release(); rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM,0,0, &this->hContext); @@ -411,12 +414,6 @@ namespace hw { /* WALLET & ADDRESS */ /* ======================================================================= */ - bool device_ledger::get_secret_keys(crypto::secret_key &viewkey , crypto::secret_key &spendkey) { - memset(viewkey.data, 0x00, 32); - memset(spendkey.data, 0xFF, 32); - return true; - } - /* Application API */ bool device_ledger::get_public_address(cryptonote::account_public_address &pubkey){ @@ -449,8 +446,11 @@ namespace hw { return true; } - #ifdef DEBUG_HWDEVICE bool device_ledger::get_secret_keys(crypto::secret_key &viewkey , crypto::secret_key &spendkey) { + memset(viewkey.data, 0x00, 32); + memset(spendkey.data, 0xFF, 32); + + #ifdef DEBUG_HWDEVICE lock_device(); try { //spcialkey, normal conf handled in decrypt @@ -479,9 +479,9 @@ namespace hw { unlock_device(); throw; } + #endif return true; } - #endif bool device_ledger::generate_chacha_key(const cryptonote::account_keys &keys, crypto::chacha_key &key) { lock_device(); @@ -489,9 +489,9 @@ namespace hw { int offset; #ifdef DEBUG_HWDEVICE - const cryptonote::account_keys keys_x = decrypt(keys); crypto::chacha_key key_x; - this->controle_device.generate_chacha_key(keys_x, key_x); + cryptonote::account_keys keys_x = hw::ledger::decrypt(keys); + this->controle_device->generate_chacha_key(keys_x, key_x); #endif reset_buffer(); @@ -511,7 +511,7 @@ namespace hw { char prekey[200]; memmove(prekey, &this->buffer_recv[0], 200); - crypto::generate_chacha_key(&prekey[0], sizeof(prekey), key, true); + crypto::generate_chacha_key(&prekey[0], sizeof(prekey), key, 0, true); #ifdef DEBUG_HWDEVICE hw::ledger::check32("generate_chacha_key", "key", (char*)key_x.data(), (char*)key.data()); @@ -541,7 +541,11 @@ namespace hw { const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation); const std::size_t output_index_x = output_index; crypto::public_key derived_pub_x; - this->controle_device.derive_subaddress_public_key(pub_x, derivation_x,output_index_x,derived_pub_x); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] pub ", pub_x.data, 32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] derivation", derivation_x.data, 32); + hw::ledger::log_message ("derive_subaddress_public_key: [[IN]] index ", std::to_string((int)output_index_x)); + this->controle_device->derive_subaddress_public_key(pub_x, derivation_x,output_index_x,derived_pub_x); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[OUT]] derived_pub", derived_pub_x.data, 32); #endif reset_buffer(); @@ -599,7 +603,11 @@ namespace hw { const cryptonote::account_keys keys_x = hw::ledger::decrypt(keys); const cryptonote::subaddress_index index_x = index; crypto::public_key D_x; - this->controle_device.get_subaddress_spend_public_key(keys_x, index_x, D_x); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data,32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_secret_key", keys_x.m_spend_secret_key.data,32); + hw::ledger::log_message ("get_subaddress_spend_public_key: [[IN]] index ", std::to_string(index_x.major)+"."+std::to_string(index_x.minor)); + this->controle_device->get_subaddress_spend_public_key(keys_x, index_x, D_x); + hw::ledger::log_hexbuffer("get_subaddress_spend_public_key: [[OUT]] derivation ", D_x.data, 32); #endif if (index.is_zero()) { @@ -662,7 +670,14 @@ namespace hw { const cryptonote::account_keys keys_x = hw::ledger::decrypt(keys); const cryptonote::subaddress_index index_x = index; cryptonote::account_public_address address_x; - this->controle_device.get_subaddress(keys_x, index_x, address_x); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_public_key", keys_x.m_account_address.m_view_public_key.data, 32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_secret_key ", keys_x.m_view_secret_key.data, 32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_public_key", keys_x.m_account_address.m_spend_public_key.data, 32); + hw::ledger::log_message ("get_subaddress: [[IN]] index ", std::to_string(index_x.major)+"."+std::to_string(index_x.minor)); + this->controle_device->get_subaddress(keys_x, index_x, address_x); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_view_public_key ", address_x.m_view_public_key.data, 32); + hw::ledger::log_hexbuffer("derive_subaddress_public_key: [[IN]] keys.m_spend_public_key", address_x.m_spend_public_key.data, 32); #endif if (index.is_zero()) { @@ -715,7 +730,10 @@ namespace hw { const crypto::secret_key sec_x = hw::ledger::decrypt(sec); const cryptonote::subaddress_index index_x = index; crypto::secret_key sub_sec_x; - this->controle_device.get_subaddress_secret_key(sec_x, index_x, sub_sec_x); + hw::ledger::log_message ("get_subaddress_secret_key: [[IN]] index ", std::to_string(index.major)+"."+std::to_string(index.minor)); + hw::ledger::log_hexbuffer("get_subaddress_secret_key: [[IN]] sec ", sec_x.data, 32); + this->controle_device->get_subaddress_secret_key(sec_x, index_x, sub_sec_x); + hw::ledger::log_hexbuffer("get_subaddress_secret_key: [[OUT]] sub_sec", sub_sec_x.data, 32); #endif reset_buffer(); @@ -808,10 +826,13 @@ namespace hw { unsigned char options = 0; #ifdef DEBUG_HWDEVICE - const rct::key pub_x = pub; - const rct::key sec_x = hw::ledger::decrypt(sec); - rct::key mulkey_x; - this->controle_device.scalarmultKey(pub_x, sec_x, mulkey_x); + const rct::key P_x = P; + const rct::key a_x = hw::ledger::decrypt(a); + rct::key aP_x; + hw::ledger::log_hexbuffer("scalarmultKey: [[IN]] P ", (char*)P_x.bytes, 32); + hw::ledger::log_hexbuffer("scalarmultKey: [[IN]] a ", (char*)a_x.bytes, 32); + this->controle_device->scalarmultKey(aP_x, P_x, a_x); + hw::ledger::log_hexbuffer("scalarmultKey: [[OUT]] aP", (char*)aP_x.bytes, 32); #endif reset_buffer(); @@ -843,7 +864,7 @@ namespace hw { memmove(aP.bytes, &this->buffer_recv[0], 32); #ifdef DEBUG_HWDEVICE - hw::ledger::check32("scalarmultKey", "mulkey", (char*)mulkey_x.bytes, (char*)mulkey.bytes); + hw::ledger::check32("scalarmultKey", "mulkey", (char*)aP_x.bytes, (char*)aP.bytes); #endif unlock_device(); @@ -861,9 +882,11 @@ namespace hw { unsigned char options = 0; #ifdef DEBUG_HWDEVICE - const rct::key sec_x = hw::ledger::decrypt(sec); - rct::key mulkey_x; - this->controle_device.scalarmultBase(sec_x, mulkey_x); + const rct::key a_x = hw::ledger::decrypt(a); + rct::key aG_x; + hw::ledger::log_hexbuffer("scalarmultKey: [[IN]] a ", (char*)a_x.bytes, 32); + this->controle_device->scalarmultBase(aG_x, a_x); + hw::ledger::log_hexbuffer("scalarmultKey: [[OUT]] aG", (char*)aG_x.bytes, 32); #endif reset_buffer(); @@ -891,7 +914,7 @@ namespace hw { memmove(aG.bytes, &this->buffer_recv[0], 32); #ifdef DEBUG_HWDEVICE - hw::ledger::check32("scalarmultBase", "mulkey", (char*)mulkey_x.bytes, (char*)mulkey.bytes); + hw::ledger::check32("scalarmultBase", "mulkey", (char*)aG_x.bytes, (char*)aG.bytes); #endif unlock_device(); @@ -913,7 +936,7 @@ namespace hw { const crypto::secret_key a_x = hw::ledger::decrypt(a); const crypto::secret_key b_x = hw::ledger::decrypt(b); crypto::secret_key r_x; - this->controle_device.sc_secret_add(r_x, a_x, b_x); + this->controle_device->sc_secret_add(r_x, a_x, b_x); #endif reset_buffer(); @@ -1021,10 +1044,10 @@ namespace hw { const crypto::public_key pub_x = pub; const crypto::secret_key sec_x = hw::ledger::decrypt(sec); crypto::key_derivation derivation_x; - this->controle_device.generate_key_derivation(pub_x, sec_x, derivation_x); - hw::ledger::log_hexbuffer("generate_key_derivation: sec_x.data", sec_x.data, 32); - hw::ledger::log_hexbuffer("generate_key_derivation: pub_x.data", pub_x.data, 32); - hw::ledger::log_hexbuffer("generate_key_derivation: derivation_x.data", derivation_x.data, 32); + hw::ledger::log_hexbuffer("generate_key_derivation: [[IN]] pub ", pub_x.data, 32); + hw::ledger::log_hexbuffer("generate_key_derivation: [[IN]] sec ", sec_x.data, 32); + this->controle_device->generate_key_derivation(pub_x, sec_x, derivation_x); + hw::ledger::log_hexbuffer("generate_key_derivation: [[OUT]] derivation", derivation_x.data, 32); #endif reset_buffer(); @@ -1075,7 +1098,10 @@ namespace hw { const crypto::key_derivation derivation_x = hw::ledger::decrypt(derivation); const size_t output_index_x = output_index; crypto::ec_scalar res_x; - this->controle_device.derivation_to_scalar(derivation_x, output_index_x, res_x); + hw::ledger::log_hexbuffer("derivation_to_scalar: [[IN]] derivation ", derivation_x.data, 32); + hw::ledger::log_message ("derivation_to_scalar: [[IN]] output_index ", std::to_string(output_index_x)); + this->controle_device->derivation_to_scalar(derivation_x, output_index_x, res_x); + hw::ledger::log_hexbuffer("derivation_to_scalar: [[OUT]] res ", res_x.data, 32); #endif reset_buffer(); @@ -1132,7 +1158,11 @@ namespace hw { const std::size_t output_index_x = output_index; const crypto::secret_key sec_x = hw::ledger::decrypt(sec); crypto::secret_key derived_sec_x; - this->controle_device.derive_secret_key(derivation_x, output_index_x, sec_x, derived_sec_x); + hw::ledger::log_hexbuffer("derive_secret_key: [[IN]] derivation ", derivation_x.data, 32); + hw::ledger::log_message ("derive_secret_key: [[IN]] index ", std::to_string(output_index_x)); + hw::ledger::log_hexbuffer("derive_secret_key: [[IN]] sec ", sec_x.data, 32); + this->controle_device->derive_secret_key(derivation_x, output_index_x, sec_x, derived_sec_x); + hw::ledger::log_hexbuffer("derive_secret_key: [[OUT]] derived_sec", derived_sec_x.data, 32); #endif reset_buffer(); @@ -1192,7 +1222,11 @@ namespace hw { const std::size_t output_index_x = output_index; const crypto::public_key pub_x = pub; crypto::public_key derived_pub_x; - this->controle_device.derive_public_key(derivation_x, output_index_x, pub_x, derived_pub_x); + hw::ledger::log_hexbuffer("derive_public_key: [[IN]] derivation ", derivation_x.data, 32); + hw::ledger::log_message ("derive_public_key: [[IN]] output_index", std::to_string(output_index_x)); + hw::ledger::log_hexbuffer("derive_public_key: [[IN]] pub ", pub_x.data, 32); + this->controle_device->derive_public_key(derivation_x, output_index_x, pub_x, derived_pub_x); + hw::ledger::log_hexbuffer("derive_public_key: [[OUT]] derived_pub ", derived_pub_x.data, 32); #endif reset_buffer(); @@ -1249,7 +1283,12 @@ namespace hw { #ifdef DEBUG_HWDEVICE const crypto::secret_key sec_x = hw::ledger::decrypt(sec); crypto::public_key pub_x; - this->controle_device.secret_key_to_public_key(sec_x, pub_x); + hw::ledger::log_hexbuffer("secret_key_to_public_key: [[IN]] sec ", sec_x.data, 32); + bool rc = this->controle_device->secret_key_to_public_key(sec_x, pub_x); + hw::ledger::log_hexbuffer("secret_key_to_public_key: [[OUT]] pub", pub_x.data, 32); + if (!rc){ + hw::ledger::log_message("secret_key_to_public_key", "secret_key rejected"); + } #endif reset_buffer(); @@ -1298,7 +1337,10 @@ namespace hw { const crypto::public_key pub_x = pub; const crypto::secret_key sec_x = hw::ledger::decrypt(sec); crypto::key_image image_x; - this->controle_device.generate_key_image(pub_x, sec_x, image_x); + hw::ledger::log_hexbuffer("generate_key_image: [[IN]] pub ", pub_x.data, 32); + hw::ledger::log_hexbuffer("generate_key_image: [[IN]] sec ", sec_x.data, 32); + this->controle_device->generate_key_image(pub_x, sec_x, image_x); + hw::ledger::log_hexbuffer("generate_key_image: [[OUT]] image ", image_x.data, 32); #endif reset_buffer(); @@ -1425,7 +1467,7 @@ namespace hw { const crypto::public_key public_key_x = public_key; const crypto::secret_key secret_key_x = hw::ledger::decrypt(secret_key); crypto::hash8 payment_id_x = payment_id; - this->controle_device.encrypt_payment_id(public_key_x, secret_key_x, payment_id_x); + this->controle_device->encrypt_payment_id(public_key_x, secret_key_x, payment_id_x); #endif reset_buffer(); @@ -1466,11 +1508,11 @@ namespace hw { return true; } - bool device_ledger::add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, size_t real_output_index, - const rct::key &amount_key, const crypto::public_key &out_eph_public_key) { + bool device_ledger::add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index, + const rct::key &amount_key, const crypto::public_key &out_eph_public_key) { lock_device(); try { - key_map.add(ABPkeys(rct::pk2rct(Aout),rct::pk2rct(Bout), real_output_index, rct::pk2rct(out_eph_public_key), amount_key)); + key_map.add(ABPkeys(rct::pk2rct(Aout),rct::pk2rct(Bout), is_subaddress, real_output_index, rct::pk2rct(out_eph_public_key), amount_key)); unlock_device(); }catch (...) { unlock_device(); @@ -1488,7 +1530,7 @@ namespace hw { #ifdef DEBUG_HWDEVICE const rct::key AKout_x = hw::ledger::decrypt(AKout); rct::ecdhTuple unmasked_x = unmasked; - this->controle_device.ecdhEncode(AKout_x, unmasked_x); + this->controle_device->ecdhEncode(unmasked_x, AKout_x); #endif reset_buffer(); @@ -1543,7 +1585,7 @@ namespace hw { #ifdef DEBUG_HWDEVICE const rct::key AKout_x = hw::ledger::decrypt(AKout); rct::ecdhTuple masked_x = masked; - this->controle_device.ecdhDecode(AKout_x, masked_x); + this->controle_device->ecdhDecode(masked_x, AKout_x); #endif reset_buffer(); @@ -1604,7 +1646,7 @@ namespace hw { const rct::keyV hashes_x = hashes; const rct::ctkeyV outPk_x = outPk; rct::key prehash_x; - this->controle_device.mlsag_prehash(blob_x, inputs_size_x, outputs_size_x, hashes_x, outPk_x, prehash_x); + this->controle_device->mlsag_prehash(blob_x, inputs_size_x, outputs_size_x, hashes_x, outPk_x, prehash_x); if (inputs_size) { log_message("mlsag_prehash", (std::string("inputs_size not null: ") + std::to_string(inputs_size)).c_str()); } @@ -1629,6 +1671,7 @@ namespace hw { offset += 1; //type + uint8_t type = data[0]; this->buffer_send[offset] = data[0]; offset += 1; @@ -1648,25 +1691,27 @@ namespace hw { this->exchange(); //pseudoOuts - for ( i = 0; i < inputs_size; i++) { - reset_buffer(); - this->buffer_send[0] = 0x00; - this->buffer_send[1] = INS_VALIDATE; - this->buffer_send[2] = 0x01; - this->buffer_send[3] = i+2; - this->buffer_send[4] = 0x00; - offset = 5; - //options - this->buffer_send[offset] = (i==inputs_size-1)? 0x00:0x80; - offset += 1; - //pseudoOut - memmove(this->buffer_send+offset, data+data_offset,32); - offset += 32; - data_offset += 32; - - this->buffer_send[4] = offset-5; - this->length_send = offset; - this->exchange(); + if ((type == rct::RCTTypeSimple) || (type == rct::RCTTypeSimpleBulletproof)) { + for ( i = 0; i < inputs_size; i++) { + reset_buffer(); + this->buffer_send[0] = 0x00; + this->buffer_send[1] = INS_VALIDATE; + this->buffer_send[2] = 0x01; + this->buffer_send[3] = i+2; + this->buffer_send[4] = 0x00; + offset = 5; + //options + this->buffer_send[offset] = (i==inputs_size-1)? 0x00:0x80; + offset += 1; + //pseudoOut + memmove(this->buffer_send+offset, data+data_offset,32); + offset += 32; + data_offset += 32; + + this->buffer_send[4] = offset-5; + this->length_send = offset; + this->exchange(); + } } // ====== Aout, Bout, AKout, C, v, k ====== @@ -1693,6 +1738,9 @@ namespace hw { this->buffer_send[offset] = (i==outputs_size-1)? 0x00:0x80 ; offset += 1; if (found) { + //is_subaddress + this->buffer_send[offset] = outKeys.is_subaddress; + offset++; //Aout memmove(this->buffer_send+offset, outKeys.Aout.bytes, 32); offset+=32; @@ -1703,8 +1751,8 @@ namespace hw { memmove(this->buffer_send+offset, outKeys.AKout.bytes, 32); offset+=32; } else { - // dummy: Aout Bout AKout - offset += 32*3; + // dummy: is_subaddress Aout Bout AKout + offset += 1+32*3; } //C memmove(this->buffer_send+offset, data+C_offset,32); @@ -1905,7 +1953,7 @@ namespace hw { #ifdef DEBUG_HWDEVICE const rct::keyV long_message_x = long_message; rct::key c_x; - this->controle_device.mlsag_hash(long_message_x, c_x); + this->controle_device->mlsag_hash(long_message_x, c_x); #endif cnt = long_message.size(); @@ -1964,7 +2012,7 @@ namespace hw { const int rows_x = rows; const int dsRows_x = dsRows; rct::keyV ss_x(ss.size()); - this->controle_device.mlsag_sign(c_x, xx_x, alpha_x, rows_x, dsRows_x, ss_x); + this->controle_device->mlsag_sign(c_x, xx_x, alpha_x, rows_x, dsRows_x, ss_x); #endif for (size_t j = 0; j < dsRows; j++) { diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp index ab8e0c553..37e35167c 100644 --- a/src/device/device_ledger.hpp +++ b/src/device/device_ledger.hpp @@ -56,12 +56,13 @@ namespace hw { public: rct::key Aout; rct::key Bout; + bool is_subaddress; size_t index; rct::key Pout; rct::key AKout; - ABPkeys(const rct::key& A, const rct::key& B, size_t index, const rct::key& P,const rct::key& AK); + ABPkeys(const rct::key& A, const rct::key& B, const bool is_subaddr, size_t index, const rct::key& P,const rct::key& AK); ABPkeys(const ABPkeys& keys) ; - ABPkeys() {index=0;} + ABPkeys() {index=0;is_subaddress=false;} }; class Keymap { @@ -103,8 +104,8 @@ namespace hw { unsigned int exchange(unsigned int ok=0x9000, unsigned int mask=0xFFFF); void reset_buffer(void); - #ifdef DEBUGLEDGER - Device &controle_device; + #ifdef DEBUG_HWDEVICE + device *controle_device; #endif public: @@ -174,8 +175,8 @@ namespace hw { bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override; bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) override; - bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, size_t real_output_index, - const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override; + bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index, + const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override; bool mlsag_prehash(const std::string &blob, size_t inputs_size, size_t outputs_size, const rct::keyV &hashes, const rct::ctkeyV &outPk, rct::key &prehash) override; @@ -190,7 +191,7 @@ namespace hw { - #ifdef DEBUGLEDGER + #ifdef DEBUG_HWDEVICE extern crypto::secret_key viewkey; extern crypto::secret_key spendkey; #endif diff --git a/src/device/log.cpp b/src/device/log.cpp index 103b2b3ba..a2ad0f4f4 100644 --- a/src/device/log.cpp +++ b/src/device/log.cpp @@ -55,14 +55,14 @@ namespace hw { MDEBUG(msg << ": " << info); } - #ifdef DEBUGLEDGER + #ifdef DEBUG_HWDEVICE extern crypto::secret_key viewkey; extern crypto::secret_key spendkey; void decrypt(char* buf, size_t len) { - #ifdef IODUMMYCRYPT - int i; + #ifdef IODUMMYCRYPT_HWDEVICE + size_t i; if (len == 32) { //view key? for (i = 0; i<32; i++) { @@ -144,7 +144,7 @@ namespace hw { log_hexbuffer(" device", dd, len); } else { - buffer_to_str(logstr, dd, len); + buffer_to_str(logstr, 128, dd, len); log_message("ASSERT EQ OK", msg + ": "+ info + ": "+ std::string(logstr) ); } } diff --git a/src/gen_multisig/gen_multisig.cpp b/src/gen_multisig/gen_multisig.cpp index 9bcf4495c..e165b8053 100644 --- a/src/gen_multisig/gen_multisig.cpp +++ b/src/gen_multisig/gen_multisig.cpp @@ -73,11 +73,12 @@ namespace const command_line::arg_descriptor<uint32_t> arg_threshold = {"threshold", genms::tr("How many signers are required to sign a valid transaction"), 0}; const command_line::arg_descriptor<bool, false> arg_testnet = {"testnet", genms::tr("Create testnet multisig wallets"), false}; const command_line::arg_descriptor<bool, false> arg_stagenet = {"stagenet", genms::tr("Create stagenet multisig wallets"), false}; + const command_line::arg_descriptor<bool, false> arg_create_address_file = {"create-address-file", genms::tr("Create an address file for new wallets"), false}; const command_line::arg_descriptor< std::vector<std::string> > arg_command = {"command", ""}; } -static bool generate_multisig(uint32_t threshold, uint32_t total, const std::string &basename, network_type nettype) +static bool generate_multisig(uint32_t threshold, uint32_t total, const std::string &basename, network_type nettype, bool create_address_file) { tools::msg_writer() << (boost::format(genms::tr("Generating %u %u/%u multisig wallets")) % total % threshold % total).str(); @@ -92,7 +93,7 @@ static bool generate_multisig(uint32_t threshold, uint32_t total, const std::str std::string name = basename + "-" + std::to_string(n + 1); wallets[n].reset(new tools::wallet2(nettype)); wallets[n]->init(""); - wallets[n]->generate(name, pwd_container->password(), rct::rct2sk(rct::skGen()), false, false); + wallets[n]->generate(name, pwd_container->password(), rct::rct2sk(rct::skGen()), false, false, create_address_file); } // gather the keys @@ -171,6 +172,7 @@ int main(int argc, char* argv[]) command_line::add_arg(desc_params, arg_participants); command_line::add_arg(desc_params, arg_testnet); command_line::add_arg(desc_params, arg_stagenet); + command_line::add_arg(desc_params, arg_create_address_file); const auto vm = wallet_args::main( argc, argv, @@ -241,7 +243,8 @@ int main(int argc, char* argv[]) tools::fail_msg_writer() << genms::tr("Error: unsupported scheme: only N/N and N-1/N are supported"); return 1; } - if (!generate_multisig(threshold, total, basename, testnet ? TESTNET : stagenet ? STAGENET : MAINNET)) + bool create_address_file = command_line::get_arg(*vm, arg_create_address_file); + if (!generate_multisig(threshold, total, basename, testnet ? TESTNET : stagenet ? STAGENET : MAINNET, create_address_file)) return 1; return 0; diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index a33bf13c7..3a81e89ed 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -86,9 +86,9 @@ typedef cryptonote::simple_wallet sw; #define EXTENDED_LOGS_FILE "wallet_details.log" -#define DEFAULT_MIX 4 +#define DEFAULT_MIX 6 -#define MIN_RING_SIZE 5 // Used to inform user about min ring size -- does not track actual protocol +#define MIN_RING_SIZE 7 // Used to inform user about min ring size -- does not track actual protocol #define OUTPUT_EXPORT_FILE_MAGIC "Monero output export\003" @@ -134,6 +134,7 @@ namespace const command_line::arg_descriptor<bool> arg_allow_mismatched_daemon_version = {"allow-mismatched-daemon-version", sw::tr("Allow communicating with a daemon that uses a different RPC version"), false}; const command_line::arg_descriptor<uint64_t> arg_restore_height = {"restore-height", sw::tr("Restore from specific blockchain height"), 0}; const command_line::arg_descriptor<bool> arg_do_not_relay = {"do-not-relay", sw::tr("The newly created transaction will not be relayed to the monero network"), false}; + const command_line::arg_descriptor<bool> arg_create_address_file = {"create-address-file", sw::tr("Create an address file for new wallets"), false}; const command_line::arg_descriptor< std::vector<std::string> > arg_command = {"command", ""}; @@ -606,10 +607,7 @@ bool simple_wallet::print_seed(bool encrypted) epee::wipeable_string seed_pass; if (encrypted) { -#ifdef HAVE_READLINE - rdln::suspend_readline pause_readline; -#endif - auto pwd_container = tools::password_container::prompt(true, tr("Enter optional seed encryption passphrase, empty to see raw seed")); + auto pwd_container = password_prompter(tr("Enter optional seed encryption passphrase, empty to see raw seed"), true); if (std::cin.eof() || !pwd_container) return true; seed_pass = pwd_container->password(); @@ -2244,10 +2242,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm) } } -#ifdef HAVE_READLINE - rdln::suspend_readline pause_readline; -#endif - auto pwd_container = tools::password_container::prompt(false, tr("Enter seed encryption passphrase, empty if none")); + auto pwd_container = password_prompter(tr("Enter seed encryption passphrase, empty if none"), false); if (std::cin.eof() || !pwd_container) return false; epee::wipeable_string seed_pass = pwd_container->password(); @@ -2854,10 +2849,12 @@ bool simple_wallet::new_wallet(const boost::program_options::variables_map& vm, m_wallet->set_seed_language(mnemonic_language); + bool create_address_file = command_line::get_arg(vm, arg_create_address_file); + crypto::secret_key recovery_val; try { - recovery_val = m_wallet->generate(m_wallet_file, std::move(rc.second).password(), recovery_key, recover, two_random); + recovery_val = m_wallet->generate(m_wallet_file, std::move(rc.second).password(), recovery_key, recover, two_random, create_address_file); message_writer(console_color_white, true) << tr("Generated new wallet: ") << m_wallet->get_account().get_public_address_str(m_wallet->nettype()); std::cout << tr("View key: ") << string_tools::pod_to_hex(m_wallet->get_account().get_keys().m_view_secret_key) << ENDL; @@ -2906,15 +2903,17 @@ bool simple_wallet::new_wallet(const boost::program_options::variables_map& vm, if (m_restore_height) m_wallet->set_refresh_from_block_height(m_restore_height); + bool create_address_file = command_line::get_arg(vm, arg_create_address_file); + try { if (spendkey) { - m_wallet->generate(m_wallet_file, std::move(rc.second).password(), address, *spendkey, viewkey); + m_wallet->generate(m_wallet_file, std::move(rc.second).password(), address, *spendkey, viewkey, create_address_file); } else { - m_wallet->generate(m_wallet_file, std::move(rc.second).password(), address, viewkey); + m_wallet->generate(m_wallet_file, std::move(rc.second).password(), address, viewkey, create_address_file); } message_writer(console_color_white, true) << tr("Generated new wallet: ") << m_wallet->get_account().get_public_address_str(m_wallet->nettype()); @@ -2977,9 +2976,11 @@ bool simple_wallet::new_wallet(const boost::program_options::variables_map& vm, m_wallet->set_seed_language(mnemonic_language); + bool create_address_file = command_line::get_arg(vm, arg_create_address_file); + try { - m_wallet->generate(m_wallet_file, std::move(rc.second).password(), multisig_keys); + m_wallet->generate(m_wallet_file, std::move(rc.second).password(), multisig_keys, create_address_file); bool ready; uint32_t threshold, total; if (!m_wallet->multisig(&ready, &threshold, &total) || !ready) @@ -3141,7 +3142,7 @@ bool simple_wallet::save_watch_only(const std::vector<std::string> &args/* = std return true; } - const auto pwd_container = tools::password_container::prompt(true, tr("Password for new watch-only wallet")); + const auto pwd_container = password_prompter(tr("Password for new watch-only wallet"), true); if (!pwd_container) { @@ -6985,6 +6986,7 @@ int main(int argc, char* argv[]) command_line::add_arg(desc_params, arg_allow_mismatched_daemon_version); command_line::add_arg(desc_params, arg_restore_height); command_line::add_arg(desc_params, arg_do_not_relay); + command_line::add_arg(desc_params, arg_create_address_file); po::positional_options_description positional_options; positional_options.add(arg_command.name, -1); diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index ff0d2fdbd..fb9e8b28b 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -306,8 +306,20 @@ void Wallet::init(const char *argv0, const char *default_log_base_name) { mlog_configure(mlog_get_default_log_path(default_log_base_name), true); } -void Wallet::debug(const std::string &str) { - MDEBUG(str); +void Wallet::debug(const std::string &category, const std::string &str) { + MCDEBUG(category.empty() ? MONERO_DEFAULT_LOG_CATEGORY : category.c_str(), str); +} + +void Wallet::info(const std::string &category, const std::string &str) { + MCINFO(category.empty() ? MONERO_DEFAULT_LOG_CATEGORY : category.c_str(), str); +} + +void Wallet::warning(const std::string &category, const std::string &str) { + MCWARNING(category.empty() ? MONERO_DEFAULT_LOG_CATEGORY : category.c_str(), str); +} + +void Wallet::error(const std::string &category, const std::string &str) { + MCERROR(category.empty() ? MONERO_DEFAULT_LOG_CATEGORY : category.c_str(), str); } ///////////////////////// WalletImpl implementation //////////////////////// diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index a6320545e..8f01e2055 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -541,7 +541,7 @@ struct Wallet static bool addressValid(const std::string &str, NetworkType nettype); static bool addressValid(const std::string &str, bool testnet) // deprecated { - return addressValid(str, testnet ? MAINNET : TESTNET); + return addressValid(str, testnet ? TESTNET : MAINNET); } static bool keyValid(const std::string &secret_key_string, const std::string &address_string, bool isViewKey, NetworkType nettype, std::string &error); static bool keyValid(const std::string &secret_key_string, const std::string &address_string, bool isViewKey, bool testnet, std::string &error) // deprecated @@ -556,7 +556,10 @@ struct Wallet static uint64_t maximumAllowedAmount(); // Easylogger wrapper static void init(const char *argv0, const char *default_log_base_name); - static void debug(const std::string &str); + static void debug(const std::string &category, const std::string &str); + static void info(const std::string &category, const std::string &str); + static void warning(const std::string &category, const std::string &str); + static void error(const std::string &category, const std::string &str); /** * @brief StartRefresh - Start/resume refresh thread (refresh every 10 seconds) diff --git a/src/wallet/api/wallet_manager.cpp b/src/wallet/api/wallet_manager.cpp index 5b6df8a9c..b03332f40 100644 --- a/src/wallet/api/wallet_manager.cpp +++ b/src/wallet/api/wallet_manager.cpp @@ -37,7 +37,7 @@ #include "common/updates.h" #include "version.h" #include "net/http_client.h" -#include "deviuce/device.hpp" +#include "device/device.hpp" #include <boost/filesystem.hpp> #include <boost/regex.hpp> diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 4a6c6fad2..6ec9d9930 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -318,6 +318,9 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file, GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, address, std::string, String, false, std::string()); + GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, create_address_file, int, Int, false, false); + bool create_address_file = field_create_address_file; + // compatibility checks if (!field_seed_found && !field_viewkey_found && !field_spendkey_found) { @@ -372,11 +375,11 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file, { if (!field_seed.empty()) { - wallet->generate(field_filename, field_password, recovery_key, recover, false); + wallet->generate(field_filename, field_password, recovery_key, recover, false, create_address_file); } else if (field_viewkey.empty() && !field_spendkey.empty()) { - wallet->generate(field_filename, field_password, spendkey, recover, false); + wallet->generate(field_filename, field_password, spendkey, recover, false, create_address_file); } else { @@ -402,14 +405,14 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file, { THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("Address must be specified in order to create watch-only wallet")); } - wallet->generate(field_filename, field_password, address, viewkey); + wallet->generate(field_filename, field_password, address, viewkey, create_address_file); } else { if (!crypto::secret_key_to_public_key(spendkey, address.m_spend_public_key)) { THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify spend key secret key")); } - wallet->generate(field_filename, field_password, address, spendkey, viewkey); + wallet->generate(field_filename, field_password, address, spendkey, viewkey, create_address_file); } } } @@ -582,6 +585,14 @@ tools::wallet2::tx_construction_data get_construction_data_with_decrypted_short_ return construction_data; } +uint32_t get_subaddress_clamped_sum(uint32_t idx, uint32_t extra) +{ + static constexpr uint32_t uint32_max = std::numeric_limits<uint32_t>::max(); + if (idx > uint32_max - extra) + return uint32_max; + return idx + extra; +} + //----------------------------------------------------------------- } //namespace @@ -876,9 +887,10 @@ void wallet2::expand_subaddresses(const cryptonote::subaddress_index& index) { // add new accounts cryptonote::subaddress_index index2; - for (index2.major = m_subaddress_labels.size(); index2.major < index.major + m_subaddress_lookahead_major; ++index2.major) + const uint32_t major_end = get_subaddress_clamped_sum(index.major, m_subaddress_lookahead_major); + for (index2.major = m_subaddress_labels.size(); index2.major < major_end; ++index2.major) { - const uint32_t end = (index2.major == index.major ? index.minor : 0) + m_subaddress_lookahead_minor; + const uint32_t end = get_subaddress_clamped_sum((index2.major == index.major ? index.minor : 0), m_subaddress_lookahead_minor); const std::vector<crypto::public_key> pkeys = cryptonote::get_subaddress_spend_public_keys(m_account.get_keys(), index2.major, 0, end, hwdev); for (index2.minor = 0; index2.minor < end; ++index2.minor) { @@ -892,7 +904,7 @@ void wallet2::expand_subaddresses(const cryptonote::subaddress_index& index) else if (m_subaddress_labels[index.major].size() <= index.minor) { // add new subaddresses - const uint32_t end = index.minor + m_subaddress_lookahead_minor; + const uint32_t end = get_subaddress_clamped_sum(index.minor, m_subaddress_lookahead_minor); const uint32_t begin = m_subaddress_labels[index.major].size(); cryptonote::subaddress_index index2 = {index.major, begin}; const std::vector<crypto::public_key> pkeys = cryptonote::get_subaddress_spend_public_keys(m_account.get_keys(), index2.major, index2.minor, end, hwdev); @@ -924,6 +936,8 @@ void wallet2::set_subaddress_label(const cryptonote::subaddress_index& index, co //---------------------------------------------------------------------------------------------------- void wallet2::set_subaddress_lookahead(size_t major, size_t minor) { + THROW_WALLET_EXCEPTION_IF(major > 0xffffffff, error::wallet_internal_error, "Subaddress major lookahead is too large"); + THROW_WALLET_EXCEPTION_IF(minor > 0xffffffff, error::wallet_internal_error, "Subaddress minor lookahead is too large"); m_subaddress_lookahead_major = major; m_subaddress_lookahead_minor = minor; } @@ -2740,7 +2754,7 @@ bool wallet2::verify_password(const std::string& keys_file_name, const epee::wip * \param multisig_data The multisig restore info and keys */ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password, - const std::string& multisig_data) + const std::string& multisig_data, bool create_address_file) { clear(); prepare_file_names(wallet_); @@ -2812,8 +2826,11 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (m_nettype != MAINNET || create_address_file) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } cryptonote::block b; @@ -2835,7 +2852,7 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& * \return The secret key of the generated wallet */ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password, - const crypto::secret_key& recovery_param, bool recover, bool two_random) + const crypto::secret_key& recovery_param, bool recover, bool two_random, bool create_address_file) { clear(); prepare_file_names(wallet_); @@ -2866,8 +2883,11 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wip bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (m_nettype != MAINNET || create_address_file) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } cryptonote::block b; @@ -2931,7 +2951,7 @@ crypto::secret_key wallet2::generate(const std::string& wallet_, const epee::wip */ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password, const cryptonote::account_public_address &account_public_address, - const crypto::secret_key& viewkey) + const crypto::secret_key& viewkey, bool create_address_file) { clear(); prepare_file_names(wallet_); @@ -2956,8 +2976,11 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& bool r = store_keys(m_keys_file, password, true); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (m_nettype != MAINNET || create_address_file) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } cryptonote::block b; @@ -2978,7 +3001,7 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& */ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& password, const cryptonote::account_public_address &account_public_address, - const crypto::secret_key& spendkey, const crypto::secret_key& viewkey) + const crypto::secret_key& spendkey, const crypto::secret_key& viewkey, bool create_address_file) { clear(); prepare_file_names(wallet_); @@ -3003,8 +3026,11 @@ void wallet2::generate(const std::string& wallet_, const epee::wipeable_string& bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (m_nettype != MAINNET || create_address_file) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } cryptonote::block b; @@ -3136,8 +3162,11 @@ std::string wallet2::make_multisig(const epee::wipeable_string &password, bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (boost::filesystem::exists(m_wallet_file + ".address.txt")) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } cryptonote::block b; @@ -3236,8 +3265,11 @@ bool wallet2::finalize_multisig(const epee::wipeable_string &password, std::unor bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); - if(!r) MERROR("String with address text not saved"); + if (boost::filesystem::exists(m_wallet_file + ".address.txt")) + { + r = file_io_utils::save_string_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype)); + if(!r) MERROR("String with address text not saved"); + } } m_subaddresses.clear(); @@ -3760,10 +3792,13 @@ void wallet2::store_to(const std::string &path, const epee::wipeable_string &pas prepare_file_names(path); bool r = store_keys(m_keys_file, password, false); THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_keys_file); - // save address to the new file - const std::string address_file = m_wallet_file + ".address.txt"; - r = file_io_utils::save_string_to_file(address_file, m_account.get_public_address_str(m_nettype)); - THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_wallet_file); + if (boost::filesystem::exists(old_address_file)) + { + // save address to the new file + const std::string address_file = m_wallet_file + ".address.txt"; + r = file_io_utils::save_string_to_file(address_file, m_account.get_public_address_str(m_nettype)); + THROW_WALLET_EXCEPTION_IF(!r, error::file_save_error, m_wallet_file); + } // remove old wallet file r = boost::filesystem::remove(old_file); if (!r) { @@ -5089,7 +5124,11 @@ int wallet2::get_fee_algorithm() const //------------------------------------------------------------------------------------------------------------------------------ uint64_t wallet2::adjust_mixin(uint64_t mixin) const { - if (mixin < 4 && use_fork_rules(6, 10)) { + if (mixin < 6 && use_fork_rules(7, 10)) { + MWARNING("Requested ring size " << (mixin + 1) << " too low for hard fork 7, using 7"); + mixin = 6; + } + else if (mixin < 4 && use_fork_rules(6, 10)) { MWARNING("Requested ring size " << (mixin + 1) << " too low for hard fork 6, using 5"); mixin = 4; } @@ -6673,6 +6712,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp cryptonote::transaction tx; pending_tx ptx; size_t bytes; + std::vector<std::vector<tools::wallet2::get_outs_entry>> outs; void add(const account_public_address &addr, bool is_subaddress, uint64_t amount, unsigned int original_output_index, bool merge_destinations) { if (merge_destinations) @@ -7062,40 +7102,10 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_2(std::vector<cryp LOG_PRINT_L2("Made a final " << get_size_string(txBlob) << " tx, with " << print_money(test_ptx.fee) << " fee and " << print_money(test_ptx.change_dts.amount) << " change"); - if ((!dsts.empty()) || - (dsts.empty() && !(adding_fee || !preferred_inputs.empty() || should_pick_a_second_output(use_rct, txes.back().selected_transfers.size(), *unused_transfers_indices, *unused_dust_indices)) ) - ) { - hwdev.set_signature_mode(hw::device::SIGNATURE_REAL); - if (use_rct) { - transfer_selected_rct(tx.dsts, /* NOMOD std::vector<cryptonote::tx_destination_entry> dsts,*/ - tx.selected_transfers, /* const std::list<size_t> selected_transfers */ - fake_outs_count, /* CONST size_t fake_outputs_count, */ - outs, /* MOD std::vector<std::vector<tools::wallet2::get_outs_entry>> &outs, */ - unlock_time, /* CONST uint64_t unlock_time, */ - needed_fee, /* CONST uint64_t fee, */ - extra, /* const std::vector<uint8_t>& extra, */ - test_tx, /* OUT cryptonote::transaction& tx, */ - test_ptx, /* OUT cryptonote::transaction& tx, */ - bulletproof); - } else { - transfer_selected(tx.dsts, - tx.selected_transfers, - fake_outs_count, - outs, - unlock_time, - needed_fee, - extra, - detail::digit_split_strategy, - tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), - test_tx, - test_ptx); - } - hwdev.set_signature_mode(hw::device::SIGNATURE_FAKE); - } - tx.tx = test_tx; tx.ptx = test_ptx; tx.bytes = txBlob.size(); + tx.outs = outs; accumulated_fee += test_ptx.fee; accumulated_change += test_ptx.change_dts.amount; adding_fee = false; @@ -7135,6 +7145,42 @@ skip_tx: LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) << " total fee, " << print_money(accumulated_change) << " total change"); + hwdev.set_signature_mode(hw::device::SIGNATURE_REAL); + for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i) + { + TX &tx = *i; + cryptonote::transaction test_tx; + pending_tx test_ptx; + if (use_rct) { + transfer_selected_rct(tx.dsts, /* NOMOD std::vector<cryptonote::tx_destination_entry> dsts,*/ + tx.selected_transfers, /* const std::list<size_t> selected_transfers */ + fake_outs_count, /* CONST size_t fake_outputs_count, */ + tx.outs, /* MOD std::vector<std::vector<tools::wallet2::get_outs_entry>> &outs, */ + unlock_time, /* CONST uint64_t unlock_time, */ + needed_fee, /* CONST uint64_t fee, */ + extra, /* const std::vector<uint8_t>& extra, */ + test_tx, /* OUT cryptonote::transaction& tx, */ + test_ptx, /* OUT cryptonote::transaction& tx, */ + bulletproof); + } else { + transfer_selected(tx.dsts, + tx.selected_transfers, + fake_outs_count, + tx.outs, + unlock_time, + needed_fee, + extra, + detail::digit_split_strategy, + tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), + test_tx, + test_ptx); + } + auto txBlob = t_serializable_object_to_blob(test_ptx.tx); + tx.tx = test_tx; + tx.ptx = test_ptx; + tx.bytes = txBlob.size(); + } + std::vector<wallet2::pending_tx> ptx_vector; for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i) { @@ -7237,6 +7283,7 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton cryptonote::transaction tx; pending_tx ptx; size_t bytes; + std::vector<std::vector<get_outs_entry>> outs; }; std::vector<TX> txes; uint64_t needed_fee, available_for_fee = 0; @@ -7328,24 +7375,13 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton " fee and " << print_money(test_ptx.change_dts.amount) << " change"); } while (needed_fee > test_ptx.fee); - if (!unused_transfers_indices.empty() || !unused_dust_indices.empty()) { - hwdev.set_signature_mode(hw::device::SIGNATURE_REAL); - if (use_rct) { - transfer_selected_rct(tx.dsts, tx.selected_transfers, fake_outs_count, outs, unlock_time, needed_fee, extra, - test_tx, test_ptx, bulletproof); - } else { - transfer_selected(tx.dsts, tx.selected_transfers, fake_outs_count, outs, unlock_time, needed_fee, extra, - detail::digit_split_strategy, tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), test_tx, test_ptx); - } - hwdev.set_signature_mode(hw::device::SIGNATURE_FAKE); - } - LOG_PRINT_L2("Made a final " << get_size_string(txBlob) << " tx, with " << print_money(test_ptx.fee) << " fee and " << print_money(test_ptx.change_dts.amount) << " change"); tx.tx = test_tx; tx.ptx = test_ptx; tx.bytes = txBlob.size(); + tx.outs = outs; accumulated_fee += test_ptx.fee; accumulated_change += test_ptx.change_dts.amount; if (!unused_transfers_indices.empty() || !unused_dust_indices.empty()) @@ -7358,6 +7394,25 @@ std::vector<wallet2::pending_tx> wallet2::create_transactions_from(const crypton LOG_PRINT_L1("Done creating " << txes.size() << " transactions, " << print_money(accumulated_fee) << " total fee, " << print_money(accumulated_change) << " total change"); + + hwdev.set_signature_mode(hw::device::SIGNATURE_REAL); + for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i) + { + TX &tx = *i; + cryptonote::transaction test_tx; + pending_tx test_ptx; + if (use_rct) { + transfer_selected_rct(tx.dsts, tx.selected_transfers, fake_outs_count, tx.outs, unlock_time, needed_fee, extra, + test_tx, test_ptx, bulletproof); + } else { + transfer_selected(tx.dsts, tx.selected_transfers, fake_outs_count, tx.outs, unlock_time, needed_fee, extra, + detail::digit_split_strategy, tx_dust_policy(::config::DEFAULT_DUST_THRESHOLD), test_tx, test_ptx); + } + auto txBlob = t_serializable_object_to_blob(test_ptx.tx); + tx.tx = test_tx; + tx.ptx = test_ptx; + tx.bytes = txBlob.size(); + } std::vector<wallet2::pending_tx> ptx_vector; for (std::vector<TX>::iterator i = txes.begin(); i != txes.end(); ++i) diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 57a61cb9d..9d4a7d75a 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -449,44 +449,48 @@ namespace tools /*! * \brief Generates a wallet or restores one. - * \param wallet_ Name of wallet file - * \param password Password of wallet file - * \param multisig_data The multisig restore info and keys + * \param wallet_ Name of wallet file + * \param password Password of wallet file + * \param multisig_data The multisig restore info and keys + * \param create_address_file Whether to create an address file */ void generate(const std::string& wallet_, const epee::wipeable_string& password, - const std::string& multisig_data); + const std::string& multisig_data, bool create_address_file = false); /*! * \brief Generates a wallet or restores one. - * \param wallet_ Name of wallet file - * \param password Password of wallet file - * \param recovery_param If it is a restore, the recovery key - * \param recover Whether it is a restore - * \param two_random Whether it is a non-deterministic wallet - * \return The secret key of the generated wallet + * \param wallet_ Name of wallet file + * \param password Password of wallet file + * \param recovery_param If it is a restore, the recovery key + * \param recover Whether it is a restore + * \param two_random Whether it is a non-deterministic wallet + * \param create_address_file Whether to create an address file + * \return The secret key of the generated wallet */ crypto::secret_key generate(const std::string& wallet, const epee::wipeable_string& password, const crypto::secret_key& recovery_param = crypto::secret_key(), bool recover = false, - bool two_random = false); + bool two_random = false, bool create_address_file = false); /*! * \brief Creates a wallet from a public address and a spend/view secret key pair. - * \param wallet_ Name of wallet file - * \param password Password of wallet file - * \param viewkey view secret key - * \param spendkey spend secret key + * \param wallet_ Name of wallet file + * \param password Password of wallet file + * \param viewkey view secret key + * \param spendkey spend secret key + * \param create_address_file Whether to create an address file */ void generate(const std::string& wallet, const epee::wipeable_string& password, const cryptonote::account_public_address &account_public_address, - const crypto::secret_key& spendkey, const crypto::secret_key& viewkey); + const crypto::secret_key& spendkey, const crypto::secret_key& viewkey, bool create_address_file = false); /*! * \brief Creates a watch only wallet from a public address and a view secret key. - * \param wallet_ Name of wallet file - * \param password Password of wallet file - * \param viewkey view secret key + * \param wallet_ Name of wallet file + * \param password Password of wallet file + * \param viewkey view secret key + * \param create_address_file Whether to create an address file */ void generate(const std::string& wallet, const epee::wipeable_string& password, const cryptonote::account_public_address &account_public_address, - const crypto::secret_key& viewkey = crypto::secret_key()); + const crypto::secret_key& viewkey = crypto::secret_key(), bool create_address_file = false); /*! * \brief Restore a wallet hold by an HW. * \param wallet_ Name of wallet file diff --git a/src/wallet/wallet_rpc_server_commands_defs.h b/src/wallet/wallet_rpc_server_commands_defs.h index 370fea858..a0f43c9b9 100644 --- a/src/wallet/wallet_rpc_server_commands_defs.h +++ b/src/wallet/wallet_rpc_server_commands_defs.h @@ -398,7 +398,7 @@ namespace wallet_rpc KV_SERIALIZE(account_index) KV_SERIALIZE(subaddr_indices) KV_SERIALIZE(priority) - KV_SERIALIZE(mixin) + KV_SERIALIZE_OPT(mixin, (uint64_t)0) KV_SERIALIZE_OPT(ring_size, (uint64_t)0) KV_SERIALIZE(unlock_time) KV_SERIALIZE(payment_id) @@ -455,7 +455,7 @@ namespace wallet_rpc KV_SERIALIZE(account_index) KV_SERIALIZE(subaddr_indices) KV_SERIALIZE(priority) - KV_SERIALIZE(mixin) + KV_SERIALIZE_OPT(mixin, (uint64_t)0) KV_SERIALIZE_OPT(ring_size, (uint64_t)0) KV_SERIALIZE(unlock_time) KV_SERIALIZE(payment_id) @@ -568,7 +568,7 @@ namespace wallet_rpc KV_SERIALIZE(account_index) KV_SERIALIZE(subaddr_indices) KV_SERIALIZE(priority) - KV_SERIALIZE(mixin) + KV_SERIALIZE_OPT(mixin, (uint64_t)0) KV_SERIALIZE_OPT(ring_size, (uint64_t)0) KV_SERIALIZE(unlock_time) KV_SERIALIZE(payment_id) @@ -630,7 +630,7 @@ namespace wallet_rpc BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(address) KV_SERIALIZE(priority) - KV_SERIALIZE(mixin) + KV_SERIALIZE_OPT(mixin, (uint64_t)0) KV_SERIALIZE_OPT(ring_size, (uint64_t)0) KV_SERIALIZE(unlock_time) KV_SERIALIZE(payment_id) diff --git a/tests/fuzz/cold-outputs.cpp b/tests/fuzz/cold-outputs.cpp index 9aa9460d5..59b59810c 100644 --- a/tests/fuzz/cold-outputs.cpp +++ b/tests/fuzz/cold-outputs.cpp @@ -54,6 +54,7 @@ int ColdOutputsFuzzer::init() try { wallet.init(""); + wallet.set_subaddress_lookahead(1, 1); wallet.generate("", "", spendkey, true, false); } catch (const std::exception &e) diff --git a/tests/fuzz/cold-transaction.cpp b/tests/fuzz/cold-transaction.cpp index d81092c82..da33dc318 100644 --- a/tests/fuzz/cold-transaction.cpp +++ b/tests/fuzz/cold-transaction.cpp @@ -55,6 +55,7 @@ int ColdTransactionFuzzer::init() try { wallet.init(""); + wallet.set_subaddress_lookahead(1, 1); wallet.generate("", "", spendkey, true, false); } catch (const std::exception &e) diff --git a/tests/fuzz/signature.cpp b/tests/fuzz/signature.cpp index 2b8ffe465..7f22757b2 100644 --- a/tests/fuzz/signature.cpp +++ b/tests/fuzz/signature.cpp @@ -55,6 +55,7 @@ int SignatureFuzzer::init() try { wallet.init(""); + wallet.set_subaddress_lookahead(1, 1); wallet.generate("", "", spendkey, true, false); cryptonote::address_parse_info info; diff --git a/tests/hash/CMakeLists.txt b/tests/hash/CMakeLists.txt index e2aca8517..92abeca20 100644 --- a/tests/hash/CMakeLists.txt +++ b/tests/hash/CMakeLists.txt @@ -43,7 +43,7 @@ set_property(TARGET hash-tests PROPERTY FOLDER "tests") -foreach (hash IN ITEMS fast slow tree extra-blake extra-groestl extra-jh extra-skein) +foreach (hash IN ITEMS fast slow slow-1 tree extra-blake extra-groestl extra-jh extra-skein) add_test( NAME "hash-${hash}" COMMAND hash-tests "${hash}" "${CMAKE_CURRENT_SOURCE_DIR}/tests-${hash}.txt") diff --git a/tests/hash/main.cpp b/tests/hash/main.cpp index aa928856a..5a16284df 100644 --- a/tests/hash/main.cpp +++ b/tests/hash/main.cpp @@ -51,6 +51,12 @@ extern "C" { } tree_hash((const char (*)[32]) data, length >> 5, hash); } + static void cn_slow_hash_0(const void *data, size_t length, char *hash) { + return cn_slow_hash(data, length, hash, 0); + } + static void cn_slow_hash_1(const void *data, size_t length, char *hash) { + return cn_slow_hash(data, length, hash, 1); + } } POP_WARNINGS @@ -58,9 +64,10 @@ extern "C" typedef void hash_f(const void *, size_t, char *); struct hash_func { const string name; hash_f &f; -} hashes[] = {{"fast", cn_fast_hash}, {"slow", cn_slow_hash}, {"tree", hash_tree}, +} hashes[] = {{"fast", cn_fast_hash}, {"slow", cn_slow_hash_0}, {"tree", hash_tree}, {"extra-blake", hash_extra_blake}, {"extra-groestl", hash_extra_groestl}, - {"extra-jh", hash_extra_jh}, {"extra-skein", hash_extra_skein}}; + {"extra-jh", hash_extra_jh}, {"extra-skein", hash_extra_skein}, + {"slow-1", cn_slow_hash_1}}; int main(int argc, char *argv[]) { hash_f *f; diff --git a/tests/hash/tests-slow-1.txt b/tests/hash/tests-slow-1.txt new file mode 100644 index 000000000..ed8eccc22 --- /dev/null +++ b/tests/hash/tests-slow-1.txt @@ -0,0 +1,5 @@ +b5a7f63abb94d07d1a6445c36c07c7e8327fe61b1647e391b4c7edae5de57a3d 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +80563c40ed46575a9e44820d93ee095e2851aa22483fd67837118c6cd951ba61 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +5bb40c5880cef2f739bdb6aaaf16161eaae55530e7b10d7ea996b751a299e949 8519e039172b0d70e5ca7b3383d6b3167315a422747b73f019cf9528f0fde341fd0f2a63030ba6450525cf6de31837669af6f1df8131faf50aaab8d3a7405589 +613e638505ba1fd05f428d5c9f8e08f8165614342dac419adc6a47dce257eb3e 37a636d7dafdf259b7287eddca2f58099e98619d2f99bdb8969d7b14498102cc065201c8be90bd777323f449848b215d2977c92c4c1c2da36ab46b2e389689ed97c18fec08cd3b03235c5e4c62a37ad88c7b67932495a71090e85dd4020a9300 +ed082e49dbd5bbe34a3726a0d1dad981146062b39d36d62c71eb1ed8ab49459b 38274c97c45a172cfc97679870422e3a1ab0784960c60514d816271415c306ee3a3ed1a77e31f6a885c3cb diff --git a/translations/monero_fr.ts b/translations/monero_fr.ts index 37d7d5928..a52d1a11f 100644 --- a/translations/monero_fr.ts +++ b/translations/monero_fr.ts @@ -21,7 +21,7 @@ <message> <location filename="../src/wallet/api/address_book.cpp" line="77"/> <source>Integrated address and long payment ID can't be used at the same time</source> - <translation type="unfinished"></translation> + <translation>Adresse intégrée et ID de paiement long ne peuvent pas être utilisés en même temps</translation> </message> </context> <context> @@ -118,7 +118,7 @@ <message> <location filename="../src/wallet/api/unsigned_transaction.cpp" line="214"/> <source>Loaded %lu transactions, for %s, fee %s, %s, %s, with min ring size %lu. %s</source> - <translation type="unfinished"></translation> + <translation>%lu transactions chargées, pour %s, frais %s, %s, %s, taille de cercle minimum %lu, %s</translation> </message> </context> <context> @@ -155,18 +155,18 @@ <location filename="../src/wallet/api/wallet.cpp" line="1197"/> <location filename="../src/wallet/api/wallet.cpp" line="1301"/> <source>not enough outputs for specified ring size</source> - <translation type="unfinished"></translation> + <translation>pas assez de sorties pour la taille de cercle spécifiée</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1199"/> <location filename="../src/wallet/api/wallet.cpp" line="1303"/> <source>found outputs to use</source> - <translation type="unfinished"></translation> + <translation>sorties à utiliser trouvées</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1201"/> <source>Please sweep unmixable outputs.</source> - <translation type="unfinished"></translation> + <translation>Veuillez balayer les sorties non mélangeables.</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1267"/> @@ -227,7 +227,7 @@ <message> <location filename="../src/wallet/api/wallet.cpp" line="773"/> <source>Failed to send import wallet request</source> - <translation type="unfinished"></translation> + <translation>Échec de l'envoi de la requête d'importation de portefeuille</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="919"/> @@ -252,7 +252,7 @@ <message> <location filename="../src/wallet/api/wallet.cpp" line="986"/> <source>Key images can only be imported with a trusted daemon</source> - <translation type="unfinished"></translation> + <translation>Les images de clé ne peuvent être importées qu'avec un démon de confiance</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="999"/> @@ -262,12 +262,12 @@ <message> <location filename="../src/wallet/api/wallet.cpp" line="1032"/> <source>Failed to get subaddress label: </source> - <translation type="unfinished"></translation> + <translation>Échec de la récupération de l'étiquette de sous-adresse : </translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1046"/> <source>Failed to set subaddress label: </source> - <translation type="unfinished"></translation> + <translation>Échec de l'affectation de l'étiquette de sous-adresse : </translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1163"/> @@ -278,7 +278,7 @@ <location filename="../src/wallet/api/wallet.cpp" line="1179"/> <location filename="../src/wallet/api/wallet.cpp" line="1283"/> <source>not enough money to transfer, overall balance only %s, sent amount %s</source> - <translation type="unfinished"></translation> + <translation>pas assez de fonds pour le transfer, solde global disponible %s, montant envoyé %s</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1188"/> @@ -348,18 +348,18 @@ <location filename="../src/wallet/api/wallet.cpp" line="1556"/> <location filename="../src/wallet/api/wallet.cpp" line="1579"/> <source>Failed to parse txid</source> - <translation type="unfinished"></translation> + <translation>Échec de l'analyse de l'ID de transaction</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1430"/> <source>no tx keys found for this txid</source> - <translation type="unfinished">aucune clé de transaction trouvée pour cet ID de transaction</translation> + <translation>aucune clé de transaction trouvée pour cet ID de transaction</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1450"/> <location filename="../src/wallet/api/wallet.cpp" line="1460"/> <source>Failed to parse tx key</source> - <translation type="unfinished"></translation> + <translation>Échec de l'analyse de la clé de transaction</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1470"/> @@ -367,12 +367,12 @@ <location filename="../src/wallet/api/wallet.cpp" line="1533"/> <location filename="../src/wallet/api/wallet.cpp" line="1621"/> <source>Failed to parse address</source> - <translation type="unfinished">Échec de l'analyse de l'adresse</translation> + <translation>Échec de l'analyse de l'adresse</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1627"/> <source>Address must not be a subaddress</source> - <translation type="unfinished"></translation> + <translation>L'adresse ne doit pas être une sous-adresse</translation> </message> <message> <location filename="../src/wallet/api/wallet.cpp" line="1849"/> @@ -413,7 +413,7 @@ <message> <location filename="../src/common/command_line.cpp" line="71"/> <source>no</source> - <translation type="unfinished"></translation> + <translation>non</translation> </message> </context> <context> @@ -436,7 +436,7 @@ <message> <location filename="../src/rpc/rpc_args.cpp" line="43"/> <source>Specify a comma separated list of origins to allow cross origin resource sharing</source> - <translation type="unfinished"></translation> + <translation>Spécifier une liste d'origines séparées par des virgules pour autoriser le partage de ressource de différentes origines (CORS)</translation> </message> <message> <location filename="../src/rpc/rpc_args.cpp" line="70"/> @@ -462,7 +462,7 @@ <message> <location filename="../src/rpc/rpc_args.cpp" line="105"/> <source> requires RFC server password --</source> - <translation type="unfinished"></translation> + <translation> nécessite le mot de passe du serveur RPC --</translation> </message> </context> <context> @@ -541,7 +541,7 @@ <location filename="../src/simplewallet/simplewallet.cpp" line="2041"/> <source>NOTE: the following 25 words can be used to recover access to your wallet. Write them down and store them somewhere safe and secure. Please do not store them in your email or on file storage services outside of your immediate control. </source> - <translation>VEUILLEZ NOTER : les 25 mots suivants peuvent être utilisés pour restaurer votre portefeuille. Veuillez les écrire sur papier et les garder dans un endroit sûr. Ne les gardez pas dans un courriel ou dans un service de stockage de fichiers hors de votre contrôle. + <translation>VEUILLEZ NOTER : les 25 mots suivants peuvent être utilisés pour restaurer votre portefeuille. Veuillez les écrire sur papier et les garder dans un endroit sûr. Ne les gardez pas dans un courriel ou dans un service de stockage de fichiers hors de votre contrôle. </translation> </message> <message> @@ -572,7 +572,7 @@ <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2662"/> <source>List of available languages for your wallet's seed:</source> - <translation>Liste des langues disponibles pour la graine de votre portefeuille :</translation> + <translation>Liste des langues disponibles pour la phrase mnémonique de votre portefeuille :</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2671"/> @@ -583,7 +583,7 @@ <location filename="../src/simplewallet/simplewallet.cpp" line="2737"/> <source>You had been using a deprecated version of the wallet. Please use the new seed that we provide. </source> - <translation>Vous avez utilisé une version obsolète du portefeuille. Veuillez dorénavant utiliser la nouvelle graine que nous fournissons. + <translation>Vous avez utilisé une version obsolète du portefeuille. Veuillez dorénavant utiliser la nouvelle phrase mnémonique que nous fournissons. </translation> </message> <message> @@ -643,22 +643,22 @@ <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3072"/> <source>Mining started in daemon</source> - <translation>L'extraction minière dans le démon a démarré</translation> + <translation>La mine a démarré dans le démon</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3074"/> <source>mining has NOT been started: </source> - <translation>l'extraction minière n'a PAS démarré : </translation> + <translation>la mine n'a PAS démarré : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3093"/> <source>Mining stopped in daemon</source> - <translation>L'extraction minière dans le démon a été stoppée</translation> + <translation>La mine a été stoppée dans le démon</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3095"/> <source>mining has NOT been stopped: </source> - <translation>l'extraction minière n'a PAS été stoppée : </translation> + <translation>la mine n'a PAS été stoppée : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3150"/> @@ -739,43 +739,46 @@ <location filename="../src/simplewallet/simplewallet.cpp" line="3895"/> <location filename="../src/simplewallet/simplewallet.cpp" line="3905"/> <source>Is this okay anyway? (Y/Yes/N/No): </source> - <translation type="unfinished"></translation> + <translation>Est-ce correct quand même ? (Y/Yes/Oui/N/No/Non) : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3900"/> <source>There is currently a %u block backlog at that fee level. Is this okay? (Y/Yes/N/No): </source> - <translation type="unfinished"></translation> + <translation>Il y a actuellement un arriéré de %u blocs à ce niveau de frais. Est-ce correct quand même ? (Y/Yes/Oui/N/No/Non) : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3905"/> <source>Failed to check for backlog: </source> - <translation type="unfinished"></translation> + <translation>Échec de la vérification du backlog : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3946"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4302"/> <source> Transaction </source> - <translation type="unfinished"></translation> + <translation> +Transaction </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3951"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4307"/> <source>Spending from address index %d </source> - <translation type="unfinished"></translation> + <translation>Dépense depuis l'adresse d'index %d +</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3953"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4309"/> <source>WARNING: Outputs of multiple addresses are being used together, which might potentially compromise your privacy. </source> - <translation type="unfinished"></translation> + <translation>ATTENTION : Des sorties de multiples adresses sont utilisées ensemble, ce qui pourrait potentiellement compromettre votre confidentialité. +</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3955"/> <source>Sending %s. </source> - <translation>Envoi de %s. </translation> + <translation>Envoi de %s. </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3958"/> @@ -846,32 +849,32 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4424"/> <source>failed to parse Payment ID</source> - <translation type="unfinished"></translation> + <translation>échec de l'analyse de l'ID de paiement</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4440"/> <source>usage: sweep_single [<priority>] [<ring_size>] <key_image> <address> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>usage : sweep_single [<priorité>] [<taille_cercle>] <image_clé> <adresse> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4447"/> <source>failed to parse key image</source> - <translation type="unfinished"></translation> + <translation>échec de l'analyse de l'image de clé</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4499"/> <source>No outputs found</source> - <translation type="unfinished"></translation> + <translation>Pas de sorties trouvées</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4504"/> <source>Multiple transactions are created, which is not supposed to happen</source> - <translation type="unfinished"></translation> + <translation>De multiples transactions sont crées, ce qui n'est pas supposé arriver</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4509"/> <source>The transaction uses multiple or no inputs, which is not supposed to happen</source> - <translation type="unfinished"></translation> + <translation>La transaction utilise aucune ou de multiples entrées, ce qui n'est pas supposé arriver</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4586"/> @@ -886,12 +889,12 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4601"/> <source>donations are not enabled on the testnet</source> - <translation type="unfinished"></translation> + <translation>les dons ne sont pas activés sur le réseau testnet</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4608"/> <source>usage: donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>usage : donate [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <montant> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4702"/> @@ -911,7 +914,7 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4748"/> <source> dummy output(s)</source> - <translation type="unfinished"></translation> + <translation> sortie(s) factice(s)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4751"/> @@ -921,17 +924,17 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4763"/> <source>Loaded %lu transactions, for %s, fee %s, %s, %s, with min ring size %lu, %s. %sIs this okay? (Y/Yes/N/No): </source> - <translation type="unfinished"></translation> + <translation>%lu transactions chargées, pour %s, frais %s, %s, %s, taille de cercle minimum %lu, %s. %sEst-ce correct ? (Y/Yes/Oui/N/No/Non) : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4787"/> <source>This is a multisig wallet, it can only sign with sign_multisig</source> - <translation type="unfinished"></translation> + <translation>Ceci est un portefeuille multisig, il ne peut signer qu'avec sign_multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4797"/> <source>usage: sign_transfer [export]</source> - <translation type="unfinished"></translation> + <translation>usage : sign_transfer [export]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4809"/> @@ -946,7 +949,7 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4836"/> <source>Transaction raw hex data exported to </source> - <translation type="unfinished"></translation> + <translation>Données brutes hex de la transaction exportées vers </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4852"/> @@ -1100,177 +1103,177 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <message> <location filename="../src/simplewallet/simplewallet.cpp" line="219"/> <source>false</source> - <translation type="unfinished"></translation> + <translation>faux</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="493"/> <source>Unknown command: </source> - <translation type="unfinished"></translation> + <translation>Commande inconnue : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="500"/> <source>Command usage: </source> - <translation type="unfinished"></translation> + <translation>Usage de la commande : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="503"/> <source>Command description: </source> - <translation type="unfinished"></translation> + <translation>Description de la commande : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="551"/> <source>wallet is multisig but not yet finalized</source> - <translation type="unfinished"></translation> + <translation>le portefeuille est multisig mais pas encore finalisé</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="567"/> <source>Enter optional seed encryption passphrase, empty to see raw seed</source> - <translation type="unfinished"></translation> + <translation>Entrer une phrase de passe facultative pour le chiffrement de la phrase mnémonique, effacer pour voir la phrase mnémonique brute</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="584"/> <source>Failed to retrieve seed</source> - <translation type="unfinished"></translation> + <translation>Échec de la récupération de la phrase mnémonique</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="603"/> <source>wallet is multisig and has no seed</source> - <translation type="unfinished"></translation> + <translation>le portefeuille est multisig et n'a pas de phrase mnémonique</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="674"/> <source>Cannot connect to daemon</source> - <translation type="unfinished"></translation> + <translation>Impossible de se connecter au démon</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="679"/> <source>Current fee is %s monero per kB</source> - <translation type="unfinished"></translation> + <translation>Les frais sont actuellement de %s monero par kO</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="695"/> <source>Error: failed to estimate backlog array size: </source> - <translation type="unfinished"></translation> + <translation>Erreur : échec de l'estimation de la taille du tableau d'arriéré : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="700"/> <source>Error: bad estimated backlog array size</source> - <translation type="unfinished"></translation> + <translation>Erreur : mauvaise estimation de la taille du tableau d'arriéré</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="712"/> <source> (current)</source> - <translation type="unfinished"></translation> + <translation> (actuel)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="715"/> <source>%u block (%u minutes) backlog at priority %u%s</source> - <translation type="unfinished"></translation> + <translation>arriéré de %u bloc(s) (%u minutes) à la priorité %u%s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="717"/> <source>%u to %u block (%u to %u minutes) backlog at priority %u</source> - <translation type="unfinished"></translation> + <translation>arriéré de %u à %u bloc(s) (%u à %u minutes) à la priorité %u</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="720"/> <source>No backlog at priority </source> - <translation type="unfinished"></translation> + <translation>Pas d'arriéré à la priorité </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="729"/> <location filename="../src/simplewallet/simplewallet.cpp" line="762"/> <source>This wallet is already multisig</source> - <translation type="unfinished"></translation> + <translation>Le portefeuille est déjà multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="734"/> <location filename="../src/simplewallet/simplewallet.cpp" line="767"/> <source>wallet is watch-only and cannot be made multisig</source> - <translation type="unfinished"></translation> + <translation>c'est un portefeuille d'audit et il ne peut pas être tranformé en multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="740"/> <location filename="../src/simplewallet/simplewallet.cpp" line="773"/> <source>This wallet has been used before, please use a new wallet to create a multisig wallet</source> - <translation type="unfinished"></translation> + <translation>Ce portefeuille a été utilisé auparavant, veuillez utiliser un nouveau portefeuille pour créer un portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="747"/> <source>Your password is incorrect.</source> - <translation type="unfinished"></translation> + <translation>Votre mot de passe est incorrect.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="753"/> <source>Send this multisig info to all other participants, then use make_multisig <threshold> <info1> [<info2>...] with others' multisig info</source> - <translation type="unfinished"></translation> + <translation>Envoyez ces infos multisig à tous les autres participants, ensuite utilisez make_multisig <seuil> <info1> [<info2>...] avec les infos multisig des autres</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="754"/> <source>This includes the PRIVATE view key, so needs to be disclosed only to that multisig wallet's participants </source> - <translation type="unfinished"></translation> + <translation>Ceci inclut la clé PRIVÉE d'audit, donc ne doit être divulgué qu'aux participants de ce portefeuille multisig </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="786"/> <source>usage: make_multisig <threshold> <multisiginfo1> [<multisiginfo2>...]</source> - <translation type="unfinished"></translation> + <translation>usage : make_multisig <seuil> <multisiginfo1> [<multisiginfo2>...]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="794"/> <source>Invalid threshold</source> - <translation type="unfinished"></translation> + <translation>Seuil invalide</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="807"/> <source>Another step is needed</source> - <translation type="unfinished"></translation> + <translation>Une autre étape est nécessaire</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="809"/> <source>Send this multisig info to all other participants, then use finalize_multisig <info1> [<info2>...] with others' multisig info</source> - <translation type="unfinished"></translation> + <translation>Envoyez ces infos multisig à tous les autres participants, ensuite utilisez finalize_multisig <info1> [<info2>...] avec les infos multisig des autres</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="815"/> <source>Error creating multisig: </source> - <translation type="unfinished"></translation> + <translation>Erreur de création multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="822"/> <source>Error creating multisig: new wallet is not multisig</source> - <translation type="unfinished"></translation> + <translation>Erreur de création multisig : le nouveau portefeuille n'est pas multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="825"/> <source> multisig address: </source> - <translation type="unfinished"></translation> + <translation> adresse multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="836"/> <location filename="../src/simplewallet/simplewallet.cpp" line="880"/> <location filename="../src/simplewallet/simplewallet.cpp" line="927"/> <source>This wallet is not multisig</source> - <translation type="unfinished"></translation> + <translation>Ce portefeuille n'est pas multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="841"/> <source>This wallet is already finalized</source> - <translation type="unfinished"></translation> + <translation>Ce portefeuille est déjà finalisé</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="854"/> <source>usage: finalize_multisig <multisiginfo1> [<multisiginfo2>...]</source> - <translation type="unfinished"></translation> + <translation>usage : finalize_multisig <multisiginfo1> [<multisiginfo2>...]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="862"/> <source>Failed to finalize multisig</source> - <translation type="unfinished"></translation> + <translation>Échec de finalisation multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="868"/> <source>Failed to finalize multisig: </source> - <translation type="unfinished"></translation> + <translation>Échec de finalisation multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="885"/> @@ -1279,310 +1282,310 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j <location filename="../src/simplewallet/simplewallet.cpp" line="1074"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1136"/> <source>This multisig wallet is not yet finalized</source> - <translation type="unfinished"></translation> + <translation>Ce portefeuille multisig n'est pas encore finalisé</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="890"/> <source>usage: export_multisig_info <filename></source> - <translation type="unfinished"></translation> + <translation>usage : export_multisig_info <nom_fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="913"/> <source>Error exporting multisig info: </source> - <translation type="unfinished"></translation> + <translation>Erreur d'importation des infos multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="917"/> <source>Multisig info exported to </source> - <translation type="unfinished"></translation> + <translation>Infos multisig exportées vers </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="937"/> <source>usage: import_multisig_info <filename1> [<filename2>...] - one for each other participant</source> - <translation type="unfinished"></translation> + <translation>usage : import_multisig_info <nom_fichier1> [<nom_fichier2>...] - un pour chaque autre participant</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="965"/> <source>Multisig info imported</source> - <translation type="unfinished"></translation> + <translation>Infos multisig importées</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="969"/> <source>Failed to import multisig info: </source> - <translation type="unfinished"></translation> + <translation>Échec de l'importation des infos multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="980"/> <source>Failed to update spent status after importing multisig info: </source> - <translation type="unfinished"></translation> + <translation>Échec de la mise à jour de l'état des dépenses après l'importation des infos multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="985"/> <source>Untrusted daemon, spent status may be incorrect. Use a trusted daemon and run "rescan_spent"</source> - <translation type="unfinished"></translation> + <translation>Pas un démon de confiance, l'état des dépenses peut être incorrect. Utilisez un démon de confiance et executez "rescan_spent"</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1001"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1069"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1131"/> <source>This is not a multisig wallet</source> - <translation type="unfinished"></translation> + <translation>Ceci n'est pas un portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1011"/> <source>usage: sign_multisig <filename></source> - <translation type="unfinished"></translation> + <translation>usage : sign_multisig <nom_fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1024"/> <source>Failed to sign multisig transaction</source> - <translation type="unfinished"></translation> + <translation>Échec de la signature de la transaction multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1030"/> <source>Multisig error: </source> - <translation type="unfinished"></translation> + <translation>Erreur multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1035"/> <source>Failed to sign multisig transaction: </source> - <translation type="unfinished"></translation> + <translation>Échec de la signature de la transaction multisig : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1058"/> <source>It may be relayed to the network with submit_multisig</source> - <translation type="unfinished"></translation> + <translation>Elle peut être transmise au réseau avec submit_multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1079"/> <source>usage: submit_multisig <filename></source> - <translation type="unfinished"></translation> + <translation>usage : submit_multisig <nom_fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1094"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1155"/> <source>Failed to load multisig transaction from file</source> - <translation type="unfinished"></translation> + <translation>Échec du chargement de la transaction multisig du fichier</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1099"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1160"/> <source>Multisig transaction signed by only %u signers, needs %u more signatures</source> - <translation type="unfinished"></translation> + <translation>Transaction multisig signée par %u signataire(s) seulement, nécessite %u signature(s) de plus</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1108"/> <location filename="../src/simplewallet/simplewallet.cpp" line="6750"/> <source>Transaction successfully submitted, transaction </source> - <translation type="unfinished"></translation> + <translation>Transaction transmise avec succès, transaction </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1109"/> <location filename="../src/simplewallet/simplewallet.cpp" line="6751"/> <source>You can check its status by using the `show_transfers` command.</source> - <translation type="unfinished"></translation> + <translation>Vous pouvez vérifier son statut en utilisant la commane 'show_transfers'.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1141"/> <source>usage: export_raw_multisig <filename></source> - <translation type="unfinished"></translation> + <translation>usage : export_raw_multisig <nom_fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1176"/> <source>Failed to export multisig transaction to file </source> - <translation type="unfinished"></translation> + <translation>Échec de l'exportation de la transaction multisig vers le fichier </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1180"/> <source>Saved exported multisig transaction file(s): </source> - <translation type="unfinished"></translation> + <translation>Transaction multisig enregistrée dans le(s) fichier(s) : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1252"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1258"/> <location filename="../src/simplewallet/simplewallet.cpp" line="1272"/> <source>ring size must be an integer >= </source> - <translation type="unfinished"></translation> + <translation>la taille de cercle doit être un nombre entier >= </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1277"/> <source>could not change default ring size</source> - <translation type="unfinished"></translation> + <translation>échec du changement de la taille de cercle par défaut</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1518"/> <source>Invalid height</source> - <translation type="unfinished"></translation> + <translation>Hauteur invalide</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1564"/> <source>start_mining [<number_of_threads>] [bg_mining] [ignore_battery]</source> - <translation type="unfinished"></translation> + <translation>start_mining [<nombre_de_threads>] [mine_arrière_plan] [ignorer_batterie]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1565"/> <source>Start mining in the daemon (bg_mining and ignore_battery are optional booleans).</source> - <translation type="unfinished"></translation> + <translation>Démarrer la mine dans le démon (mine_arrière_plan et ignorer_batterie sont des booléens facultatifs).</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1568"/> <source>Stop mining in the daemon.</source> - <translation type="unfinished"></translation> + <translation>Arrêter la mine dans le démon.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1571"/> <source>set_daemon <host>[:<port>]</source> - <translation type="unfinished"></translation> + <translation>set_daemon <hôte>[:<port>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1572"/> <source>Set another daemon to connect to.</source> - <translation type="unfinished"></translation> + <translation>Spécifier un autre démon auquel se connecter.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1575"/> <source>Save the current blockchain data.</source> - <translation type="unfinished"></translation> + <translation>Sauvegarder les données actuelles de la châine de blocs.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1578"/> <source>Synchronize the transactions and balance.</source> - <translation type="unfinished"></translation> + <translation>Synchroniser les transactions et le solde.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1581"/> <source>balance [detail]</source> - <translation type="unfinished"></translation> + <translation>solde [détail]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1582"/> <source>Show the wallet's balance of the currently selected account.</source> - <translation type="unfinished"></translation> + <translation>Afficher le solde du compte actuellement sélectionné.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1585"/> <source>incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]</source> - <translation type="unfinished"></translation> + <translation>incoming_transfers [available|unavailable] [verbose] [index=<N1>[,<N2>[,...]]]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1586"/> <source>Show the incoming transfers, all or filtered by availability and address index.</source> - <translation type="unfinished"></translation> + <translation>Afficher les transferts entrants, tous ou filtrés par disponibilité et index d'adresse.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1589"/> <source>payments <PID_1> [<PID_2> ... <PID_N>]</source> - <translation type="unfinished"></translation> + <translation>payments <PID_1> [<PID_2> ... <PID_N>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1590"/> <source>Show the payments for the given payment IDs.</source> - <translation type="unfinished"></translation> + <translation>Afficher les paiements pour les IDs de paiement donnés.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1593"/> <source>Show the blockchain height.</source> - <translation type="unfinished"></translation> + <translation>Afficher la hauteur de la chaîne de blocs.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1596"/> <source>transfer_original [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> <amount> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>transfer_original [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <adresse> <montant> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1597"/> <source>Transfer <amount> to <address> using an older transaction building algorithm. If the parameter "index=<N1>[,<N2>,...]" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command "set priority") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding <address_2> <amount_2> etcetera (before the payment ID, if it's included)</source> - <translation type="unfinished"></translation> + <translation>Transférer <montant> à <adresse> en utilisant un algorithme de construction de transaction plus ancien. Si le paramètre "index=<N1>[,<N2>,...]" est spécifié, le portefeuille utilise les sorties reçues par les adresses de ces indices. Si il est omis, le portefeuille choisit les indices d'adresse à utiliser aléatoirement. Dans tous les cas, il essaye de ne pas combiner des sorties de multiples adresses. <priorité> est la priorité de la transaction. Plus la priorité est haute, plus les frais de transaction sont élévés. Les valeurs valides par ordre de priorité (de la plus basse à la plus haute) sont : unimportant, normal, elevated, priority. Si elle est omise, la valeur par défaut (voir la commande "set priority") est utilisée. <taille_cercle> est le nombre d'entrées à inclure pour l'intraçabilité. De multiples paiements peuvent être réalisés d'un coup en ajoutant <adresse_2> <montant_2> et cetera (avant l'ID de paiement, si il est inclus)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1599"/> <source>transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> <amount> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>transfer [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <adresse> <montant> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1600"/> <source>Transfer <amount> to <address>. If the parameter "index=<N1>[,<N2>,...]" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command "set priority") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding <address_2> <amount_2> etcetera (before the payment ID, if it's included)</source> - <translation type="unfinished"></translation> + <translation>Transférer <montant> à <adresse> Si le paramètre "index=<N1>[,<N2>,...]" est spécifié, le portefeuille utilise les sorties reçues par les adresses de ces indices. Si il est omis, le portefeuille choisit les indices d'adresse à utiliser aléatoirement. Dans tous les cas, il essaye de ne pas combiner des sorties de multiples adresses. <priorité> est la priorité de la transaction. Plus la priorité est haute, plus les frais de transaction sont élévés. Les valeurs valides par ordre de priorité (de la plus basse à la plus haute) sont : unimportant, normal, elevated, priority. Si elle est omise, la valeur par défaut (voir la commande "set priority") est utilisée. <taille_cercle> est le nombre d'entrées à inclure pour l'intraçabilité. De multiples paiements peuvent être réalisés d'un coup en ajoutant <adresse_2> <montant_2> et cetera (avant l'ID de paiement, si il est inclus)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1603"/> <source>locked_transfer [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <addr> <amount> <lockblocks> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>locked_transfer [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <adresse> <montant> <blocs_verrou> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1604"/> <source>Transfer <amount> to <address> and lock it for <lockblocks> (max. 1000000). If the parameter "index=<N1>[,<N2>,...]" is specified, the wallet uses outputs received by addresses of those indices. If omitted, the wallet randomly chooses address indices to be used. In any case, it tries its best not to combine outputs across multiple addresses. <priority> is the priority of the transaction. The higher the priority, the higher the transaction fee. Valid values in priority order (from lowest to highest) are: unimportant, normal, elevated, priority. If omitted, the default value (see the command "set priority") is used. <ring_size> is the number of inputs to include for untraceability. Multiple payments can be made at once by adding <address_2> <amount_2> etcetera (before the payment ID, if it's included)</source> - <translation type="unfinished"></translation> + <translation>Transférer <montant> à <adresse> et le verrouiller pendant <blocs_verrou> (max 1000000). Si le paramètre "index=<N1>[,<N2>,...]" est spécifié, le portefeuille utilise les sorties reçues par les adresses de ces indices. Si il est omis, le portefeuille choisit les indices d'adresse à utiliser aléatoirement. Dans tous les cas, il essaye de ne pas combiner des sorties de multiples adresses. <priorité> est la priorité de la transaction. Plus la priorité est haute, plus les frais de transaction sont élévés. Les valeurs valides par ordre de priorité (de la plus basse à la plus haute) sont : unimportant, normal, elevated, priority. Si elle est omise, la valeur par défaut (voir la commande "set priority") est utilisée. <taille_cercle> est le nombre d'entrées à inclure pour l'intraçabilité. De multiples paiements peuvent être réalisés d'un coup en ajoutant <adresse_2> <montant_2> et cetera (avant l'ID de paiement, si il est inclus)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1607"/> <source>Send all unmixable outputs to yourself with ring_size 1</source> - <translation type="unfinished"></translation> + <translation>Envoyer toutes les sorties non mélangeables à vous-même avec une taille de cercle de 1</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1609"/> <source>sweep_all [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>sweep_all [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <adresse> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1610"/> <source>Send all unlocked balance to an address. If the parameter "index<N1>[,<N2>,...]" is specified, the wallet sweeps outputs received by those address indices. If omitted, the wallet randomly chooses an address index to be used.</source> - <translation type="unfinished"></translation> + <translation>Envoyer tout le solde débloqué à une adresse. Si le paramètre "index<N1>[,<N2>,...]" est spécifié, le portefeuille balaye les sorties reçues par ces indices d'adresse. Si il est omis, le portefeuille choisit un index d'adresse à utiliser aléatoirement.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1613"/> <source>sweep_below <amount_threshold> [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <address> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>sweep_below <montant_seuil> [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <adresse> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1614"/> <source>Send all unlocked outputs below the threshold to an address.</source> - <translation type="unfinished"></translation> + <translation>Envoyer toutes les sorties débloquées d'un montant inférieur au seuil à une adresse.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1617"/> <source>sweep_single [<priority>] [<ring_size>] <key_image> <address> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>sweep_single [<priorité>] [<taille_cercle>] <image_clé> <adresse> [<ID_payment>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1618"/> <source>Send a single output of the given key image to an address without change.</source> - <translation type="unfinished"></translation> + <translation>Envoyer une unique sortie ayant une image de clé donnée à une adresse sans rendu de monnaie.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1621"/> <source>donate [index=<N1>[,<N2>,...]] [<priority>] [<ring_size>] <amount> [<payment_id>]</source> - <translation type="unfinished"></translation> + <translation>donate [index=<N1>[,<N2>,...]] [<priorité>] [<taille_cercle>] <montant> [<ID_paiement>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1622"/> <source>Donate <amount> to the development team (donate.getmonero.org).</source> - <translation type="unfinished"></translation> + <translation>Donner <montant> à l'équipe de développement (donate.getmonero.org).</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1625"/> <source>sign_transfer <file></source> - <translation type="unfinished"></translation> + <translation>sign_transfer <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1626"/> <source>Sign a transaction from a <file>.</source> - <translation type="unfinished"></translation> + <translation>Signer une transaction d'un <fichier>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1629"/> <source>Submit a signed transaction from a file.</source> - <translation type="unfinished"></translation> + <translation>Transmettre une transaction signée d'un fichier.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1632"/> <source>set_log <level>|{+,-,}<categories></source> - <translation type="unfinished"></translation> + <translation>set_log <niveau>|{+,-,}<catégories></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1633"/> <source>Change the current log detail (level must be <0-4>).</source> - <translation type="unfinished"></translation> + <translation>Changer le niveau de détail du journal (le niveau doit être <0-4>).</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1636"/> @@ -1593,7 +1596,13 @@ Cette transaction sera déverrouillée au bloc %llu, dans approximativement %s j account tag <tag_name> <account_index_1> [<account_index_2> ...] account untag <account_index_1> [<account_index_2> ...] account tag_description <tag_name> <description></source> - <translation type="unfinished"></translation> + <translation>account + account new <texte étiquette avec espaces autorisés> + account switch <index> + account label <index> <texte étiquette avec espaces autorisés> + account tag <mot_clé> <index_compte_1> [<index_compte_2> ...] + account untag <index_compte_1> [<index_compte_2> ...] + account tag_description <mot_clé> <description></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1643"/> @@ -1604,67 +1613,73 @@ If the "label" argument is specified, the wallet sets the label of the If the "tag" argument is specified, a tag <tag_name> is assigned to the specified accounts <account_index_1>, <account_index_2>, .... If the "untag" argument is specified, the tags assigned to the specified accounts <account_index_1>, <account_index_2> ..., are removed. If the "tag_description" argument is specified, the tag <tag_name> is assigned an arbitrary text <description>.</source> - <translation type="unfinished"></translation> + <translation>Si aucun argument n'est spécifié, le portefeuille affiche tous les comptes existants ainsi que leurs soldes. +Si l'argument "new" est spécifié, le portefeuille crée un nouveau compte avec son étiquette initialisée par le texte fourni (qui peut être vide). +Si l'argument "switch" est spécifié, le portefeuille passe au compte spécifié par <index>. +Si l'argument "label" est spécifié, le portefeuille affecte le texte fourni à l'étiquette du compte spécifié par <index>. +Si l'argument "tag" est spécifié, un mot clé <mot_clé> est assigné aux comptes spécifiés <account_index_1>, <account_index_2>, .... +Si l'argument "untag" est spécifié, les mots clés assignés aux comptes spécifiés <account_index_1>, <account_index_2> ..., sont supprimés. +Si l'argument "tag_description" est spécifié, le texte arbitraire <description> est assigné au mot clé <mot_clé>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1652"/> <source>address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed>]</source> - <translation type="unfinished"></translation> + <translation>address [ new <texte étiquette avec espaces autorisés> | all | <index_min> [<index_max>] | label <index> <texte étiquette avec espaces autorisés>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1653"/> <source>If no arguments are specified or <index> is specified, the wallet shows the default or specified address. If "all" is specified, the walllet shows all the existing addresses in the currently selected account. If "new " is specified, the wallet creates a new address with the provided label text (which can be empty). If "label" is specified, the wallet sets the label of the address specified by <index> to the provided label text.</source> - <translation type="unfinished"></translation> + <translation>Si aucun argument n'est spécifié ou si <index> est spécifié, le portefeuille affiche l'adresse par défaut ou l'adresse spécifiée. Si "all" est spécifié, le portefeuille affiche toutes les adresses existantes dans le comptes actuellement sélectionné. Si "new" est spécifié, le portefeuille crée une nouvelle adresse avec le texte d'étiquette fourni (qui peut être vide). Si "label" est spécifié, le portefeuille affecte le texte fourni à l'étiquette de l'adresse spécifiée par <index>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1656"/> <source>integrated_address [<payment_id> | <address>]</source> - <translation type="unfinished"></translation> + <translation>integrated_address [<ID_paiement> | <adresse>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1657"/> <source>Encode a payment ID into an integrated address for the current wallet public address (no argument uses a random payment ID), or decode an integrated address to standard address and payment ID</source> - <translation type="unfinished"></translation> + <translation>Encoder un ID de paiement dans une adresse intégrée pour l'adresse publique du portefeuille actuel (en l'absence d'argument un ID de paiement aléatoire est utilisé), ou décoder une adresse intégrée en une adresse standard et un ID de paiement</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1660"/> <source>address_book [(add ((<address> [pid <id>])|<integrated address>) [<description possibly with whitespaces>])|(delete <index>)]</source> - <translation type="unfinished"></translation> + <translation>address_book [(add ((<adresse> [pid <id>])|<adresse intégrée>) [<description avec éventuellement des espaces>])|(delete <index>)]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1661"/> <source>Print all entries in the address book, optionally adding/deleting an entry to/from it.</source> - <translation type="unfinished"></translation> + <translation>Afficher toutes les entrées du carnet d'adresses, optionnellement en y ajoutant/supprimant une entrée.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1664"/> <source>Save the wallet data.</source> - <translation type="unfinished"></translation> + <translation>Sauvegarder les données du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1667"/> <source>Save a watch-only keys file.</source> - <translation type="unfinished"></translation> + <translation>Sauvegarder un fichier de clés d'audit.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1670"/> <source>Display the private view key.</source> - <translation type="unfinished"></translation> + <translation>Afficher la clé privée d'audit.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1673"/> <source>Display the private spend key.</source> - <translation type="unfinished"></translation> + <translation>Afficher la clé privée de dépense.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1676"/> <source>Display the Electrum-style mnemonic seed</source> - <translation type="unfinished"></translation> + <translation>Afficher la phrase mnémonique de style Electrum</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1679"/> <source>set <option> [<value>]</source> - <translation type="unfinished"></translation> + <translation>set <option> [<valeur>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1680"/> @@ -1703,450 +1718,486 @@ If the "tag_description" argument is specified, the tag <tag_name&g Set the height before which to ignore blocks. auto-low-priority <1|0> Whether to automatically use the low priority fee level when it's safe to do so.</source> - <translation type="unfinished"></translation> + <translation>Options disponibles : + seed langue + Définir la langue de la phrase mnémonique. + always-confirm-transfers <1|0> + Confirmation des transactions non divisées. + print-ring-members <1|0> + Affichage d'informations détaillées sur les membres du cercle lors de la confirmation. + store-tx-info <1|0> + Sauvegarde des informations des transactions sortantes (adresse de destination, ID de paiement, clé secrète de transaction) pour référence ultérieure. + default-ring-size <n> + Définir la taille de cercle par défaut (la valeur par défaut est le minimum 5). + auto-refresh <1|0> + Synchronisation automatique des nouveaux blocs du démon. + refresh-type <full|optimize-coinbase|no-coinbase|default> + Définir le comportement du rafraîchissement du portefeuille. + priority [0|1|2|3|4] + Utiliser les frais pour la priorité par défaut/peu importante/normale/élevée/prioritaire. + confirm-missing-payment-id <1|0> + ask-password <1|0> + unit <monero|millinero|micronero|nanonero|piconero> + Définir la (sous-)unité monero par défaut. + min-outputs-count [n] + Essayer de garder au moins ce nombre de sorties d'une valeur d'au moins min-outputs-value. + min-outputs-value [n] + Essayer de garder au moins min-outputs-count sorties d'au moins cette valeur. + merge-destinations <1|0> + Fusion des paiements multiples vers la même adresse de destination. + confirm-backlog <1|0> + Avertir s'il y a un arriéré de transactions. + confirm-backlog-threshold [n] + Définir un seuil pour confirm-backlog pour avertir seulement si l'arriéré de transactions est supérieur à n blocs. + refresh-from-block-height [n] + Définir la hauteur avant laquelle les blocs sont ignorés. + auto-low-priority <1|0> + Utilisation automatique du niveau de frais pour la priorité basse, lorsqu'il est sûr de le faire.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1717"/> <source>Display the encrypted Electrum-style mnemonic seed.</source> - <translation type="unfinished"></translation> + <translation>Afficher la phrase mnémonique de style Electrum chiffrée.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1720"/> <source>Rescan the blockchain for spent outputs.</source> - <translation type="unfinished"></translation> + <translation>Rescanner la chaîne de blocs pour trouver les sorties dépensées.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1723"/> <source>get_tx_key <txid></source> - <translation type="unfinished"></translation> + <translation>get_tx_key <ID_transaction></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1724"/> <source>Get the transaction key (r) for a given <txid>.</source> - <translation type="unfinished"></translation> + <translation>Obtenir la clé de transaction (r) pour un <ID_transaction> donné.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1727"/> <source>check_tx_key <txid> <txkey> <address></source> - <translation type="unfinished"></translation> + <translation>check_tx_key <ID_transaction> <clé_transaction> <adresse></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1728"/> <source>Check the amount going to <address> in <txid>.</source> - <translation type="unfinished"></translation> + <translation>Vérifier le montant allant à <adresse> dans <ID_transaction>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1731"/> <source>get_tx_proof <txid> <address> [<message>]</source> - <translation type="unfinished"></translation> + <translation>get_tx_proof <ID_transaction> <adresse> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1732"/> <source>Generate a signature proving funds sent to <address> in <txid>, optionally with a challenge string <message>, using either the transaction secret key (when <address> is not your wallet's address) or the view secret key (otherwise), which does not disclose the secret key.</source> - <translation type="unfinished"></translation> + <translation>Générer une signature prouvant l'envoi de fonds à <adresse> dans <ID_transaction>, optionnellement avec un <message> comme challenge, en utilisant soit la clé secrète de transaction (quand <adresse> n'est pas l'adresse de votre portefeuille) soit la clé secrète d'audit (dans le cas contraire), tout en ne divulgant pas la clé secrète.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1735"/> <source>check_tx_proof <txid> <address> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>check_tx_proof <ID_transaction> <adresse> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1736"/> <source>Check the proof for funds going to <address> in <txid> with the challenge string <message> if any.</source> - <translation type="unfinished"></translation> + <translation>Vérifier la validité de la preuve de fonds allant à <adresse> dans <ID_transaction> avec le <message> de challenge s'il y en a un.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1739"/> <source>get_spend_proof <txid> [<message>]</source> - <translation type="unfinished"></translation> + <translation>get_spend_proof <ID_transaction> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1740"/> <source>Generate a signature proving that you generated <txid> using the spend secret key, optionally with a challenge string <message>.</source> - <translation type="unfinished"></translation> + <translation>Générer une signature prouvant que vous avez créé <ID_transaction> en utilisant la clé secrète de dépense, optionnellement avec un <message> comme challenge.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1743"/> <source>check_spend_proof <txid> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>check_spend_proof <ID_transaction> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1744"/> <source>Check a signature proving that the signer generated <txid>, optionally with a challenge string <message>.</source> - <translation type="unfinished"></translation> + <translation>Vérifier la validité de la preuve que le signataire a créé <ID_transaction>, optionnellement avec un <message> comme challenge.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1747"/> <source>get_reserve_proof (all|<amount>) [<message>]</source> - <translation type="unfinished"></translation> + <translation>get_reserve_proof (all|<montant>) [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1748"/> <source>Generate a signature proving that you own at least this much, optionally with a challenge string <message>. If 'all' is specified, you prove the entire sum of all of your existing accounts' balances. Otherwise, you prove the reserve of the smallest possible amount above <amount> available in your current account.</source> - <translation type="unfinished"></translation> + <translation>Générer une signature prouvant que vous possédez au moins ce montant, optionnellement avec un <message> comme challenge. +Si 'all' est spécifié, vous prouvez la somme totale des soldes de tous vos comptes existants. +Sinon, vous prouvez le plus petit solde supérieur à <montant> dans votre compte actuel.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1753"/> <source>check_reserve_proof <address> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>check_reserve_proof <adresse> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1754"/> <source>Check a signature proving that the owner of <address> holds at least this much, optionally with a challenge string <message>.</source> - <translation type="unfinished"></translation> + <translation>Vérifier la validité d'une signature prouvant que le propriétaire d'une <adresse> détient au moins un montant, optionnellement avec un <message> comme challenge.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1757"/> <source>show_transfers [in|out|pending|failed|pool] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]</source> - <translation type="unfinished"></translation> + <translation>show_transfers [in|out|pending|failed|pool] [index=<N1>[,<N2>,...]] [<hauteur_min> [<hauteur_max>]]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1758"/> <source>Show the incoming/outgoing transfers within an optional height range.</source> - <translation type="unfinished"></translation> + <translation>Afficher les transferts entrants/sortants dans un interval de hauteurs facultatif.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1761"/> <source>unspent_outputs [index=<N1>[,<N2>,...]] [<min_amount> [<max_amount>]]</source> - <translation type="unfinished"></translation> + <translation>unspent_outputs [index=<N1>[,<N2>,...]] [<montant_min> [<montant_max>]]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1762"/> <source>Show the unspent outputs of a specified address within an optional amount range.</source> - <translation type="unfinished"></translation> + <translation>Afficher les sorties non dépensées d'une adresse spécifique dans un interval de montants facultatif.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1765"/> <source>Rescan the blockchain from scratch.</source> - <translation type="unfinished"></translation> + <translation>Rescanner la chaîne de blocs en partant de zéro.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1768"/> <source>set_tx_note <txid> [free text note]</source> - <translation type="unfinished"></translation> + <translation>set_tx_note <ID_transaction> [texte de la note]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1769"/> <source>Set an arbitrary string note for a <txid>.</source> - <translation type="unfinished"></translation> + <translation>Définir un texte arbitraire comme note pour <ID_transaction>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1772"/> <source>get_tx_note <txid></source> - <translation type="unfinished"></translation> + <translation>get_tx_note <ID_transaction></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1773"/> <source>Get a string note for a txid.</source> - <translation type="unfinished"></translation> + <translation>Obtenir le texte de la note pour <ID_transaction>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1776"/> <source>set_description [free text note]</source> - <translation type="unfinished"></translation> + <translation>set_description [texte]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1777"/> <source>Set an arbitrary description for the wallet.</source> - <translation type="unfinished"></translation> + <translation>Définir un texte arbitraire comme description du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1780"/> <source>Get the description of the wallet.</source> - <translation type="unfinished"></translation> + <translation>Obtenir la description du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1783"/> <source>Show the wallet's status.</source> - <translation type="unfinished"></translation> + <translation>Afficher l'état du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1786"/> <source>Show the wallet's information.</source> - <translation type="unfinished"></translation> + <translation>Afficher les informations du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1789"/> <source>sign <file></source> - <translation type="unfinished"></translation> + <translation>sign <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1790"/> <source>Sign the contents of a file.</source> - <translation type="unfinished"></translation> + <translation>Signer le contenu d'un fichier.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1793"/> <source>verify <filename> <address> <signature></source> - <translation type="unfinished"></translation> + <translation>verify <fichier> <adresse> <signature></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1794"/> <source>Verify a signature on the contents of a file.</source> - <translation type="unfinished"></translation> + <translation>Vérifier la signature du contenu d'un fichier.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1797"/> <source>export_key_images <file></source> - <translation type="unfinished"></translation> + <translation>export_key_images <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1798"/> <source>Export a signed set of key images to a <file>.</source> - <translation type="unfinished"></translation> + <translation>Exported un ensemble signé d'images de clé vers un <fichier>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1801"/> <source>import_key_images <file></source> - <translation type="unfinished"></translation> + <translation>import_key_images <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1802"/> <source>Import a signed key images list and verify their spent status.</source> - <translation type="unfinished"></translation> + <translation>Importer un ensemble signé d'images de clé et vérifier si elles correspondent à des dépenses.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1805"/> <source>export_outputs <file></source> - <translation type="unfinished"></translation> + <translation>export_outputs <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1806"/> <source>Export a set of outputs owned by this wallet.</source> - <translation type="unfinished"></translation> + <translation>Exporter un ensemble de sorties possédées par ce portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1809"/> <source>import_outputs <file></source> - <translation type="unfinished"></translation> + <translation>import_outputs <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1810"/> <source>Import a set of outputs owned by this wallet.</source> - <translation type="unfinished"></translation> + <translation>Importer un ensemble de sorties possédées par ce portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1813"/> <source>show_transfer <txid></source> - <translation type="unfinished"></translation> + <translation>show_transfer <ID_transaction></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1814"/> <source>Show information about a transfer to/from this address.</source> - <translation type="unfinished"></translation> + <translation>Afficher les information à propos d'un transfert vers/depuis cette adresse.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1817"/> <source>Change the wallet's password.</source> - <translation type="unfinished"></translation> + <translation>Changer le mot de passe du portefeuille.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1820"/> <source>Generate a new random full size payment id. These will be unencrypted on the blockchain, see integrated_address for encrypted short payment ids.</source> - <translation type="unfinished"></translation> + <translation>Générer un nouvel ID de paiement long aléatoire. Ceux-ci sont en clair dans la chaîne de blocs, voir integrated_address pour les IDs de paiement courts cryptés.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1823"/> <source>Print the information about the current fee and transaction backlog.</source> - <translation type="unfinished"></translation> + <translation>Afficher les informations à propos des frais et arriéré de transactions actuels.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1825"/> <source>Export data needed to create a multisig wallet</source> - <translation type="unfinished"></translation> + <translation>Exporter les données nécessaires pour créer un portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1827"/> <source>make_multisig <threshold> <string1> [<string>...]</source> - <translation type="unfinished"></translation> + <translation>make_multisig <seuil> <chaîne_caractères1> [<chaîne_caractères>...]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1828"/> <source>Turn this wallet into a multisig wallet</source> - <translation type="unfinished"></translation> + <translation>Transformer ce portefeuille en portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1831"/> <source>finalize_multisig <string> [<string>...]</source> - <translation type="unfinished"></translation> + <translation>finalize_multisig <chaîne_caractères> [<chaîne_caractères>...]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1832"/> <source>Turn this wallet into a multisig wallet, extra step for N-1/N wallets</source> - <translation type="unfinished"></translation> + <translation>Transformer ce portefeuille en portefeuille multisig, étape supplémentaire pour les portefeuilles N-1/N</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1835"/> <source>export_multisig_info <filename></source> - <translation type="unfinished"></translation> + <translation>export_multisig_info <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1836"/> <source>Export multisig info for other participants</source> - <translation type="unfinished"></translation> + <translation>Exporter les infos multisig pour les autres participants</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1839"/> <source>import_multisig_info <filename> [<filename>...]</source> - <translation type="unfinished"></translation> + <translation>import_multisig_info <fichier> [<fichier>...]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1840"/> <source>Import multisig info from other participants</source> - <translation type="unfinished"></translation> + <translation>Importer les infos multisig des autres participants</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1843"/> <source>sign_multisig <filename></source> - <translation type="unfinished"></translation> + <translation>sign_multisig <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1844"/> <source>Sign a multisig transaction from a file</source> - <translation type="unfinished"></translation> + <translation>Signer une transaction multisig d'un fichier</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1847"/> <source>submit_multisig <filename></source> - <translation type="unfinished"></translation> + <translation>submit_multisig <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1848"/> <source>Submit a signed multisig transaction from a file</source> - <translation type="unfinished"></translation> + <translation>Transmettre une transaction multisig signée d'un fichier</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1851"/> <source>export_raw_multisig_tx <filename></source> - <translation type="unfinished"></translation> + <translation>export_raw_multisig_tx <fichier></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1852"/> <source>Export a signed multisig transaction to a file</source> - <translation type="unfinished"></translation> + <translation>Exporter une transaction multisig signée vers un fichier</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1855"/> <source>help [<command>]</source> - <translation type="unfinished"></translation> + <translation>help [<commande>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1856"/> <source>Show the help section or the documentation about a <command>.</source> - <translation type="unfinished"></translation> + <translation>Afficher la section d'aide ou la documentation d'une <commande>.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1917"/> <source>integer >= </source> - <translation type="unfinished"></translation> + <translation>entier >= </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1930"/> <source>block height</source> - <translation type="unfinished"></translation> + <translation>hauteur de bloc</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2012"/> <source>No wallet found with that name. Confirm creation of new wallet named: </source> - <translation type="unfinished"></translation> + <translation>Aucun portefeuille avec ce nom trouvé. Confirmer la création d'un nouveau portefeuille nommé : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2068"/> <source>can't specify more than one of --generate-new-wallet="wallet_name", --wallet-file="wallet_name", --generate-from-view-key="wallet_name", --generate-from-spend-key="wallet_name", --generate-from-keys="wallet_name", --generate-from-multisig-keys="wallet_name" and --generate-from-json="jsonfilename"</source> - <translation type="unfinished"></translation> + <translation>impossible de spécifier plus d'une option parmis --generate-new-wallet="nom_portefeuille", --wallet-file="nom_portefeuille", --generate-from-view-key="nom_portefeuille", --generate-from-spend-key="nom_portefeuille", --generate-from-keys="nom_portefeuille", --generate-from-multisig-keys="nom_portefeuille" and --generate-from-json="nom_fichier_json"</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2084"/> <source>can't specify both --restore-deterministic-wallet or --restore-multisig-wallet and --non-deterministic</source> - <translation type="unfinished"></translation> + <translation>impossible de spécifier à la fois --restore-deterministic-wallet ou --restore-multisig-wallet et --non-deterministic</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2090"/> <source>--restore-multisig-wallet uses --generate-new-wallet, not --wallet-file</source> - <translation type="unfinished"></translation> + <translation>--restore-multisig-wallet utilise --generate-new-wallet, pas --wallet-file</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2106"/> <source>specify a recovery parameter with the --electrum-seed="multisig seed here"</source> - <translation type="unfinished"></translation> + <translation>spécifiez un paramètre de récupération avec --electrum-seed="phrase mnémonique multisig ici"</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2133"/> <source>Multisig seed failed verification</source> - <translation type="unfinished"></translation> + <translation>Échec de la vérification de la phrase mnémonique multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2149"/> <source>Enter seed encryption passphrase, empty if none</source> - <translation type="unfinished"></translation> + <translation>Entrer une phrase de passe pour le chiffrement de la phrase mnémonique, vide si aucune</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2185"/> <location filename="../src/simplewallet/simplewallet.cpp" line="2259"/> <source>This address is a subaddress which cannot be used here.</source> - <translation type="unfinished"></translation> + <translation>Cette adresse est une sous-adresse qui ne peut pas être utilisée ici.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2337"/> <source>Error: expected M/N, but got: </source> - <translation type="unfinished"></translation> + <translation>Erreur : M/N attendu, mais lu : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2342"/> <source>Error: expected N > 1 and N <= M, but got: </source> - <translation type="unfinished"></translation> + <translation>Erreur : N > 1 et N <= M attendu, mais lu : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2347"/> <source>Error: M/N is currently unsupported. </source> - <translation type="unfinished"></translation> + <translation>Erreur : M/N n'est actuellement pas supporté. </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2350"/> <source>Generating master wallet from %u of %u multisig wallet keys</source> - <translation type="unfinished"></translation> + <translation>Génération du portefeuille principal à partir de %u de %u clés de portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2379"/> <source>failed to parse secret view key</source> - <translation type="unfinished">échec de l'analyse de la clé secrète d'audit</translation> + <translation>échec de l'analyse de la clé secrète d'audit</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2388"/> <source>failed to verify secret view key</source> - <translation type="unfinished">échec de la vérification de la clé secrète d'audit</translation> + <translation>échec de la vérification de la clé secrète d'audit</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2408"/> <source>Secret spend key (%u of %u):</source> - <translation type="unfinished"></translation> + <translation>Clé secrète de dépense (%u de %u) :</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2432"/> <source>Error: M/N is currently unsupported</source> - <translation type="unfinished"></translation> + <translation>Erreur : M/N n'est actuellement pas supporté</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2550"/> <source>Restore height </source> - <translation type="unfinished"></translation> + <translation>Hauteur de restauration </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2551"/> <source>Still apply restore height? (Y/Yes/N/No): </source> - <translation type="unfinished"></translation> + <translation>Appliquer la hauteur de restauration quand même ? (Y/Yes/Oui/N/No/Non) : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2582"/> <source>Warning: using an untrusted daemon at %s, privacy will be lessened</source> - <translation type="unfinished"></translation> + <translation>Attention : en n'utilisant %s qui n'est pas un démon de confiance, la confidentialité sera réduite</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2636"/> <source>Daemon either is not started or wrong port was passed. Please make sure daemon is running or change the daemon address using the 'set_daemon' command.</source> - <translation type="unfinished"></translation> + <translation>Le démon n'est pas lancé ou un mauvais port a été fourni. Veuillez vous assurer que le démon fonctionne ou changez l'adresse de démon avec la commande 'set_daemon'.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2768"/> @@ -2158,134 +2209,142 @@ Always use the "exit" command when closing monero-wallet-cli to save your current session's state. Otherwise, you might need to synchronize your wallet again (your wallet keys are NOT at risk in any case). </source> - <translation type="unfinished"></translation> + <translation>Votre portefeuille a été généré ! +Pour commencer la synchronisation avec le démon, utilisez la commande "refresh". +Utilisez la commande "help" pour voir la liste des commandes disponibles. +Utilisez "help <commande>" pour voir la documentation d'une commande. +Utilisez toujours la commande "exit" pour fermer monero-wallet-cli pour sauvegarder +l'état de votre session. Sinon, vous pourriez avoir besoin de synchroniser +votre portefeuille à nouveau (mais les clés de votre portefeuille ne risquent rien). +</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2850"/> <source>failed to generate new mutlisig wallet</source> - <translation type="unfinished"></translation> + <translation>échec de la génération du nouveau portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2853"/> <source>Generated new %u/%u multisig wallet: </source> - <translation type="unfinished"></translation> + <translation>Nouveau portefeuille multisig %u/%u généré : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2889"/> <source>Opened %u/%u multisig wallet%s</source> - <translation type="unfinished"></translation> + <translation>Portefeuille multisig %u/%u ouvert%s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2942"/> <source>Use "help <command>" to see a command's documentation. </source> - <translation type="unfinished"></translation> + <translation>Utilisez "help <commande>" pour voir la documentation d'une commande. +</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3000"/> <source>wallet is multisig and cannot save a watch-only version</source> - <translation type="unfinished"></translation> + <translation>c'est un portefeuille multisig et il ne peut pas sauvegarder une version d'audit</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3105"/> <source>missing daemon URL argument</source> - <translation type="unfinished"></translation> + <translation>URL du démon manquante en argument</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3116"/> <source>Unexpected array length - Exited simple_wallet::set_daemon()</source> - <translation type="unfinished"></translation> + <translation>Taille de tableau inattendue - Sortie de simple_wallet::set_daemon()</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3130"/> <source>This does not seem to be a valid daemon URL.</source> - <translation type="unfinished"></translation> + <translation>Ceci semble ne pas être une URL de démon valide.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3166"/> <location filename="../src/simplewallet/simplewallet.cpp" line="3184"/> <source>txid </source> - <translation type="unfinished"></translation> + <translation>ID transaction </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3168"/> <location filename="../src/simplewallet/simplewallet.cpp" line="3186"/> <source>idx </source> - <translation type="unfinished"></translation> + <translation>index </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3299"/> <source> (Some owned outputs have partial key images - import_multisig_info needed)</source> - <translation type="unfinished"></translation> + <translation> (Certaines sorties ont des images de clé partielles - import_multisig_info requis)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3300"/> <source>Currently selected account: [</source> - <translation type="unfinished"></translation> + <translation>Compte actuellement sélectionné : [</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3300"/> <source>] </source> - <translation type="unfinished"></translation> + <translation>] </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3302"/> <source>Tag: </source> - <translation type="unfinished"></translation> + <translation>Mot clé : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3302"/> <source>(No tag assigned)</source> - <translation type="unfinished"></translation> + <translation>(Pas de mot clé assigné)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3309"/> <source>Balance per address:</source> - <translation type="unfinished"></translation> + <translation>Solde par adresse :</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3310"/> <source>Address</source> - <translation type="unfinished"></translation> + <translation>Adresse</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3310"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5921"/> <source>Balance</source> - <translation type="unfinished"></translation> + <translation>Solde</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3310"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5921"/> <source>Unlocked balance</source> - <translation type="unfinished"></translation> + <translation>Solde débloqué</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3310"/> <source>Outputs</source> - <translation type="unfinished"></translation> + <translation>Sorties</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3310"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5921"/> <source>Label</source> - <translation type="unfinished"></translation> + <translation>Étiquette</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3318"/> <source>%8u %6s %21s %21s %7u %21s</source> - <translation type="unfinished"></translation> + <translation>%8u %6s %21s %21s %7u %21s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3327"/> <source>usage: balance [detail]</source> - <translation type="unfinished"></translation> + <translation>usage : balance [detail]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3339"/> <location filename="../src/simplewallet/simplewallet.cpp" line="3381"/> <source>usage: incoming_transfers [available|unavailable] [verbose] [index=<N>]</source> - <translation type="unfinished"></translation> + <translation>usage: incoming_transfers [available|unavailable] [verbose] [index=<N>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3400"/> @@ -2306,7 +2365,7 @@ your wallet again (your wallet keys are NOT at risk in any case). <location filename="../src/simplewallet/simplewallet.cpp" line="3400"/> <location filename="../src/simplewallet/simplewallet.cpp" line="3451"/> <source>addr index</source> - <translation type="unfinished"></translation> + <translation>index adresse</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3423"/> @@ -2431,13 +2490,13 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <location filename="../src/simplewallet/simplewallet.cpp" line="3705"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4184"/> <source>Ring size must not be 0</source> - <translation type="unfinished"></translation> + <translation>La taille de cercle ne doit pas être 0</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3717"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4196"/> <source>ring size %u is too small, minimum is %u</source> - <translation type="unfinished"></translation> + <translation>la taille de cercle %u est trop petite, le minimum est %u</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3724"/> @@ -2460,18 +2519,18 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6743"/> <source>Transaction successfully saved to </source> - <translation type="unfinished"></translation> + <translation>Transaction sauvegardée avec succès dans </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6743"/> <location filename="../src/simplewallet/simplewallet.cpp" line="6745"/> <source>, txid </source> - <translation type="unfinished"></translation> + <translation>, ID transaction </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6745"/> <source>Failed to save transaction to </source> - <translation type="unfinished"></translation> + <translation>Échec de la sauvegarde de la transaction dans </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4081"/> @@ -2504,7 +2563,7 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6673"/> <source>Double spend seen on the network: this transaction may or may not end up being mined</source> - <translation type="unfinished"></translation> + <translation>Double dépense détectée sur le réseau : cette transaction sera peut-être invalidée</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6708"/> @@ -2525,13 +2584,13 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <location filename="../src/simplewallet/simplewallet.cpp" line="541"/> <location filename="../src/simplewallet/simplewallet.cpp" line="608"/> <source>wallet is watch-only and has no seed</source> - <translation>c'est un portefeuille d'audit et il n'a pas de graine</translation> + <translation>c'est un portefeuille d'audit et il n'a pas de phrase mnémonique</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="557"/> <location filename="../src/simplewallet/simplewallet.cpp" line="613"/> <source>wallet is non-deterministic and has no seed</source> - <translation>c'est un portefeuille non déterministe et il n'a pas de graine</translation> + <translation>c'est un portefeuille non déterministe et il n'a pas de phrase mnémonique</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="1226"/> @@ -2673,7 +2732,7 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <location filename="../src/simplewallet/simplewallet.cpp" line="3142"/> <location filename="../src/simplewallet/simplewallet.cpp" line="4962"/> <source>wallet is null</source> - <translation type="unfinished"></translation> + <translation>portefeuille est nul</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="2680"/> @@ -2801,20 +2860,20 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <message> <location filename="../src/simplewallet/simplewallet.cpp" line="3778"/> <source>Locked blocks too high, max 1000000 (˜4 yrs)</source> - <translation type="unfinished"></translation> + <translation>Nombre de blocs verrou trop élévé, 1000000 max (˜4 ans)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5077"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5188"/> <source>Good signature</source> - <translation type="unfinished"></translation> + <translation>Bonne signature</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5104"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5190"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5293"/> <source>Bad signature</source> - <translation type="unfinished"></translation> + <translation>Mauvaise signature</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6046"/> @@ -2904,89 +2963,89 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5039"/> <source>usage: check_tx_proof <txid> <address> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : check_tx_proof <ID_transaction> <adresse> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5066"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5181"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5278"/> <source>failed to load signature file</source> - <translation type="unfinished"></translation> + <translation>échec du chargement du fichier signature</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5117"/> <source>usage: get_spend_proof <txid> [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : get_spend_proof <ID_transaction> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5123"/> <source>wallet is watch-only and cannot generate the proof</source> - <translation type="unfinished"></translation> + <translation>c'est un portefeuille d'audit et il ne peut générer de preuve</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5161"/> <source>usage: check_spend_proof <txid> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : check_spend_proof <ID_transaction> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5202"/> <source>usage: get_reserve_proof (all|<amount>) [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : get_reserve_proof (all|<montant>) [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5208"/> <source>The reserve proof can be generated only by a full wallet</source> - <translation type="unfinished"></translation> + <translation>La preuve de réserve ne peut être généré que par un portefeuille complet</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5253"/> <source>usage: check_reserve_proof <address> <signature_file> [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : check_reserve_proof <adresse> <fichier_signature> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5271"/> <source>Address must not be a subaddress</source> - <translation type="unfinished"></translation> + <translation>L'adresse ne doit pas être une sous-adresse</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5289"/> <source>Good signature -- total: %s, spent: %s, unspent: %s</source> - <translation type="unfinished"></translation> + <translation>Bonne signature -- total : %s, dépensé : %s, non dépensé : %s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5353"/> <source>usage: show_transfers [in|out|all|pending|failed] [index=<N1>[,<N2>,...]] [<min_height> [<max_height>]]</source> - <translation type="unfinished"></translation> + <translation>usage : show_transfers [in|out|all|pending|failed] [index=<N1>[,<N2>,...]] [<hauteur_min> [<hauteur_max>]]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5490"/> <source>[Double spend seen on the network: this transaction may or may not end up being mined] </source> - <translation type="unfinished"></translation> + <translation>[Double dépense détectée sur le réseau : cette transaction sera peut-être invalidée] </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5526"/> <source>usage: unspent_outputs [index=<N1>[,<N2>,...]] [<min_amount> [<max_amount>]]</source> - <translation type="unfinished"></translation> + <translation>usage : unspent_outputs [index=<N1>[,<N2>,...]] [<montant_min> [<montant_max>]]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5586"/> <source>There is no unspent output in the specified address</source> - <translation type="unfinished"></translation> + <translation>Il n'y a pas de sortie non dépensée pour l'adresse spécifiée</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5699"/> <source> (no daemon)</source> - <translation type="unfinished"></translation> + <translation> (pas de démon)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5701"/> <source> (out of sync)</source> - <translation type="unfinished"></translation> + <translation> (désynchronisé)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5758"/> <source>(Untitled account)</source> - <translation type="unfinished"></translation> + <translation>(compte sans nom)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5771"/> @@ -2996,13 +3055,13 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < <location filename="../src/simplewallet/simplewallet.cpp" line="5990"/> <location filename="../src/simplewallet/simplewallet.cpp" line="6013"/> <source>failed to parse index: </source> - <translation type="unfinished"></translation> + <translation>échec de l'analyse de l'index : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5776"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5995"/> <source>specify an index between 0 and </source> - <translation type="unfinished"></translation> + <translation>specifiez un index entre 0 et </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5873"/> @@ -3014,165 +3073,174 @@ Attention : Certaines clés d'entrées étant dépensées sont issues de < account tag <tag_name> <account_index_1> [<account_index_2> ...] account untag <account_index_1> [<account_index_2> ...] account tag_description <tag_name> <description></source> - <translation type="unfinished"></translation> + <translation>usage : + account + account new <texte étiquette avec espaces autorisés> + account switch <index> + account label <index> <texte étiquette avec espaces autorisés> + account tag <mot_clé> <index_compte_1> [<index_compte_2> ...] + account untag <index_compte_1> [<index_compte_2> ...] + account tag_description <mot_clé> <description></translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5901"/> <source> Grand total: Balance: </source> - <translation type="unfinished"></translation> + <translation> +Somme finale : + Solde : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5901"/> <source>, unlocked balance: </source> - <translation type="unfinished"></translation> + <translation>, solde débloqué : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5909"/> <source>Untagged accounts:</source> - <translation type="unfinished"></translation> + <translation>Comptes sans mot clé :</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5915"/> <source>Tag %s is unregistered.</source> - <translation type="unfinished"></translation> + <translation>Le mot clé %s n'est pas enregistré.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5918"/> <source>Accounts with tag: </source> - <translation type="unfinished"></translation> + <translation>Comptes avec mot clé : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5919"/> <source>Tag's description: </source> - <translation type="unfinished"></translation> + <translation>Description du mot clé : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5921"/> <source>Account</source> - <translation type="unfinished"></translation> + <translation>Compte</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5927"/> <source> %c%8u %6s %21s %21s %21s</source> - <translation type="unfinished"></translation> + <translation> %c%8u %6s %21s %21s %21s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5937"/> <source>----------------------------------------------------------------------------------</source> - <translation type="unfinished"></translation> + <translation>----------------------------------------------------------------------------------</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5938"/> <source>%15s %21s %21s</source> - <translation type="unfinished"></translation> + <translation>%15s %21s %21s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5961"/> <source>Primary address</source> - <translation type="unfinished"></translation> + <translation>Adresse primaire</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5961"/> <source>(used)</source> - <translation type="unfinished"></translation> + <translation>(utilisé)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="5982"/> <source>(Untitled address)</source> - <translation type="unfinished"></translation> + <translation>(adresse sans nom)</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6022"/> <source><index_min> is already out of bound</source> - <translation type="unfinished"></translation> + <translation><index_min> est déjà hors limite</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6027"/> <source><index_max> exceeds the bound</source> - <translation type="unfinished"></translation> + <translation><index_max> excède la limite</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6035"/> <source>usage: address [ new <label text with white spaces allowed> | all | <index_min> [<index_max>] | label <index> <label text with white spaces allowed> ]</source> - <translation type="unfinished"></translation> + <translation>usage : address [ new <texte étiquette avec espaces autorisés> | all | <index_min> [<index_max>] | label <index> <texte étiquette avec espaces autorisés>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6053"/> <location filename="../src/simplewallet/simplewallet.cpp" line="6065"/> <source>Integrated addresses can only be created for account 0</source> - <translation type="unfinished"></translation> + <translation>Les adresses intégrées ne peuvent être créées que pour le compte 0</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6077"/> <source>Integrated address: %s, payment ID: %s</source> - <translation type="unfinished"></translation> + <translation>Adresse intégrée : %s, ID de paiement : %s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6082"/> <source>Subaddress: </source> - <translation type="unfinished"></translation> + <translation>Sous-adresse : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6242"/> <source>usage: get_description</source> - <translation type="unfinished"></translation> + <translation>usage : get_description</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6248"/> <source>no description found</source> - <translation type="unfinished"></translation> + <translation>pas de description trouvée</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6250"/> <source>description found: </source> - <translation type="unfinished"></translation> + <translation>description trouvée : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6285"/> <source>Filename: </source> - <translation type="unfinished"></translation> + <translation>Fichier : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6290"/> <source>Watch only</source> - <translation type="unfinished"></translation> + <translation>Audit</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6292"/> <source>%u/%u multisig%s</source> - <translation type="unfinished"></translation> + <translation>Multisig %u/%u%s</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6294"/> <source>Normal</source> - <translation type="unfinished"></translation> + <translation>Normal</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6295"/> <source>Type: </source> - <translation type="unfinished"></translation> + <translation>Type : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6296"/> <source>Testnet: </source> - <translation type="unfinished"></translation> + <translation>Testnet : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6296"/> <source>Yes</source> - <translation type="unfinished"></translation> + <translation>Oui</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6296"/> <source>No</source> - <translation type="unfinished"></translation> + <translation>Non</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6314"/> <source>This wallet is multisig and cannot sign</source> - <translation type="unfinished"></translation> + <translation>C'est un portefeuille multisig et il ne peut pas signer</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6335"/> @@ -3307,21 +3375,21 @@ Grand total: <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4912"/> <source>usage: get_tx_proof <txid> <address> [<message>]</source> - <translation type="unfinished"></translation> + <translation>usage : get_tx_proof <ID_transaction> <adresse> [<message>]</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4937"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5147"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5239"/> <source>signature file saved to: </source> - <translation type="unfinished"></translation> + <translation>fichier signature sauvegardé dans : </translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4939"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5149"/> <location filename="../src/simplewallet/simplewallet.cpp" line="5241"/> <source>failed to save signature file</source> - <translation type="unfinished"></translation> + <translation>échec de la sauvegarde du fichier signature</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="4953"/> @@ -3544,83 +3612,83 @@ Sorties par * : </translation> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="70"/> <source>Base filename (-1, -2, etc suffixes will be appended as needed)</source> - <translation type="unfinished"></translation> + <translation>Nom de fichier de base (des suffixes -1, -2 etc seront ajoutés si nécessaire)</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="71"/> <source>Give threshold and participants at once as M/N</source> - <translation type="unfinished"></translation> + <translation>Indiquer le seuil et les participants sous la forme M/N</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="72"/> <source>How many participants wil share parts of the multisig wallet</source> - <translation type="unfinished"></translation> + <translation>Combien de participants partageront des parts du portefeuille multisig</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="73"/> <source>How many signers are required to sign a valid transaction</source> - <translation type="unfinished"></translation> + <translation>Combien de signataires sont requis pour signer une transaction valide</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="74"/> <source>Create testnet multisig wallets</source> - <translation type="unfinished"></translation> + <translation>Créer un portefeuille multisig testnet</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="81"/> <source>Generating %u %u/%u multisig wallets</source> - <translation type="unfinished"></translation> + <translation>Génération de %u portefeuilles multisig %u/%u</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="138"/> <source>Error verifying multisig extra info</source> - <translation type="unfinished"></translation> + <translation>Erreur de vérification des infos multisig supplémentaires</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="146"/> <source>Error finalizing multisig</source> - <translation type="unfinished"></translation> + <translation>Erreur de finalisation multisig</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="153"/> <source>Generated multisig wallets for address </source> - <translation type="unfinished"></translation> + <translation>Portefeuilles multisig générés pour l'adresse </translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="157"/> <source>Error creating multisig wallets: </source> - <translation type="unfinished"></translation> + <translation>Erreur de création des portefeuilles multisig : </translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="176"/> <source>This program generates a set of multisig wallets - use this simpler scheme only if all the participants trust each other</source> - <translation type="unfinished"></translation> + <translation>Ce programme génère un ensemble de portefeuilles multisig - n'utilisez cette méthode plus simple que si tous les participants se font confiance</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="194"/> <source>Error: expected N/M, but got: </source> - <translation type="unfinished"></translation> + <translation>Erreur : N/M attendu, mais lu : </translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="202"/> <location filename="../src/gen_multisig/gen_multisig.cpp" line="211"/> <source>Error: either --scheme or both of --threshold and --participants may be given</source> - <translation type="unfinished"></translation> + <translation>Erreur : soit --scheme soit --threshold et --participants doivent être indiqués</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="218"/> <source>Error: expected N > 1 and N <= M, but got N==%u and M==%d</source> - <translation type="unfinished"></translation> + <translation>Erreur : N > 1 et N <= M attendu, mais lu N==%u et M==%d</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="227"/> <source>Error: --filename-base is required</source> - <translation type="unfinished"></translation> + <translation>Erreur : --filename-base est requis</translation> </message> <message> <location filename="../src/gen_multisig/gen_multisig.cpp" line="233"/> <source>Error: unsupported scheme: only N/N and N-1/N are supported</source> - <translation type="unfinished"></translation> + <translation>Erreur : schéma non supporté : seuls N/N et N-1/N sont supportés</translation> </message> </context> <context> @@ -3638,7 +3706,7 @@ Sorties par * : </translation> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="117"/> <source>Generate deterministic wallet from spend key</source> - <translation type="unfinished"></translation> + <translation>Générer un portefeuille déterministe à partir d'une clé de dépense</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="118"/> @@ -3648,27 +3716,27 @@ Sorties par * : </translation> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="119"/> <source>Generate a master wallet from multisig wallet keys</source> - <translation type="unfinished"></translation> + <translation>Générer un portefeuille principal à partir de clés de portefeuille multisig</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="121"/> <source>Language for mnemonic</source> - <translation type="unfinished"></translation> + <translation>Langue de la phrase mnémonique</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="122"/> <source>Specify Electrum seed for wallet recovery/creation</source> - <translation>Spécifier la graine Electrum pour la récupération/création d'un portefeuille</translation> + <translation>Spécifier la phrase mnémonique Electrum pour la récupération/création d'un portefeuille</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="123"/> <source>Recover wallet using Electrum-style mnemonic seed</source> - <translation>Récupérer un portefeuille en utilisant une graine mnémonique de style Electrum</translation> + <translation>Récupérer un portefeuille en utilisant une phrase mnémonique de style Electrum</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="124"/> <source>Recover multisig wallet using Electrum-style mnemonic seed</source> - <translation type="unfinished"></translation> + <translation>Récupérer un portefeuille multisig en utilisant une phrase mnémonique de style Electrum</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="125"/> @@ -3693,7 +3761,7 @@ Sorties par * : </translation> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="129"/> <source>The newly created transaction will not be relayed to the monero network</source> - <translation type="unfinished"></translation> + <translation>La transaction nouvellement créée ne sera pas transmise au réseau monero</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="171"/> @@ -3714,7 +3782,8 @@ Sorties par * : </translation> <location filename="../src/simplewallet/simplewallet.cpp" line="6787"/> <source>This is the command line monero wallet. It needs to connect to a monero daemon to work correctly.</source> - <translation type="unfinished"></translation> + <translation>Ceci est le portefeuille monero en ligne de commande. Il a besoin de se +connecter à un démon monero pour fonctionner correctement.</translation> </message> <message> <location filename="../src/simplewallet/simplewallet.cpp" line="6801"/> @@ -3787,7 +3856,7 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet2.cpp" line="224"/> <source>no password specified; use --prompt-for-password to prompt for a password</source> - <translation type="unfinished"></translation> + <translation>pas de mot de passe spécifié; utilisez --prompt-for-password pour demander un mot de passe</translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="246"/> @@ -3831,7 +3900,7 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet2.cpp" line="319"/> <source>At least one of Electrum-style word list and private view key and private spend key must be specified</source> - <translation type="unfinished"></translation> + <translation>Il faut spécifier au moins une des options parmis la liste de mots de style Electrum, la clé privée d'audit et la clé privée de dépense</translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="323"/> @@ -3861,12 +3930,12 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet2.cpp" line="392"/> <source>failed to parse address: </source> - <translation type="unfinished"></translation> + <translation>échec de l'analyse de l'adresse : </translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="398"/> <source>Address must be specified in order to create watch-only wallet</source> - <translation type="unfinished"></translation> + <translation>L'adresse doit être spécifiée afin de créer un portefeuille d'audit</translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="413"/> @@ -3883,12 +3952,12 @@ daemon to work correctly.</source> <location filename="../src/wallet/wallet2.cpp" line="3599"/> <location filename="../src/wallet/wallet2.cpp" line="3955"/> <source>Primary account</source> - <translation type="unfinished"></translation> + <translation>Compte primaire</translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="7914"/> <source>No funds received in this tx.</source> - <translation type="unfinished"></translation> + <translation>Aucun fonds n'a été reçu dans cette transaction.</translation> </message> <message> <location filename="../src/wallet/wallet2.cpp" line="8607"/> @@ -3906,12 +3975,12 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="175"/> <source>Failed to create directory </source> - <translation type="unfinished"></translation> + <translation>Échec de la création du répertoire </translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="177"/> <source>Failed to create directory %s: %s</source> - <translation type="unfinished"></translation> + <translation>Échec de la création du répertoire %s : %s</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="188"/> @@ -3946,18 +4015,19 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="443"/> <source>Tag %s is unregistered.</source> - <translation type="unfinished"></translation> + <translation>Le mot clé %s n'est pas enregistré.</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2435"/> <source>Transaction not possible. Available only %s, transaction amount %s = %s + %s (fee)</source> - <translation type="unfinished"></translation> + <translation>Transaction impossible. Solde disponible : %s, montant de la transaction %s = %s + %s (frais)</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2870"/> <source>This is the RPC monero wallet. It needs to connect to a monero daemon to work correctly.</source> - <translation type="unfinished"></translation> + <translation>Ceci est le portefeuille monero par RPC. Il a besoin de se +connecter à un démon monero pour fonctionner correctement.</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2893"/> @@ -3984,12 +4054,12 @@ daemon to work correctly.</source> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2944"/> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2977"/> <source>Successfully saved</source> - <translation type="unfinished"></translation> + <translation>Sauvegardé avec succès</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2947"/> <source>Successfully loaded</source> - <translation type="unfinished"></translation> + <translation>Chargé avec succès</translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2951"/> @@ -4009,7 +4079,7 @@ daemon to work correctly.</source> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2969"/> <source>Failed to run wallet: </source> - <translation type="unfinished"></translation> + <translation>Échec du lancement du portefeuille : </translation> </message> <message> <location filename="../src/wallet/wallet_rpc_server.cpp" line="2972"/> @@ -4065,7 +4135,8 @@ daemon to work correctly.</source> <location filename="../src/wallet/wallet_args.cpp" line="138"/> <source>This is the command line monero wallet. It needs to connect to a monero daemon to work correctly.</source> - <translation type="unfinished"></translation> + <translation>Ceci est le portefeuille monero en ligne de commande. Il a besoin de se +connecter à un démon monero pour fonctionner correctement.</translation> </message> <message> <location filename="../src/wallet/wallet_args.cpp" line="161"/> |