diff --git a/.gitignore b/.gitignore
index 95c3303f..2e315104 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,8 @@
Wallet_*/
PCMiner_*/
AVRMiner_*/
+Duino-Coin PC Miner */
+Duino-Coin AVR Miner */
# Byte-compiled and optimized files
__pycache__/
diff --git a/AVR_Miner.py b/AVR_Miner.py
index 5bb33f13..4695e15b 100644
--- a/AVR_Miner.py
+++ b/AVR_Miner.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""
-Duino-Coin Official AVR Miner 3.4 © MIT licensed
+Duino-Coin Official AVR Miner 3.5 © MIT licensed
https://duinocoin.com
https://github.com/revoxhere/duino-coin
Duino-Coin Team & Community 2019-2023
@@ -109,7 +109,7 @@ def port_num(com):
class Settings:
- VER = '3.4'
+ VER = '3.5'
SOC_TIMEOUT = 15
REPORT_TIME = 120
AVR_TIMEOUT = 10
@@ -291,7 +291,6 @@ def check_mining_key(user_settings):
print("sys0",
Style.RESET_ALL + get_string("config_saved"),
"info")
- sleep(1.5)
return
if not response["success"]:
@@ -311,7 +310,6 @@ def check_mining_key(user_settings):
print("sys0",
Style.RESET_ALL + get_string("config_saved"),
"info")
- sleep(1.5)
check_mining_key(config)
else:
pretty_print(
@@ -319,7 +317,7 @@ def check_mining_key(user_settings):
get_string("invalid_mining_key"),
"error")
- retry = input("You want to retry? (y/n): ")
+ retry = input("Do you want to retry? (y/n): ")
if retry == "y" or retry == "Y":
mining_key = input("Enter your mining key: ")
user_settings["mining_key"] = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8')
@@ -531,6 +529,8 @@ def start(donation_level):
lang = "indonesian"
elif locale.startswith("cz"):
lang = "czech"
+ elif locale.startswith("fi"):
+ lang = "finnish"
else:
lang = 'english'
else:
@@ -651,12 +651,16 @@ def load_config():
if not correct_username:
print(get_string("incorrect_username"))
- mining_key = input(Style.RESET_ALL + Fore.YELLOW
+ response = requests.get(
+ "https://server.duinocoin.com/mining_key"
+ + "?u=" + username, timeout=10
+ ).json()
+
+ mining_key = "None"
+ if response["has_key"]:
+ mining_key = input(Style.RESET_ALL + Fore.YELLOW
+ get_string("ask_mining_key")
+ Fore.RESET + Style.BRIGHT)
- if not mining_key:
- mining_key = "None"
- else:
mining_key = b64.b64encode(mining_key.encode("utf-8")).decode('utf-8')
print(Style.RESET_ALL + Fore.YELLOW
@@ -675,6 +679,7 @@ def load_config():
port_names.append(port.device)
avrport = ''
+ rig_identifier = ''
while True:
current_port = input(
Style.RESET_ALL + Fore.YELLOW
@@ -682,29 +687,33 @@ def load_config():
+ Fore.RESET + Style.BRIGHT)
if current_port in port_names:
+ confirm_identifier = input(
+ Style.RESET_ALL + Fore.YELLOW
+ + get_string('ask_rig_identifier')
+ + Fore.RESET + Style.BRIGHT)
+ if confirm_identifier == 'y' or confirm_identifier == 'Y':
+ current_identifier = input(
+ Style.RESET_ALL + Fore.YELLOW
+ + get_string('ask_rig_name')
+ + Fore.RESET + Style.BRIGHT)
+ rig_identifier += current_identifier
+ else:
+ rig_identifier += "None"
+
avrport += current_port
confirmation = input(
Style.RESET_ALL + Fore.YELLOW
+ get_string('ask_anotherport')
+ Fore.RESET + Style.BRIGHT)
-
if confirmation == 'y' or confirmation == 'Y':
avrport += ','
+ rig_identifier += ','
else:
break
else:
print(Style.RESET_ALL + Fore.RED
+ 'Please enter a valid COM port from the list above')
- rig_identifier = input(
- Style.RESET_ALL + Fore.YELLOW
- + get_string('ask_rig_identifier')
- + Fore.RESET + Style.BRIGHT)
- if rig_identifier == 'y' or rig_identifier == 'Y':
- rig_identifier = input(
- Style.RESET_ALL + Fore.YELLOW
- + get_string('ask_rig_name')
- + Fore.RESET + Style.BRIGHT)
else:
rig_identifier = 'None'
@@ -742,6 +751,7 @@ def load_config():
config.write(configfile)
avrport = avrport.split(',')
+ rig_identifier = rig_identifier.split(',')
print(Style.RESET_ALL + get_string('config_saved'))
hashrate_list = [0] * len(avrport)
@@ -752,7 +762,7 @@ def load_config():
avrport = avrport.replace(" ", "").split(',')
donation_level = int(config["AVR Miner"]['donate'])
debug = config["AVR Miner"]['debug']
- rig_identifier = config["AVR Miner"]['identifier']
+ rig_identifier = config["AVR Miner"]['identifier'].split(',')
Settings.SOC_TIMEOUT = int(config["AVR Miner"]["soc_timeout"])
Settings.AVR_TIMEOUT = float(config["AVR Miner"]["avr_timeout"])
discord_presence = config["AVR Miner"]["discord_presence"]
@@ -802,7 +812,7 @@ def greeting():
+ Settings.BLOCK + Style.NORMAL
+ Fore.RESET + get_string('avr_on_port')
+ Style.BRIGHT + Fore.YELLOW
- + ' '.join(avrport))
+ + ', '.join(avrport))
if osname == 'nt' or osname == 'posix':
print(
@@ -911,10 +921,6 @@ def share_print(id, type, accept, reject, total_hashrate,
Produces nicely formatted CLI output for shares:
HH:MM:S |avrN| ⛏ Accepted 0/0 (100%) ∙ 0.0s ∙ 0 kH/s ⚙ diff 0 k ∙ ping 0ms
"""
- try:
- diff = get_prefix("", int(diff), 0)
- except:
- diff = "?"
try:
total_hashrate = get_prefix("H/s", total_hashrate, 2)
@@ -948,12 +954,13 @@ def share_print(id, type, accept, reject, total_hashrate,
+ f"ping {(int(ping))}ms")
-def mine_avr(com, threadid, fastest_pool):
+def mine_avr(com, threadid, fastest_pool, thread_rigid):
global hashrate
start_time = time()
report_shares = 0
last_report_share = 0
while True:
+ shares = [0, 0, 0]
while True:
try:
ser.close()
@@ -1041,7 +1048,8 @@ def mine_avr(com, threadid, fastest_pool):
prev_hash = "ba29a15896fd2d792d5c4b60668bf2b9feebc51d"
exp_hash = "d0beba883d7e8cd119ea2b0e09b78f60f29e0968"
exp_result = 50
- while True:
+ retries = 0
+ while retries < 3:
try:
debug_output(com + ': Sending hash test to the board')
ser.write(bytes(str(prev_hash
@@ -1069,21 +1077,28 @@ def mine_avr(com, threadid, fastest_pool):
break
except Exception as e:
debug_output(str(e))
+ retries += 1
+ else:
+ pretty_print('sys' + port_num(com),
+ f"Can't start mining on {com}" + Fore.RESET
+ + f" - board keeps responding improperly. "
+ + "Check if the code has been uploaded correctly "
+ + "and your device is supported by Duino-Coin.",
+ 'error')
+ break
start_diff = "AVR"
- if hashrate_test > 6000:
+ if hashrate_test > 12000:
+ start_diff = "ESP32"
+ elif hashrate_test > 6000:
start_diff = "ESP8266H"
-
elif hashrate_test > 4500:
start_diff = "ESP8266"
-
elif hashrate_test > 1000:
start_diff = "DUE"
-
- elif hashrate_test > 500:
+ elif hashrate_test > 520:
start_diff = "ARM"
-
- elif hashrate_test > 300:
+ elif hashrate_test > 370:
start_diff = "MEGA"
pretty_print('sys' + port_num(com),
@@ -1182,7 +1197,7 @@ def mine_avr(com, threadid, fastest_pool):
+ Settings.SEPARATOR
+ f'Official AVR Miner {Settings.VER}'
+ Settings.SEPARATOR
- + str(rig_identifier)
+ + str(thread_rigid)
+ Settings.SEPARATOR
+ str(result[2]))
@@ -1328,7 +1343,7 @@ def calculate_uptime(start_time):
for port in avrport:
Thread(target=mine_avr,
args=(port, threadid,
- fastest_pool)).start()
+ fastest_pool, rig_identifier[threadid])).start()
threadid += 1
except Exception as e:
debug_output(f'Error launching AVR thread(s): {e}')
diff --git a/Arduino_Code/Arduino_Code.ino b/Arduino_Code/Arduino_Code.ino
index fa594b05..60062380 100644
--- a/Arduino_Code/Arduino_Code.ino
+++ b/Arduino_Code/Arduino_Code.ino
@@ -23,24 +23,26 @@ for default settings use -O0. -O may be a good tradeoff between both */
/* For 8-bit microcontrollers we should use 16 bit variables since the
difficulty is low, for all the other cases should be 32 bits. */
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
-typedef uint16_t uintDiff;
+typedef uint32_t uintDiff;
#else
typedef uint32_t uintDiff;
#endif
// Arduino identifier library - https://github.com/ricaun
#include "uniqueID.h"
-#include "sha1.h"
-// Create globals
-String lastblockhash = "";
-String newblockhash = "";
+#include "duco_hash.h"
+
+String get_DUCOID() {
+ String ID = "DUCOID";
+ char buff[4];
+ for (size_t i = 0; i < 8; i++) {
+ sprintf(buff, "%02X", (uint8_t)UniqueID8[i]);
+ ID += buff;
+ }
+ return ID;
+}
+
String DUCOID = "";
-uintDiff difficulty = 0;
-uintDiff ducos1result = 0;
-// 40+40+20+3 is the maximum size of a job
-const uint16_t job_maxsize = 104;
-uint8_t job[job_maxsize];
-Sha1Wrapper Sha1_base;
void setup() {
// Prepare built-in led pin as output
@@ -54,83 +56,107 @@ void setup() {
Serial.flush();
}
+void lowercase_hex_to_bytes(char const * hexDigest, uint8_t * rawDigest) {
+ for (uint8_t i = 0, j = 0; j < SHA1_HASH_LEN; i += 2, j += 1) {
+ uint8_t x = hexDigest[i];
+ uint8_t b = x >> 6;
+ uint8_t r = ((x & 0xf) | (b << 3)) + b;
+
+ x = hexDigest[i + 1];
+ b = x >> 6;
+
+ rawDigest[j] = (r << 4) | (((x & 0xf) | (b << 3)) + b);
+ }
+}
+
// DUCO-S1A hasher
-uintDiff ducos1a(String lastblockhash, String newblockhash,
- uintDiff difficulty) {
- newblockhash.toUpperCase();
- const char *c = newblockhash.c_str();
- uint8_t final_len = newblockhash.length() >> 1;
- for (uint8_t i = 0, j = 0; j < final_len; i += 2, j++)
- job[j] = ((((c[i] & 0x1F) + 9) % 25) << 4) + ((c[i + 1] & 0x1F) + 9) % 25;
-
- // Difficulty loop
+uintDiff ducos1a(char const * prevBlockHash, char const * targetBlockHash, uintDiff difficulty) {
#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
// If the difficulty is too high for AVR architecture then return 0
if (difficulty > 655) return 0;
#endif
- Sha1_base.init();
- Sha1_base.print(lastblockhash);
- for (uintDiff ducos1res = 0; ducos1res < difficulty * 100 + 1; ducos1res++) {
- Sha1 = Sha1_base;
- Sha1.print(String(ducos1res));
- // Get SHA1 result
- uint8_t *hash_bytes = Sha1.result();
- if (memcmp(hash_bytes, job, SHA1_HASH_LEN * sizeof(char)) == 0) {
- // If expected hash is equal to the found hash, return the result
- return ducos1res;
- }
- }
- return 0;
+
+ uint8_t target[SHA1_HASH_LEN];
+ lowercase_hex_to_bytes(targetBlockHash, target);
+
+ uintDiff const maxNonce = difficulty * 100 + 1;
+ return ducos1a_mine(prevBlockHash, target, maxNonce);
}
-String get_DUCOID() {
- String ID = "DUCOID";
- char buff[4];
- for (size_t i = 0; i < 8; i++) {
- sprintf(buff, "%02X", (uint8_t)UniqueID8[i]);
- ID += buff;
+uintDiff ducos1a_mine(char const * prevBlockHash, uint8_t const * target, uintDiff maxNonce) {
+ static duco_hash_state_t hash;
+ duco_hash_init(&hash, prevBlockHash);
+
+ char nonceStr[10 + 1];
+ for (uintDiff nonce = 0; nonce < maxNonce; nonce++) {
+ ultoa(nonce, nonceStr, 10);
+
+ uint8_t const * hash_bytes = duco_hash_try_nonce(&hash, nonceStr);
+ if (memcmp(hash_bytes, target, SHA1_HASH_LEN) == 0) {
+ return nonce;
+ }
}
- return ID;
+
+ return 0;
}
void loop() {
// Wait for serial data
- if (Serial.available() > 0) {
- memset(job, 0, job_maxsize);
- // Read last block hash
- lastblockhash = Serial.readStringUntil(',');
- // Read expected hash
- newblockhash = Serial.readStringUntil(',');
- // Read difficulty
- difficulty = strtoul(Serial.readStringUntil(',').c_str(), NULL, 10);
- // Clearing the receive buffer reading one job.
- while (Serial.available()) Serial.read();
- // Turn on the built-in led
- #if defined(ARDUINO_ARCH_AVR)
- PORTB = PORTB | B00100000;
- #else
- digitalWrite(LED_BUILTIN, LOW);
- #endif
- // Start time measurement
- uint32_t startTime = micros();
- // Call DUCO-S1A hasher
- ducos1result = ducos1a(lastblockhash, newblockhash, difficulty);
- // Calculate elapsed time
- uint32_t elapsedTime = micros() - startTime;
- // Turn on the built-in led
- #if defined(ARDUINO_ARCH_AVR)
- PORTB = PORTB & B11011111;
- #else
- digitalWrite(LED_BUILTIN, HIGH);
- #endif
- // Clearing the receive buffer before sending the result.
- while (Serial.available()) Serial.read();
- // Send result back to the program with share time
- Serial.print(String(ducos1result, 2)
- + ","
- + String(elapsedTime, 2)
- + ","
- + String(DUCOID)
- + "\n");
+ if (Serial.available() <= 0) {
+ return;
+ }
+
+ // Reserve 1 extra byte for comma separator (and later zero)
+ char lastBlockHash[40 + 1];
+ char newBlockHash[40 + 1];
+
+ // Read last block hash
+ if (Serial.readBytesUntil(',', lastBlockHash, 41) != 40) {
+ return;
+ }
+ lastBlockHash[40] = 0;
+
+ // Read expected hash
+ if (Serial.readBytesUntil(',', newBlockHash, 41) != 40) {
+ return;
}
+ newBlockHash[40] = 0;
+
+ // Read difficulty
+ uintDiff difficulty = strtoul(Serial.readStringUntil(',').c_str(), NULL, 10);
+ // Clearing the receive buffer reading one job.
+ while (Serial.available()) Serial.read();
+ // Turn on the built-in led
+ #if defined(ARDUINO_ARCH_AVR)
+ PORTB = PORTB | B00100000;
+ #else
+ digitalWrite(LED_BUILTIN, LOW);
+ #endif
+
+ // Start time measurement
+ uint32_t startTime = micros();
+
+ // Call DUCO-S1A hasher
+ uintDiff ducos1result = ducos1a(lastBlockHash, newBlockHash, difficulty);
+
+ // Calculate elapsed time
+ uint32_t elapsedTime = micros() - startTime;
+
+ // Turn on the built-in led
+ #if defined(ARDUINO_ARCH_AVR)
+ PORTB = PORTB & B11011111;
+ #else
+ digitalWrite(LED_BUILTIN, HIGH);
+ #endif
+
+ // Clearing the receive buffer before sending the result.
+ while (Serial.available()) Serial.read();
+
+ // Send result back to the program with share time
+ Serial.print(String(ducos1result, 2)
+ + ","
+ + String(elapsedTime, 2)
+ + ","
+ + String(DUCOID)
+ + "\n");
}
diff --git a/Arduino_Code/backend.cpp b/Arduino_Code/backend.cpp
deleted file mode 100644
index 70c9d201..00000000
--- a/Arduino_Code/backend.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#pragma GCC optimize ("-Ofast")
-#include "config.h"
-
-#ifndef SHA1_DISABLED
-#include "sha1/constants.c"
-#include "sha1/hash.c"
-#include "sha1/types.c"
-#include "sha1/sha1.c"
-#endif
diff --git a/Arduino_Code/config.h b/Arduino_Code/config.h
deleted file mode 100644
index 4406388a..00000000
--- a/Arduino_Code/config.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#pragma GCC optimize ("-Ofast")
-
-// include the module config first,
-// overwrite it in the arduino interface config.
-#include "sha1/default.h"
-
-#ifndef SHA_CONFIG_H_
-#define SHA_CONFIG_H_
-
-// No changes yet.
-
-#endif
diff --git a/Arduino_Code/duco_hash.cpp b/Arduino_Code/duco_hash.cpp
new file mode 100644
index 00000000..f5d1cc16
--- /dev/null
+++ b/Arduino_Code/duco_hash.cpp
@@ -0,0 +1,152 @@
+#include "duco_hash.h"
+
+#pragma GCC optimize ("-Ofast")
+
+#define sha1_rotl(bits,word) (((word) << (bits)) | ((word) >> (32 - (bits))))
+
+void duco_hash_block(duco_hash_state_t * hasher) {
+ // NOTE: keeping this static improves performance quite a lot
+ static uint32_t w[16];
+
+ for (uint8_t i = 0, i4 = 0; i < 16; i++, i4 += 4) {
+ w[i] = (uint32_t(hasher->buffer[i4]) << 24) |
+ (uint32_t(hasher->buffer[i4 + 1]) << 16) |
+ (uint32_t(hasher->buffer[i4 + 2]) << 8) |
+ (uint32_t(hasher->buffer[i4 + 3]));
+ }
+
+ uint32_t a = hasher->tempState[0];
+ uint32_t b = hasher->tempState[1];
+ uint32_t c = hasher->tempState[2];
+ uint32_t d = hasher->tempState[3];
+ uint32_t e = hasher->tempState[4];
+
+ for (uint8_t i = 10; i < 80; i++) {
+ if (i >= 16) {
+ w[i & 15] = sha1_rotl(1, w[(i-3) & 15] ^ w[(i-8) & 15] ^ w[(i-14) & 15] ^ w[(i-16) & 15]);
+ }
+
+ uint32_t temp = sha1_rotl(5, a) + e + w[i & 15];
+ if (i < 20) {
+ temp += (b & c) | ((~b) & d);
+ temp += 0x5a827999;
+ } else if(i < 40) {
+ temp += b ^ c ^ d;
+ temp += 0x6ed9eba1;
+ } else if(i < 60) {
+ temp += (b & c) | (b & d) | (c & d);
+ temp += 0x8f1bbcdc;
+ } else {
+ temp += b ^ c ^ d;
+ temp += 0xca62c1d6;
+ }
+
+ e = d;
+ d = c;
+ c = sha1_rotl(30, b);
+ b = a;
+ a = temp;
+ }
+
+ a += 0x67452301;
+ b += 0xefcdab89;
+ c += 0x98badcfe;
+ d += 0x10325476;
+ e += 0xc3d2e1f0;
+
+ hasher->result[0 * 4 + 0] = a >> 24;
+ hasher->result[0 * 4 + 1] = a >> 16;
+ hasher->result[0 * 4 + 2] = a >> 8;
+ hasher->result[0 * 4 + 3] = a;
+ hasher->result[1 * 4 + 0] = b >> 24;
+ hasher->result[1 * 4 + 1] = b >> 16;
+ hasher->result[1 * 4 + 2] = b >> 8;
+ hasher->result[1 * 4 + 3] = b;
+ hasher->result[2 * 4 + 0] = c >> 24;
+ hasher->result[2 * 4 + 1] = c >> 16;
+ hasher->result[2 * 4 + 2] = c >> 8;
+ hasher->result[2 * 4 + 3] = c;
+ hasher->result[3 * 4 + 0] = d >> 24;
+ hasher->result[3 * 4 + 1] = d >> 16;
+ hasher->result[3 * 4 + 2] = d >> 8;
+ hasher->result[3 * 4 + 3] = d;
+ hasher->result[4 * 4 + 0] = e >> 24;
+ hasher->result[4 * 4 + 1] = e >> 16;
+ hasher->result[4 * 4 + 2] = e >> 8;
+ hasher->result[4 * 4 + 3] = e;
+}
+
+void duco_hash_init(duco_hash_state_t * hasher, char const * prevHash) {
+ for (uint8_t i = 0; i < 40; i++) {
+ hasher->buffer[i] = prevHash[i];
+ }
+
+ if (prevHash == (void*)(0xffffffff)) {
+ // NOTE: THIS IS NEVER CALLED
+ // This is here to keep a live reference to hash_block
+ // Otherwise GCC tries to inline it entirely into the main loop
+ // Which causes massive perf degradation
+ duco_hash_block(nullptr);
+ }
+
+ // Do first 10 rounds as these are going to be the same all time
+
+ uint32_t a = 0x67452301;
+ uint32_t b = 0xefcdab89;
+ uint32_t c = 0x98badcfe;
+ uint32_t d = 0x10325476;
+ uint32_t e = 0xc3d2e1f0;
+
+ static uint32_t w[10];
+
+ for (uint8_t i = 0, i4 = 0; i < 10; i++, i4 += 4) {
+ w[i] = (uint32_t(hasher->buffer[i4]) << 24) |
+ (uint32_t(hasher->buffer[i4 + 1]) << 16) |
+ (uint32_t(hasher->buffer[i4 + 2]) << 8) |
+ (uint32_t(hasher->buffer[i4 + 3]));
+ }
+
+ for (uint8_t i = 0; i < 10; i++) {
+ uint32_t temp = sha1_rotl(5, a) + e + w[i & 15];
+ temp += (b & c) | ((~b) & d);
+ temp += 0x5a827999;
+
+ e = d;
+ d = c;
+ c = sha1_rotl(30, b);
+ b = a;
+ a = temp;
+ }
+
+ hasher->tempState[0] = a;
+ hasher->tempState[1] = b;
+ hasher->tempState[2] = c;
+ hasher->tempState[3] = d;
+ hasher->tempState[4] = e;
+}
+
+void duco_hash_set_nonce(duco_hash_state_t * hasher, char const * nonce) {
+ uint8_t * b = hasher->buffer;
+
+ uint8_t off = SHA1_HASH_LEN * 2;
+ for (uint8_t i = 0; i < 10 && nonce[i] != 0; i++) {
+ b[off++] = nonce[i];
+ }
+
+ uint8_t total_bytes = off;
+
+ b[off++] = 0x80;
+ while (off < 62) {
+ b[off++] = 0;
+ }
+
+ b[62] = total_bytes >> 5;
+ b[63] = total_bytes << 3;
+}
+
+uint8_t const * duco_hash_try_nonce(duco_hash_state_t * hasher, char const * nonce) {
+ duco_hash_set_nonce(hasher, nonce);
+ duco_hash_block(hasher);
+
+ return hasher->result;
+}
diff --git a/Arduino_Code/duco_hash.h b/Arduino_Code/duco_hash.h
new file mode 100644
index 00000000..fae94d18
--- /dev/null
+++ b/Arduino_Code/duco_hash.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include
+
+#define SHA1_BLOCK_LEN 64
+#define SHA1_HASH_LEN 20
+
+struct duco_hash_state_t {
+ uint8_t buffer[SHA1_BLOCK_LEN];
+ uint8_t result[SHA1_HASH_LEN];
+ uint32_t tempState[5];
+
+ uint8_t block_offset;
+ uint8_t total_bytes;
+};
+
+void duco_hash_init(duco_hash_state_t * hasher, char const * prevHash);
+
+uint8_t const * duco_hash_try_nonce(duco_hash_state_t * hasher, char const * nonce);
diff --git a/Arduino_Code/sha1.cpp b/Arduino_Code/sha1.cpp
deleted file mode 100644
index ed8eebf9..00000000
--- a/Arduino_Code/sha1.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#pragma GCC optimize ("-Ofast")
-
-#include "sha1.h"
-
-#ifndef SHA1_DISABLED
-#ifndef SHA1_DISABLE_WRAPPER
-void Sha1Wrapper::init(void)
-{
- sha1_hasher_init(&_hasher);
-}
-
-#ifdef SHA1_ENABLE_HMAC
-void Sha1Wrapper::initHmac(const uint8_t * secret, uint16_t secretLength)
-{
- sha1_hasher_init_hmac(&_hasher, secret, secretLength);
-}
-
-uint8_t * Sha1Wrapper::resultHmac(void)
-{
- return sha1_hasher_gethmac(&_hasher);
-}
-#endif
-
-
-size_t Sha1Wrapper::write(uint8_t byte)
-{
- if(sha1_hasher_putc(&_hasher, byte) == byte)
- {
- return 1;
- }
- return 0;
-}
-
-uint8_t * Sha1Wrapper::result(void)
-{
- return sha1_hasher_gethash(&_hasher);
-}
-
-Sha1Wrapper Sha1;
-
-#endif
-#endif
diff --git a/Arduino_Code/sha1.h b/Arduino_Code/sha1.h
deleted file mode 100644
index 50bfe622..00000000
--- a/Arduino_Code/sha1.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#pragma GCC optimize ("-Ofast")
-
-#include "config.h"
-
-#ifndef Sha1_h
-#define Sha1_h
-
-#include
-#include "Print.h"
-#include "sha1/sha1.h"
-
-#ifndef SHA1_DISABLE_WRAPPER
-class Sha1Wrapper : public Print
-{
- public:
- void init(void);
- uint8_t * result(void);
-#ifdef SHA1_ENABLE_HMAC
- void initHmac(const uint8_t * secret, uint16_t secretLength);
- uint8_t * resultHmac(void);
-#endif
- virtual size_t write(uint8_t);
- using Print::write;
- private:
- struct sha1_hasher_s _hasher;
-
-};
-
-extern Sha1Wrapper Sha1;
-#endif
-
-#endif
diff --git a/Arduino_Code/sha1/basic.h b/Arduino_Code/sha1/basic.h
deleted file mode 100644
index 1f021c7c..00000000
--- a/Arduino_Code/sha1/basic.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#ifndef SHA1_BASIC_H_
-#define SHA1_BASIC_H_
-
-#include "default.h"
-#include
-
-#define sha1_rotl(bits,word) (((word) << (bits)) | ((word) >> (32 - (bits))))
-
-#endif
-
diff --git a/Arduino_Code/sha1/constants.c b/Arduino_Code/sha1/constants.c
deleted file mode 100644
index 4d044969..00000000
--- a/Arduino_Code/sha1/constants.c
+++ /dev/null
@@ -1,30 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#include "constants.h"
-
-const uint32_t sha1_init_state[SHA1_HASH_LEN / 4] PROGMEM =
-{
- 0x67452301, 0xefcdab89, 0x98badcfe,
- 0x10325476, 0xc3d2e1f0
-};
-
-const uint32_t sha1_constants[4] PROGMEM =
-{
- 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6
-};
-
-
diff --git a/Arduino_Code/sha1/constants.h b/Arduino_Code/sha1/constants.h
deleted file mode 100644
index 294d72d0..00000000
--- a/Arduino_Code/sha1/constants.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#ifndef SHA1_CONSTANTS_H_
-#define SHA1_CONSTANTS_H_
-
-#include "default.h"
-#include
-
-#define SHA1_BLOCK_LEN 64
-#define SHA1_HASH_LEN 20
-
-#include "Arduino.h"
-
-extern const uint32_t sha1_init_state[SHA1_HASH_LEN / 4] PROGMEM;
-
-extern const uint32_t sha1_constants[4] PROGMEM;
-
-
-// From RFC3174 (http://www.faqs.org/rfcs/rfc3174.html)
-// (Section 5):
-//
-// A sequence of constant words K(0), K(1), ... , K(79) is used in the
-// SHA-1. In hex these are given by
-//
-// K(t) = 5A827999 ( 0 <= t <= 19)
-//
-// K(t) = 6ED9EBA1 (20 <= t <= 39)
-//
-// K(t) = 8F1BBCDC (40 <= t <= 59)
-//
-// K(t) = CA62C1D6 (60 <= t <= 79).
-//
-// This can be achieved using an integer division by 20 and only 4 constants.
-
-#define sha1_k(i) pgm_read_dword(sha1_constants + (i / 20))
-
-
-#ifdef SHA1_ENABLE_HMAC
-#define SHA1_HMAC_IPAD 0x36
-#define SHA1_HMAC_OPAD 0x5c
-#endif
-
-#endif
-
diff --git a/Arduino_Code/sha1/default.h b/Arduino_Code/sha1/default.h
deleted file mode 100644
index 2474e9e8..00000000
--- a/Arduino_Code/sha1/default.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-// This file is the module config header
-// when the arduino interface is NOT used.
-//
-// If you want to use the library with Arduino,
-// edit sha/config.h. If you use a proper build system,
-// use this config file for sha1 and sha/sha256/default.h
-// for sha256.
-#ifndef SHA1_DEFAULT_H_
-#define SHA1_DEFAULT_H_
-
-#define SHA1_ENABLE_HMAC
-
-
-#endif
-
diff --git a/Arduino_Code/sha1/hash.c b/Arduino_Code/sha1/hash.c
deleted file mode 100644
index 143ed63e..00000000
--- a/Arduino_Code/sha1/hash.c
+++ /dev/null
@@ -1,222 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#include "hash.h"
-#include
-#include
-
-
-void sha1_hash_block(sha1_hasher_t hasher)
-{
- uint8_t i;
- uint32_t a, b, c, d, e, temp;
-
- // XXX: Omit initializing the message schedule.
- // See how I did this below.
- // Allocating the message schedule would eat 2k RAM
- // which is a no-go on an AVR.
- uint8_t i4;
- // On x86 we have to change the byte order, because...
- // I actually do not know.
- for(i = i4 = 0; i < 16; i++, i4 += 4)
- {
- hasher->buffer.words[i] = (((uint32_t)hasher->buffer.bytes[i4]) << 24) |
- (((uint32_t)hasher->buffer.bytes[i4 + 1]) << 16) |
- (((uint32_t)hasher->buffer.bytes[i4 + 2]) << 8) |
- (((uint32_t)hasher->buffer.bytes[i4 + 3]));
- }
-
- a = hasher->state.words[0];
- b = hasher->state.words[1];
- c = hasher->state.words[2];
- d = hasher->state.words[3];
- e = hasher->state.words[4];
-
- for(i = 0; i < 80; i++)
- {
- // XXX:
- // This part of the computation omits the message schedule
- // W as described in https://tools.ietf.org/html/rfc4634
- // The first 16 words of the message schedule is just the block
- // anyways and the computation of the message schedule uses only
- // the last 16 words, so we can do that.
- if( i >= 16 )
- {
- hasher->buffer.words[i & 15] = sha1_rotl(1
- , hasher->buffer.words[(i - 3)& 15]
- ^ hasher->buffer.words[(i - 8)& 15]
- ^ hasher->buffer.words[(i - 14)& 15]
- ^ hasher->buffer.words[(i - 16)& 15]);
- }
-
- temp = sha1_rotl(5, a) + e + hasher->buffer.words[i & 15] + sha1_k(i);
- if(i < 20)
- {
- temp += (b & c) | ((~b) & d);
- }
- else if(i < 40)
- {
- temp += b ^ c ^ d;
- }
- else if(i < 60)
- {
- temp += (b & c) | (b & d) | (c & d);
- }
- else
- {
- temp += b ^ c ^ d;
- }
-
-
-
-
-
- e = d;
- d = c;
- c = sha1_rotl(30, b);
- b = a;
- a = temp;
- }
- hasher->state.words[0] += a;
- hasher->state.words[1] += b;
- hasher->state.words[2] += c;
- hasher->state.words[3] += d;
- hasher->state.words[4] += e;
-
-}
-
-
-
-void sha1_hasher_add_byte(sha1_hasher_t hasher, uint8_t byte)
-{
- hasher->buffer.bytes[hasher->block_offset] = byte;
- hasher->block_offset++;
- if(hasher->block_offset == SHA1_BLOCK_LEN)
- {
- sha1_hash_block(hasher);
- hasher->block_offset = 0;
- }
-}
-
-/**
- * NOTE: once the block has been pad'ed the hasher will
- * produce nonsense data. Therefore putc will return EOF
- * once the hasher has been pad'ed (this happens, when
- * sha1_hasher_gethash or sha1_hasher_gethmac are invoced).
- * */
-uint8_t sha1_hasher_putc(sha1_hasher_t hasher, uint8_t byte)
-{
- if(hasher->_lock)
- {
- return EOF;
- }
- hasher->total_bytes++;
- sha1_hasher_add_byte(hasher, byte);
- return byte;
-
-}
-
-
-
-void sha1_hasher_pad(sha1_hasher_t hasher)
-{
- hasher->_lock = 1;
- sha1_hasher_add_byte(hasher, 0x80);
- while(hasher->block_offset != 56)
- {
- sha1_hasher_add_byte(hasher, 0);
- }
-
- // FIXME:
- // Use a loop for this.
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 56);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 48);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 40);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 32);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 24);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 16);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8 >> 8);
- sha1_hasher_add_byte(hasher, hasher->total_bytes * 8);
-
-}
-
-uint8_t * sha1_hasher_gethash(sha1_hasher_t hasher)
-{
- sha1_hasher_pad(hasher);
- uint8_t i;
-
- // switch byte order.
- for(i = 0; i < (SHA1_HASH_LEN / 4); i++)
- {
- uint32_t a, b;
- a = hasher->state.words[i];
- b = a << 24;
- b |= ( a << 8) & 0x00ff0000;
- b |= ( a >> 8) & 0x0000ff00;
- b |= a >> 24;
- hasher->state.words[i] = b;
- }
- return hasher->state.bytes;
-}
-
-
-#ifdef SHA1_ENABLE_HMAC
-void sha1_hasher_init_hmac(sha1_hasher_t hasher, const uint8_t * key, size_t key_len)
-{
- uint8_t i;
- memset(hasher->hmac_key_buffer, 0, SHA1_BLOCK_LEN);
-
- if(key_len > SHA1_BLOCK_LEN)
- {
- sha1_hasher_init(hasher);
- while(key_len--)
- {
- sha1_hasher_putc(hasher, *key++);
- }
- memcpy(hasher->hmac_key_buffer,
- sha1_hasher_gethash(hasher),
- SHA1_HASH_LEN);
- }
- else
- {
- memcpy(hasher->hmac_key_buffer, key, key_len);
- }
- sha1_hasher_init(hasher);
- for(i = 0; i < SHA1_BLOCK_LEN; i++)
- {
- sha1_hasher_putc(hasher, hasher->hmac_key_buffer[i] ^ SHA1_HMAC_IPAD);
- }
-
-}
-uint8_t * sha1_hasher_gethmac(sha1_hasher_t hasher)
-{
- uint8_t i;
- memcpy(hasher->hmac_inner_hash, sha1_hasher_gethash(hasher),
- SHA1_HASH_LEN);
- sha1_hasher_init(hasher);
-
- for(i = 0; i < SHA1_BLOCK_LEN; i++)
- {
- sha1_hasher_putc(hasher, hasher->hmac_key_buffer[i] ^ SHA1_HMAC_OPAD);
- }
- for(i = 0; i < SHA1_HASH_LEN; i++)
- {
- sha1_hasher_putc(hasher, hasher->hmac_inner_hash[i]);
- }
- return sha1_hasher_gethash(hasher);
-}
-#endif
-
diff --git a/Arduino_Code/sha1/hash.h b/Arduino_Code/sha1/hash.h
deleted file mode 100644
index 28dc4850..00000000
--- a/Arduino_Code/sha1/hash.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#ifndef SHA1_HASH_H_
-#define SHA1_HASH_H_
-
-
-#include "default.h"
-#include "constants.h"
-#include "types.h"
-#include "basic.h"
-
-void sha1_hash_block(sha1_hasher_t hasher);
-
-void sha1_hasher_add_byte(sha1_hasher_t hasher, uint8_t byte);
-
-/**
- * NOTE: once the block has been pad'ed the hasher will
- * produce nonsense data. Therefore putc will return EOF
- * once the hasher has been pad'ed (this happens, when
- * sha1_hasher_gethash or sha1_hasher_gethmac are invoced).
- * */
-uint8_t sha1_hasher_putc(sha1_hasher_t hasher, uint8_t byte);
-
-void sha1_hasher_pad(sha1_hasher_t hasher);
-
-/**
- * NOTE: this will NOT return a copy of the data but
- * a REFERENCE! One MUST NOT free the result.
- *
- * Also this modifies the state of the hasher. The
- * hasher has an internal lock ensuring that writing
- * to the hasher fails after this operation.
- * */
-uint8_t * sha1_hasher_gethash(sha1_hasher_t hasher);
-
-#ifdef SHA1_ENABLE_HMAC
-void sha1_hasher_init_hmac(sha1_hasher_t hasher, const uint8_t * key, size_t key_len);
-uint8_t * sha1_hasher_gethmac(sha1_hasher_t hasher);
-#endif
-
-#endif
-
diff --git a/Arduino_Code/sha1/sha1.c b/Arduino_Code/sha1/sha1.c
deleted file mode 100644
index 925374eb..00000000
--- a/Arduino_Code/sha1/sha1.c
+++ /dev/null
@@ -1,36 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#include "sha1.h"
-
-ssize_t sha1_hasher_write(sha1_hasher_t hasher, const void * buf, size_t count)
-{
- size_t written = 0;
- uint8_t chk_result;
- char c;
- while(written < count)
- {
- c = ((char *) buf)[written];
- chk_result = sha1_hasher_putc(hasher, c);
- if(chk_result != c)
- {
- return -1;
- }
- written++;
- }
- return written;
-}
-
diff --git a/Arduino_Code/sha1/sha1.h b/Arduino_Code/sha1/sha1.h
deleted file mode 100644
index 24544498..00000000
--- a/Arduino_Code/sha1/sha1.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#ifndef SHA1_SHA1_H_
-#define SHA1_SHA1_H_
-
-#include "default.h"
-#include "types.h"
-#include "hash.h"
-#include
-//#include
-
-#ifndef ssize_t
-#define ssize_t long int
-#endif
-
-ssize_t sha1_hasher_write(sha1_hasher_t hasher, const void * buf, size_t count);
-
-#endif
-
diff --git a/Arduino_Code/sha1/types.c b/Arduino_Code/sha1/types.c
deleted file mode 100644
index 0199bbfe..00000000
--- a/Arduino_Code/sha1/types.c
+++ /dev/null
@@ -1,52 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#include "types.h"
-#include
-#include
-#include "constants.h"
-
-sha1_hasher_t sha1_hasher_new(void)
-{
- sha1_hasher_t hasher = (sha1_hasher_t) malloc(sizeof(struct sha1_hasher_s));
- if(!hasher)
- {
- return NULL;
- }
- sha1_hasher_init(hasher);
- return hasher;
-}
-
-void sha1_hasher_init(sha1_hasher_t hasher)
-{
- uint8_t i;
- for(i = 0; i < SHA1_HASH_LEN / 4; i++)
- {
- hasher->state.words[i] = pgm_read_dword(sha1_init_state + i);
- }
- hasher->block_offset = 0;
- hasher->total_bytes = 0;
- hasher->_lock = 0;
-
-}
-
-
-void sha1_hasher_del(sha1_hasher_t hasher)
-{
- free(hasher);
-}
-
-
diff --git a/Arduino_Code/sha1/types.h b/Arduino_Code/sha1/types.h
deleted file mode 100644
index d0a681f5..00000000
--- a/Arduino_Code/sha1/types.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// This file is part of cryptosuite2. //
-// //
-// cryptosuite2 is free software: you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation, either version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// cryptosuite2 is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with cryptosuite2. If not, see . //
-// //
-
-#ifndef SHA1_TYPES_H_
-#define SHA1_TYPES_H_
-
-#include "default.h"
-#include
-#include
-#include "constants.h"
-
-
-typedef union
-{
- uint8_t bytes[SHA1_HASH_LEN];
- uint32_t words[SHA1_HASH_LEN / 4];
-
-} sha1_state_t;
-
-typedef union
-{
- uint8_t bytes[SHA1_BLOCK_LEN];
- uint32_t words[SHA1_BLOCK_LEN / 4];
-
-} sha1_block_t;
-
-typedef struct __attribute__((__packed__)) sha1_hasher_s
-{
- sha1_state_t state;
- sha1_block_t buffer;
-
- uint8_t block_offset;
- uint64_t total_bytes;
- uint8_t _lock;
-#ifdef SHA1_ENABLE_HMAC
- uint8_t hmac_key_buffer[SHA1_BLOCK_LEN];
- uint8_t hmac_inner_hash[SHA1_HASH_LEN];
-#endif
-} * sha1_hasher_t;
-
-sha1_hasher_t sha1_hasher_new(void);
-void sha1_hasher_del(sha1_hasher_t hasher);
-void sha1_hasher_init(sha1_hasher_t hasher);
-
-
-#endif
-
diff --git a/ESP32_Code/ESP32_Code.ino b/ESP32_Code/ESP32_Code.ino
index cf208f05..3c17b18b 100644
--- a/ESP32_Code/ESP32_Code.ino
+++ b/ESP32_Code/ESP32_Code.ino
@@ -3,7 +3,7 @@
( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( )
)(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) (
(____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_)
- Official code for ESP32 boards version 3.4
+ Official code for ESP32 boards version 3.5
Duino-Coin Team & Community 2019-2022 © MIT Licensed
https://duinocoin.com
@@ -265,7 +265,7 @@ SemaphoreHandle_t xMutex;
const char * DEVICE = "ESP32";
const char * POOLPICKER_URL[] = {"https://server.duinocoin.com/getPool"};
const char * MINER_BANNER = "Official ESP32 Miner";
-const char * MINER_VER = "3.4";
+const char * MINER_VER = "3.5";
String pool_name = "";
String host = "";
String node_id = "";
@@ -963,7 +963,7 @@ void setup() {
xMutex = xSemaphoreCreateMutex();
xTaskCreatePinnedToCore(
WiFireconnect, "WiFirec", 10000, NULL, NUMBEROFCORES + 2, &WiFirec,
- mqttCore); // create a task with highest priority and executed on core 0
+ wifiCore); // create a task with highest priority and executed on core 0
delay(250);
// If MQTT is enabled create a sending thread
diff --git a/ESP8266_Code/ESP8266_Code.ino b/ESP8266_Code/ESP8266_Code.ino
index d1d317a3..ffccd876 100644
--- a/ESP8266_Code/ESP8266_Code.ino
+++ b/ESP8266_Code/ESP8266_Code.ino
@@ -3,7 +3,7 @@
( _ \( )( )(_ _)( \( )( _ )___ / __)( _ )(_ _)( \( )
)(_) ))(__)( _)(_ ) ( )(_)((___)( (__ )(_)( _)(_ ) (
(____/(______)(____)(_)\_)(_____) \___)(_____)(____)(_)\_)
- Official code for ESP8266 boards version 3.4
+ Official code for ESP8266 boards version 3.5
Duino-Coin Team & Community 2019-2022 © MIT Licensed
https://duinocoin.com
@@ -158,7 +158,7 @@ const bool LED_BLINKING = true;
const char * DEVICE = "ESP8266";
const char * POOLPICKER_URL[] = {"https://server.duinocoin.com/getPool"};
const char * MINER_BANNER = "Official ESP8266 Miner";
-const char * MINER_VER = "3.4";
+const char * MINER_VER = "3.5";
unsigned int share_count = 0;
unsigned int port = 0;
unsigned int difficulty = 0;
diff --git a/LICENSE b/LICENSE
index fd6ef7b9..b2bc599c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2019-2022 Robert Piotrowski
+Copyright (c) 2019-present Robert Piotrowski
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/PC_Miner.py b/PC_Miner.py
index 535b9a2d..e957477b 100644
--- a/PC_Miner.py
+++ b/PC_Miner.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""
-Duino-Coin Official PC Miner 3.4 © MIT licensed
+Duino-Coin Official PC Miner 3.5 © MIT licensed
https://duinocoin.com
https://github.com/revoxhere/duino-coin
Duino-Coin Team & Community 2019-2023
@@ -72,7 +72,7 @@ def handler(signal_received, frame):
if sys.platform == "win32":
_exit(0)
else:
- Popen("kill $(ps awux | grep PC_Miner | grep -v grep | awk '{print $2}')",
+ Popen("kill $(ps aux | grep PC_Miner | awk '{print $2}')",
shell=True, stdout=PIPE)
@@ -140,7 +140,7 @@ class Settings:
"""
ENCODING = "UTF8"
SEPARATOR = ","
- VER = 3.4
+ VER = 3.5
DATA_DIR = "Duino-Coin PC Miner " + str(VER)
TRANSLATIONS = ("https://raw.githubusercontent.com/"
+ "revoxhere/"
@@ -853,6 +853,8 @@ def preload():
lang = "indonesian"
elif locale.startswith("cz"):
lang = "czech"
+ elif locale.startswith("fi"):
+ lang = "finnish"
else:
lang = "english"
else:
@@ -1053,6 +1055,8 @@ def mine(id: int, user_settings: list,
last_report = time()
r_shares, last_shares = 0, 0
while True:
+ accept.value = 0
+ reject.value = 0
try:
Miner.m_connect(id, pool)
while True:
@@ -1177,13 +1181,11 @@ def mine(id: int, user_settings: list,
break
break
except Exception as e:
- print(traceback.format_exc())
pretty_print(get_string("error_while_mining")
+ " " + str(e), "error", "net" + str(id))
sleep(5)
break
except Exception as e:
- print(traceback.format_exc())
pretty_print(get_string("error_while_mining")
+ " " + str(e), "error", "net" + str(id))
diff --git a/README.md b/README.md
index 66e48640..491e0dee 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,8 @@
+
+
@@ -213,6 +215,7 @@ All tests were performed using the DUCO-S1 algorithm **without fasthash accelera
* [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz
* [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02
* [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - a Duino-Coin iOS widget by Naphob
+ * [Duino Lookup](https://axorax.github.io/duino-lookup/) by axorax
You may also view a similar list on the [website](https://duinocoin.com/apps).
diff --git a/Resources/AVR_Miner_langs.json b/Resources/AVR_Miner_langs.json
index 705c93c0..e2b045d1 100644
--- a/Resources/AVR_Miner_langs.json
+++ b/Resources/AVR_Miner_langs.json
@@ -1268,7 +1268,7 @@
"mining_algorithm": " gebruikte algoritme is DUCO-S1A (",
"mining_avr_connection_error": " Fout tijdens het verbinden met de AVR! Opnieuw proberen in 10s",
"mining_avr_not_responding": " Antwoord duurt langer dan verwacht, er wordt een nieuwe opdracht gestuurd ",
- "internal_server_error": " Interne server fout.",
+ "internal_server_error": " Interne serverfout.",
"retrying": " Opnieuw proberen in 10s",
"mining_user": " Gebruiker ",
"mining_not_exist": " bestaat niet.",
@@ -1387,5 +1387,99 @@
"motd": "本日のサーバーメッセージ: ",
"hashrate_test": "ハッシュレートのテストは以下にて終了 ",
"hashrate_test_diff": "、開始時の難易度を設定: "
+ },
+ "finnish": {
+ "translation_autor": "EeroVakiparta",
+ "sigint_detected": " SIGINT havaittu - Poistutaan siististi.",
+ "goodbye": " Nähdään pian!",
+ "greeting_morning": "Toivotamme sinulle ihanaa aamua",
+ "greeting_noon": "Toivotamme sinulle herkullista keskipäivää",
+ "greeting_afternoon": "Toivotamme sinulle rauhallista iltapäivää",
+ "greeting_evening": "Toivotamme sinulle kotoisaa iltaa",
+ "greeting_back": "Tervetuloa takaisin",
+ "banner": "Virallinen Duino-Coin © AVR Miner",
+ "donation_level": "Kehittäjien lahjoitustaso: ",
+ "avr_on_port": "AVR-piirilevy(t) portissa/porteissa: ",
+ "algorithm": "Algoritmi: ",
+ "rig_identifier": "Rig-tunniste: ",
+ "basic_config_tool": "\nDuino-Coinin perusasetusten työkalu\nMuokkaa ",
+ "edit_config_file_warning": "/Miner_config.cfg-tiedostoa myöhemmin, jos haluat muuttaa sitä.",
+ "dont_have_account": "Eikö sinulla ole vielä Duino-Coin-tiliä? Käytä ",
+ "wallet": "Lompakko",
+ "register_warning": " rekisteröityäksesi palvelimelle.\n",
+ "ask_username": "Syötä Duino-Coin-käyttäjätunnuksesi: ",
+ "ports_message": "Asetustyökalu on löytänyt seuraavat portit:",
+ "ports_notice": "Jos et näe kehitysalustaasi täällä, varmista, että se on kunnolla kytketty ja ohjelmalla on pääsy siihen (ylläpito-/sudo-oikeudet).",
+ "ask_avrport": "Syötä kehitysalustasi sarjaportti (esim. COM1 (Windows) tai /dev/ttyUSB1 (Unix)): ",
+ "ask_anotherport": "Haluatko lisätä toisen kehitysalustan? (y/N): ",
+ "ask_higherdiff": "Haluatko käyttää korkeampaa vaikeustasoa (vain Arduino DUE -boardeille) (y/N): ",
+ "ask_rig_identifier": "Haluatko lisätä tunnisteen (nimen) tälle rigille? (y/N) ",
+ "ask_rig_name": "Syötä haluttu rigin nimi: ",
+ "ask_donation_level": "Aseta kehittäjien lahjoitustaso (0-5) (suositus: 1), tämä ei vähennä tulojasi: ",
+ "config_saved": "Asetukset tallennettu! Käynnistetään louhija",
+ "free_network_warning": " Duino-Coin-verkko on täysin ilmainen palvelu ja tulee aina olemaan",
+ "donate_warning": "\nEmme ota mitään maksuja louhinnastasi.\nVoit todella auttaa meitä ylläpitämään palvelinta ja matalakuluisia vaihtoja lahjoittamalla.\nKäy osoitteessa ",
+ "learn_more_donate": " saadaksesi lisätietoja siitä, miten voit auttaa :)",
+ "starting_donation": "Aloitetaan lahjoitusprosessi",
+ "thanks_donation": " Kiitos, että olet mahtava lahjoittaja ❤️ \nLahjoituksesi auttaa meitä ylläpitämään palvelinta ja mahdollistamaan jatkokehityksen",
+ "data_error": " Virhe noudettaessa tietoja GitHubista! Yritetään uudelleen 10 sekunnin kuluttua.",
+ "connected": " Yhdistetty",
+ "connected_server": " yhdistetty pää-Duino-Coin-palvelimeen (v",
+ "outdated_miner": " Louhija on vanhentunut (v",
+ "server_is_on_version": " palvelin on versiossa v",
+ "update_warning": ", lataa uusin versio osoitteesta https://github.com/revoxhere/duino-coin/releases/",
+ "connecting_error": " Virhe yhteyden muodostamisessa palvelimeen. Yritetään uudelleen 10s päästä",
+ "duco_avr_miner": "Duino-Coin AVR Miner (v",
+ "accepted_shares": " hyväksytyt osakkeet",
+ "accepted": " Hyväksytty ",
+ "block_found": " Lohko löydetty ",
+ "rejected": " Hylätty ",
+ "error_while_mining": " Virhe louhinnassa - todennäköisesti yhteysvirhe - käynnistetään uudelleen 5s päästä.",
+ "board_on_port": " AVR lauta portissa ",
+ "board_is_connected": " on yhdistetty",
+ "board_connection_error": " AVR-yhteysvirhe portissa ",
+ "board_connection_error2": ", tarkista, onko se kytketty vai ei",
+ "mining_start": " AVR-louhintasäie käynnistyy",
+ "mining_algorithm": " käyttäen DUCO-S1A -algoritmia (",
+ "mining_avr_connection_error": " Virhe yhdistettäessä AVR:ään! Yritetään uudelleen 10s päästä",
+ "mining_avr_not_responding": " Arduino kestää odotettua kauemmin, lähetetään sille uusi työ ",
+ "internal_server_error": " Sisäinen palvelinvirhe.",
+ "retrying": " Yritetään uudelleen 10s päästä",
+ "mining_user": " Käyttäjä ",
+ "mining_not_exist": " ei ole olemassa.",
+ "mining_not_exist_warning": " Varmista, että olet syöttänyt käyttäjätunnuksen oikein. Tarkista asetustiedostosi. Yritetään uudelleen 10s päästä",
+ "load_config_error": " Virhe ladattaessa asetustiedostoa (",
+ "load_config_error_warning": "/Miner_config.cfg). Kokeile poistaa se ja suorittaa konfiguraatio uudelleen. Poistutaan 10s päästä",
+ "connection_search": "Etsitään nopeinta nodea, johon yhdistää",
+ "uptime_seconds": " sekuntia",
+ "uptime_minute": " minuutti",
+ "uptime_minutes": " minuuttia",
+ "uptime_hour": " tunti",
+ "uptime_hours": " tuntia",
+ "periodic_mining_report": "Periodinen louhintaraportti: ",
+ "report_period": "\n\t\t‖ Viimeisten ",
+ "report_time": " sekunnin aikana",
+ "report_body1": "\n\t\t‖ Olet louhinut ",
+ "report_body2": " osaketta (",
+ "report_body3": " osaketta/s)",
+ "report_body4": "\n\t\t‖ Hashrate: ",
+ "report_body5": "\n\t\t‖ Tänä aikana olet ratkaissut ",
+ "report_body6": " hasheja",
+ "report_body7": "\n\t\t‖ Löydetyt lohkot: ",
+ "total_mining_time": "\n\t\t‖ Louhijan kokonaiskäyttöaika: ",
+ "node_picker_unavailable": "Nodevalitsija ei näytä vastaavan kunnolla - yritetään uudelleen ",
+ "node_picker_error": "Vakava virhe haettaessa palvelinta nodenvalitsijasta - yritetään uudelleen ",
+ "connecting_node": " Haettu louhintanode: ",
+ "new_version": "Uusi versio on saatavilla, haluatko päivittää louhijan [Y/n] ? ",
+ "updating": "Louhija on vanhentunut. Päivitetään....",
+ "ask_mining_key": "Anna louhintatunnus (vain tarvittaessa, jos olet aktivoinut tämän vaihtoehdon verkkolompakossa - paina Enter ohittaaksesi): ",
+ "mining_key_required": "Louhintatunnus vaaditaan tälle tilille louhimiseen",
+ "invalid_mining_key": "Annettu louhintatunnus on virheellinen!",
+ "incorrect_username": "Annettu käyttäjätunnus ei ole olemassa!",
+ "system_threads_notice": "Varoitus: yrität käyttää enemmän säikeitä kuin sinulla on.\n\t\tTämä aiheuttaa ei-toivottuja sivuvaikutuksia, kuten järjestelmän vastaamattomuutta.\n\t\tAloitetaan 10s päästä",
+ "using_config": "Käytetään konfiguraatiotiedostoa: ",
+ "motd": "Palvelimen päivän viesti: ",
+ "hashrate_test": "Hashrate-testi päättyi ",
+ "hashrate_test_diff": ", määritetty aloitusvaikeustaso: "
}
}
diff --git a/Resources/CLI_Wallet_langs.json b/Resources/CLI_Wallet_langs.json
index 03acb2fc..27820c39 100644
--- a/Resources/CLI_Wallet_langs.json
+++ b/Resources/CLI_Wallet_langs.json
@@ -898,5 +898,95 @@
"donate_3": " (wrapperのアドレス)",
"donate_4": " (revox, DUCO 主任開発者)",
"donate_5": " (wDUCO開発者)"
+ },
+ "finnish": {
+ "translation_autor": "EeroVakiparta",
+ "cant_connect_to_server": "Ei voida muodostaa yhteyttä palvelimeen. Se on luultavasti huollossa tai tilapäisesti poissa käytöstä.\nYritetään uudelleen 15 sekunnin kuluttua.",
+ "cant_recieve_pool_ip_and_port": " Poolin osoitetta ja IP-osoitetta ei voi vastaanottaa.\nPoistutaan 15 sekunnin kuluttua.",
+ "server_message": "Palvelimen viesti: ",
+ "success": "Onnistui!",
+ "cancelled": "Peruutettu...",
+ "duco_commands": " DUCO komennot:",
+ "wrapper_commands": " Wrapperiin liittyvät komennot:",
+ "base64_not_installed": "Base64:ää ei ole asennettu. Asenna manuaalisesti \"base64\"\nPoistutaan 15 sekunnissa.",
+ "tronpy_not_installed": "Tronpya ei ole asennettu. Asenna se käyttämällä: python3 -m pip install tronpy.\nWrapperi on poistettu käytöstä, koska tronpya ei ole asennettu.",
+ "tronpy_not_installed_2": "Tronpya ei ole asennettu. Asenna se käyttämällä: python3 -m pip install tronpy.",
+ "cryptography_not_installed": "Cryptographyä ei ole asennettu. Asenna se käyttämällä: python3 -m pip install cryptography.\nPoistutaan 15 sekunnissa.",
+ "secrets_not_installed": "Secrets ei ole asennettu. Asenna se käyttämällä: python3 -m pip install secrets.\nPoistutaan 15 sekunnissa.",
+ "websocket_not_installed": "Websocket-client ei ole asennettu. Asenna se käyttämällä: python3 -m pip install websocket-client.\nPoistutaan 15s päästä.",
+ "colorama_not_installed": "Colorama ei ole asennettu. Asenna se käyttämällä: python3 -m pip install colorama.\nPoistutaan 15s päästä.",
+ "first_run": "Duino-Coin CLI Wallet ensimmäinen käynnistys\n",
+ "select_option": "Valitse vaihtoehto",
+ "choice_input": " 1 - Kirjaudu sisään\n 2 - Rekisteröidy\n 3 - Poistu\n",
+ "choice_input_wrapper": "1 - Luo uusi avain\n2 - Tuo avain \n3 - Peruuta\n",
+ "value_not_numeric": "Virhe, arvon tulee olla numeerinen",
+ "enter_username": "Syötä käyttäjätunnuksesi: ",
+ "enter_email": "Syötä sähköpostiosoitteesi: ",
+ "enter_password": "Syötä salasanasi (ei näytetä yksityisyyden vuoksi): ",
+ "confirm_password": "CVahvista salasanasi (ei näytetä yksityisyyden vuoksi): ",
+ "enter_current_password": "Syötä nykyinen salasanasi: ",
+ "enter_new_password": "Syötä uusi salasana: ",
+ "agree_requirments": "Rekisteröimällä uuden tilin hyväksyt käyttöehdot ja tietosuojakäytännön, jotka ovat saatavilla osoitteessa ",
+ "register_success": "Uuden tilin rekisteröinti onnistu",
+ "register_failed": "Uuden käyttäjän rekisteröinti epäonnistui, syy: ",
+ "login_success": "Onnistunut kirjautuminen",
+ "login_failed": "Kirjautuminen epäonnistui, syy: ",
+ "decrypt_private_key": "Lauseke yksityisen avaimen salauksen purkamiseen: ",
+ "encrypt_private_key": "Syötä salauslauseke yksityisen avaimen salaamiseen: ",
+ "invalid_passphrase_wrapper": "Virheellinen salauslauseke, wrapper poistetaan käytöstä tämän istunnon ajan",
+ "input_private_key": "Syötä oma yksityinen avaimesi: ",
+ "incorrect_key": "Annettu avain on virheellinen",
+ "incorrect_value": "Annettu arvo on virheellinen",
+ "cli_wallet_text": "\nDuino-Coin CLI-lompakko",
+ "you_have": "Sinulla on ",
+ "which_is_about": "Mikä on noin ",
+ "duco_price": "DUCO hinta: ",
+ "pending_unwraps": "Odottavat unwrapit ",
+ "tron_address": "Tron-osoite vastaanottoa varten: ",
+ "trx_balance": "TRX-saldo (hyödyllinen kuluissa): ",
+ "how_encrypt_private_key": "Miten haluat salata yksityisen avaimen asetustiedostossa?",
+ "encryption_choice": "1 - salaa se käyttämällä DUCO-salasanaa\n2 - käytä omaa salauslauseketta (turvallisempi)",
+ "amount_to_wrap": "Syötä wräpättävä määrä (vähintään 10): ",
+ "no_amount_numeric": "EI, määrän pitää olla numeerinen... keskeytetään",
+ "enter_tron_address_or_local": "Syötä tron-osoite tai jätä tyhjäksi valitaksesi paikallisen lompakon: ",
+ "error_min_10_duco": "Virhe, vähimmäismäärä on 10 DUCO:a",
+ "error_unsufficient_balance": "Virhe, riittämätön saldo",
+ "error_wrong_passphrase": "Wrapper poistettu käytöstä, syötit väärän salauslausekkeen",
+ "error_configure_wrapperconf": "Wrapper poistettu käytöstä, määritä se käyttämällä wrapperconf",
+ "error_not_enough_energy_or_trx": "Epäonnistui, sinulla pitäisi olla tarpeeksi energiaa tai trx:ää",
+ "enter_amount_unwrap": "Syötä määrä, jonka haluat wräpätä auki: ",
+ "initiating_unwrap": "Aloitetaan wrapin avaaminen...\nTXid:",
+ "error_initiating_unwrap": "Wrapperin avaamisen aloittamisessa tapahtui virhe, keskeytetään",
+ "amount_over_pending_values": "Määrä on odottavia arvoja suurempi, käytetään odottavia arvoja säästääksemme siirtokuluja",
+ "transaction_send_txid": "Siirto lähetetty, txid:",
+ "finished_unwrapping": "Unwräppäys valmis",
+ "confirm_export_private_key": "Kirjoita YES vahvistaaksesi yksityisen avaimen viennin: ",
+ "private_key": "Yksityinen avain: ",
+ "cancelled_invalid_confirmation": "Peruutettu, virheellinen vahvistus",
+ "help_list_command": "Kirjoita help nähdäksesi saatavilla olevat komennot",
+ "duco_console": "DUCO-konsoli ᕲ ",
+ "enter_recipients_name": "Syötä vastaanottajan käyttäjätunnus: ",
+ "enter_amount_transfer": "Syötä siirrettävä määrä: ",
+ "enter_tron_recipients_name": "Syötä vastaanottajan TRON-osoite: ",
+ "enter_tron_amount_transfer": "Syötä siirrettävä määrä: ",
+ "amount_numeric": "Määrän pitäisi olla numeerinen... keskeytetään",
+ "tron_transaction_submitted": "Siirto lähetetty TRON-verkkoon\nTXID:",
+ "tron_successful_transaction": "Onnistunut siirto",
+ "tron_error_transaction": "Virhe siirron vahvistamisessa",
+ "see_you_soon": " Nähdään pian!",
+ "sigint_detected": "\nSIGINT havaittu - Poistutaan hienovaraisesti.",
+ "about_1": "Duino-Coin CLI-lompakko on tehty <3 Duino-Coin-yhteisön toimesta",
+ "about_2": "Tämä on versio ",
+ "about_3": "Ja se on jaettu MIT-lisenssin alaisuudessa",
+ "about_4": "Palvelimen versio: ",
+ "about_5": "Palvelin on versiossa ",
+ "about_6": ", mutta clientti on versiossa ",
+ "about_7": ", sinun kannattaa harkita viimeisimmän julkaisun lataamista",
+ "about_8": "Client on ajan tasalla",
+ "donate_1": "Voit halutessasi lahjoittaa auttaaksesi DUCO:n ja wDUCO:n ylläpidossa (wrapping/unwrapping aiheuttaa ylläpitäjille kuluja)",
+ "donate_2": "TRON ja tokenit: ",
+ "donate_3": " (wrapperi osoite)",
+ "donate_4": " (revox, DUCO:n pääkehittäjä)",
+ "donate_5": " (wDUCO-kehittäjä)"
}
}
diff --git a/Resources/PC_Miner_langs.json b/Resources/PC_Miner_langs.json
index d2f3220a..0a38525a 100644
--- a/Resources/PC_Miner_langs.json
+++ b/Resources/PC_Miner_langs.json
@@ -718,39 +718,39 @@
"invalid_mining_key": "La llave de minado ingresada no es válida!"
},
"french": {
- "translation_autor": "Bilaboz",
+ "translation_autor": "Bilaboz, TheFrenchTechMan",
"translation": "Traduction française: ",
"sigint_detected": " SIGINT détecté - Fermeture...",
- "goodbye": " A bientôt!",
- "greeting_morning": "J'espère que vous passez une bonne matinée!",
- "greeting_noon": "J'espère que vous passez un bon après-midi",
- "greeting_afternoon": "J'espère que vous passez un bon après-midi",
- "greeting_evening": "Passez une bonne soirée!",
- "greeting_back": "Content de te revoir",
+ "goodbye": " A bientôt !",
+ "greeting_morning": "J'espère que vous passez une bonne matinée !",
+ "greeting_noon": "J'espère que vous passez un bon après-midi !",
+ "greeting_afternoon": "J'espère que vous passez un bon après-midi !",
+ "greeting_evening": "Passez une bonne soirée !",
+ "greeting_back": "Content de vous revoir !",
"banner": "Mineur Officiel (Python) Duino-Coin ©",
- "donation_level": "Niveau de donation pour le développeur: ",
- "ask_difficulty": "Veuillez sélectionner la difficulté de minage que vous souhaitez utiliser (1-3): ",
- "low_diff": "Faible difficulté (pour les ordinateurs Raspberry Pis ou plus anciens)",
+ "donation_level": "Niveau de donation pour le développeur : ",
+ "ask_difficulty": "Veuillez sélectionner la difficulté de minage que vous souhaitez utiliser (1-3) : ",
+ "low_diff": "Difficulté faible (pour les ordinateurs Raspberry Pis ou plus anciens)",
"medium_diff": "Difficulté moyenne (pour les ordinateurs normaux)",
"net_diff": "Difficulté du réseau (pour les ordinateurs puissants)",
- "low_diff_short": "Low Difficulty",
+ "low_diff_short": "Difficulté faible",
"medium_diff_short": "Difficulté moyenne",
- "net_diff_short": "Difficulté en réseau",
- "algorithm": "Algorithme: ",
- "rig_identifier": "Nom du mineur/rig: ",
+ "net_diff_short": "Difficulté du réseau",
+ "algorithm": "Algorithme : ",
+ "rig_identifier": "Nom du mineur/rig : ",
"basic_config_tool": "\nEditeur de configuration Duino-Coin\nEditez ",
"edit_config_file_warning": "le fichier /Miner_config.cfg si vous voulez changer votre configuration ultérieurement.",
- "dont_have_account": "Vous n'avez pas encore de compte Duino-Coin? Utilisez ",
- "wallet": "Porte-feuille",
+ "dont_have_account": "Vous n'avez pas encore de compte Duino-Coin ? Utilisez ",
+ "wallet": "Portefeuille",
"register_warning": " pour en créer un.\n",
- "ask_username": "Entrez votre nom d'utilisateur Duino-Coin: ",
- "ask_intensity": "Choisissez l'intensité de minage (1-100)% (recommandé: 95): ",
+ "ask_username": "Entrez votre nom d'utilisateur Duino-Coin : ",
+ "ask_intensity": "Choisissez l'intensité de minage (1-100)% (recommandé: 95) : ",
"ask_threads": "Choisissez le nombre de threads (recommandé pour votre système: ",
- "ask_lower_difficulty": "Voulez vous utiliser une difficulté de minage plus basse (pour les systèmes les plus lents)? (y/N): ",
- "ask_rig_identifier": "Voulez vous ajouter un indentifieur (un nom) à ce mineur/rig? (y/N): ",
- "ask_rig_name": "Entrez le nom du mineur/rig désiré: ",
- "ask_donation_level": "Choisissez le niveau de donation (0-5) (recommandé: 1), cela ne réduira pas vos gains: ",
- "config_saved": "Configuration sauvegardée! Lancement du mineur",
+ "ask_lower_difficulty": "Voulez vous utiliser une difficulté de minage plus basse (pour les systèmes les plus lents) ? (y/N) : ",
+ "ask_rig_identifier": "Voulez vous ajouter un indentifieur (un nom) à ce mineur/rig? (y/N) : ",
+ "ask_rig_name": "Entrez le nom du mineur/rig désiré : ",
+ "ask_donation_level": "Choisissez le niveau de donation (0-5) (recommandé : 1), cela ne réduira pas vos gains : ",
+ "config_saved": "Configuration sauvegardée ! Lancement du mineur",
"load_config_error": " Erreur durant le chargement du fichier de configuration (",
"load_config_error_warning": "/Miner_config.cfg). Essayez de le supprimer et relancez le mineur. Exiting in 10s",
"free_network_warning": " Le réseau Duino-Coin est un service complètement gratuit et le sera toujours",
@@ -758,7 +758,7 @@
"learn_more_donate": " pour en apprendre d'avantage sur comment vous pouvez nous aider :)",
"starting_donation": "Démarrage du service de donation",
"thanks_donation": " Merci d'être un super donateur ❤️ \nVotre don nous aidera a maintenir le serveur et permettra un développement ultérieur",
- "data_error": " Erreur lors de la récupération des données depuis GitHub! Nouvel essai dans 10s.",
+ "data_error": " Erreur lors de la récupération des données depuis GitHub ! Nouvel essai dans 10s.",
"connected": " Connecté",
"connected_server": " au serveur principal Duino-Coin (v",
"outdated_miner": " Mineur obsolète (v",
@@ -788,7 +788,7 @@
"uptime_minutes": " minutes",
"uptime_hour": " heure",
"uptime_hours": " heures",
- "periodic_mining_report": "Rapport de minage périodique: ",
+ "periodic_mining_report": "Rapport de minage périodique : ",
"report_period": "\n\t\t‖ Durant les dernières ",
"report_time": " secondes",
"report_body1": "\n\t\t‖ Vous avez miné ",
@@ -797,18 +797,18 @@
"report_body4": "\n\t\t‖ Avec un hashrate de ",
"report_body5": "\n\t\t‖ Dans cette période, vous avez résolu ",
"report_body6": " hashes",
- "report_body7": "\n\t\t‖ Blocs trouvés: ",
- "total_mining_time": "\n\t\t‖ Uptime total du mineur: ",
+ "report_body7": "\n\t\t‖ Blocs trouvés : ",
+ "total_mining_time": "\n\t\t‖ Uptime total du mineur : ",
"fasthash_available": "Utilisation des accélérations de hachage fasthash",
"fasthash_download": "Téléchargement du module d'accélération fasthash",
- "node_picker_unavailable": "Node picker doesn't seem to be responding properly - retrying in ",
- "node_picker_error": "Erreur fatale lors de la récupération du serveur à partir du sélecteur de node picker - nouvel essai dans ",
- "connecting_node": " Mining node récupéré: ",
- "new_version": "Une nouvelle version est disponnible, voulez vous faire la mise à jour [Y/n] ? ",
- "updating": "Le mineur est obsolète. Mise a jour....",
- "ask_mining_key": "Entrez votre clé de minage (mining key) - (Cela est seulement nécessaire si vous avez activé cette option dans le webwallet): ",
+ "node_picker_unavailable": "La sélecteur de node ne semble pas répondre corrctement - nouvel essai dans ",
+ "node_picker_error": "Erreur fatale lors de la récupération du serveur à partir du sélecteur de node - nouvel essai dans ",
+ "connecting_node": " Node de minage récupéré : ",
+ "new_version": "Une nouvelle version est disponible, voulez vous faire la mise à jour [Y/n] ? ",
+ "updating": "Le mineur est obsolète. Mise a jour...",
+ "ask_mining_key": "Entrez votre clé de minage (mining key) - (Cela est seulement nécessaire si vous avez activé cette option dans le webwallet) : ",
"mining_key_required": "Une clé de minage (mining key) est nécessaire pour miner sur ce compte",
- "invalid_mining_key": "La clé de minage fournie est invalide!"
+ "invalid_mining_key": "La clé de minage fournie est invalide !"
},
"russian": {
"translation_autor": "5Q",
@@ -1624,11 +1624,11 @@
"node_picker_unavailable": "Výběrčí uzlů nejspíš nepracuje správně - zkusím to znovu za ",
"node_picker_error": "Fatální chyba při vybírání uzlů - zkusím to znovu za ",
"connecting_node": " Získaný těžební uzel: ",
- "new_version": "A new version is available, you want to update miner [Y/n] ? ",
- "updating": "The miner is outdated. Updating....",
- "ask_mining_key": "Enter your mining key (only required if you activated this option in the webwallet - press enter to skip): ",
- "mining_key_required": "Mining key is required to mine on this account",
- "invalid_mining_key": "The mining key you provided is invalid!"
+ "new_version": "Je dostupná nová verze. Chceš aktualizovat těžební program [Y/n] ? ",
+ "updating": "Těžební program je zastaralý. Aktualizuji....",
+ "ask_mining_key": "Zadej svůj těžební klíč (požadováno v případech, kdy tato možnost byla nastavena ve webové peněžence - stiskni enter pro přeskočení): ",
+ "mining_key_required": "Těžební klíč je nutný pro těžbu na tomto účtu",
+ "invalid_mining_key": "Zadaný těžební klíč je neplatný!"
},
"japanese": {
"translation_autor": "Ikko Ashimine",
@@ -1734,5 +1734,110 @@
"system_threads_notice": "警告:あなたは持っている以上のスレッドを使用しようとしています。\n\t\tこれは、システムが応答しなくなるなど、予期せぬ副作用を引き起こすことになります。\n\t\t10秒後に開始します",
"using_config": "設定ファイル: ",
"motd": "本日のサーバーメッセージ: "
+ },
+ "finnish": {
+ "translation_autor": "EeroVakiparta",
+ "translation": "Suomenkielinen käännös: ",
+ "sigint_detected": " SIGINT havaittu - Poistutaan hienovaraisesti.",
+ "goodbye": " Nähdään pian!",
+ "greeting_morning": "Ihanaa aamua",
+ "greeting_noon": "Menny töihin",
+ "greeting_afternoon": "Rauhallista iltapäivää",
+ "greeting_evening": "Kotoisaa iltaa",
+ "greeting_back": "Tervetuloa takaisin",
+ "banner": "Virallinen Duino-Coin © Python Miner",
+ "donation_level": "Kehittäjän lahjoitustaso: ",
+ "ask_algorithm": "Valitse käytettävä louhintamenetelmä (1-2): ",
+ "ask_difficulty": "Valitse käytettävä louhintavaikeus (1-3): ",
+ "low_diff": "Matala vaikeus (heikommille Raspberry Pi -laitteille (Zero/1/2/3) ja vanhemmille tietokoneille)",
+ "medium_diff": "Keskitaso vaikeus (tehokkaammille Raspberry Pi -laitteille (4/400) ja tyypillisille tietokoneille)",
+ "net_diff": "Verkon vaikeus (tehokkaille tietokoneille)",
+ "low_diff_short": "Matala vaikeus",
+ "medium_diff_short": "Keskitaso vaikeus",
+ "net_diff_short": "Verkon vaikeus",
+ "algorithm": "Algoritmi: ",
+ "rig_identifier": "Rig-tunniste: ",
+ "basic_config_tool": "\nDuino-Coin perusasetustyökalu\nMuokkaa ",
+ "edit_config_file_warning": "/Miner_config.cfg -tiedostoa myöhemmin, jos haluat muuttaa asetuksia.",
+ "dont_have_account": "Eikö sinulla ole vielä Duino-Coin-tiliä? Käytä ",
+ "wallet": "Lompakko",
+ "register_warning": " rekisteröityäksesi palvelimelle.\n",
+ "ask_username": "Syötä Duino-Coin-käyttäjätunnuksesi: ",
+ "ask_intensity": "Aseta louhintaintensiteetti (1-100)% (suositus: 95): ",
+ "ask_threads": "Aseta louhintasäikeiden määrä (suositus järjestelmällesi: ",
+ "ask_lower_difficulty": "Haluatko käyttää alhaisempaa vaikeustasoa louhintaan (hitaimmille järjestelmille)? (y/N): ",
+ "ask_rig_identifier": "Haluatko lisätä tunnisteen (nimen) tälle rigille? (y/N): ",
+ "ask_rig_name": "Syötä haluttu rigin nimi: ",
+ "ask_donation_level": "Aseta kehittäjän lahjoitustaso (0-5) (suositus: 1), tämä ei vähennä ansioitasi: ",
+ "config_saved": "Asetukset tallennettu! Käynnistetään louhintaa",
+ "load_config_error": " Virhe ladattaessa asetustiedostoa (",
+ "load_config_error_warning": "/Miner_config.cfg). Yritä poistaa se ja suorita määritys uudelleen. Poistutaan 10 sekunnin kuluttua",
+ "free_network_warning": " Duino-Coin-verkko on täysin ilmainen palvelu ja tulee aina olemaan",
+ "donate_warning": "\nEmme ota mitään maksuja louhinnastasi.\nVoit todella auttaa meitä ylläpitämään palvelinta ja pienmaksullisia vaihtoja lahjoittamalla.\nVieraile ",
+ "learn_more_donate": " saadaksesi lisätietoja siitä, miten voit auttaa :)",
+ "starting_donation": "Aloitetaan lahjoitusprosessi",
+ "thanks_donation": " Kiitos, että olet mahtava lahjoittaja ❤️ \nLahjoituksesi auttaa meitä ylläpitämään palvelinta ja mahdollistaa jatkokehityksen",
+ "data_error": " Virhe noutaessa tietoja GitHubista! Yritetään uudelleen 10 sekunnin kuluttua.",
+ "connected": " Yhdistetty",
+ "connected_server": " päämestari Duino-Coin -palvelimeen (v",
+ "outdated_miner": " Louhija on vanhentunut (v",
+ "server_is_on_version": " palvelin on versiossa v",
+ "update_warning": ", lataa uusin versio osoitteesta https://github.com/revoxhere/duino-coin/releases/",
+ "connecting_error": " Virhe yhdistäessä palvelimeen. Yritetään uudelleen 10 sekunnin kuluttua",
+ "mining_thread": " Louhintasäie #",
+ "mining_thread_starting": " käynnistyy",
+ "using_algo": " käyttäen DUCO-S1 -algoritmia tehokkuudella ",
+ "using_algo_xxh": " käyttäen XXHASH-algoritmia tehokkuudella ",
+ "efficiency": "tehokkuus",
+ "duco_python_miner": "Virallinen Duino-Coin Python Miner (v",
+ "accepted_shares": " hyväksytyt osuudet",
+ "accepted": " Hyväksytty ",
+ "block_found": " Lohko löydetty ",
+ "internal_server_error": " Sisäinen palvelinvirhe.",
+ "retrying": " Yritetään uudelleen 10 sekunnin kuluttua",
+ "rejected": " Hylätty ",
+ "error_while_mining": " Virhe louhinnassa - todennäköisesti yhteysvirhe - käynnistetään uudelleen 5 sekunnin kuluttua.",
+ "mining_user": " Käyttäjä ",
+ "mining_not_exist": " ei ole olemassa.",
+ "mining_not_exist_warning": " Varmista, että olet syöttänyt käyttäjätunnuksen oikein. Tarkista konfiguraatiotiedosto. Yritetään uudelleen 10 sekunnin kuluttua",
+ "max_threads_notice": "Duino-Coinin louhinta monilla säikeillä aiheuttaa tuoton vähenemisen - louhintasäikeet pienennetty 16:een",
+ "max_hashrate_notice": "Duino-Coinin louhinta tehokkaalla laitteistolla ei välttämättä ole erittäin kannattavaa sinulle - ehdotamme kokeilemaan Coin Magi (https://xmg.network) - 'sisar' kolikko",
+ "recommended": "suositeltava",
+ "connection_search": "Etsitään nopeinta nodea, johon yhdistää",
+ "uptime_seconds": " sekuntia",
+ "uptime_minute": " minuutti",
+ "uptime_minutes": " minuuttia",
+ "uptime_hour": " tunti",
+ "uptime_hours": " tuntia",
+ "periodic_mining_report": "Säännöllinen louhintaraportti: ",
+ "report_period": "\n\t\t‖ Viimeisen ",
+ "report_time": " sekunnin aikana",
+ "report_body1": "\n\t\t‖ Olet louhinut ",
+ "report_body2": " osaketta (",
+ "report_body3": " osaketta/s)",
+ "report_body4": "\n\t\t‖ Teholla ",
+ "report_body5": "\n\t\t‖ Tänä aikana olet ratkaissut ",
+ "report_body6": " hajautusta",
+ "report_body7": "\n\t\t‖ Löydetyt lohkot: ",
+ "total_mining_time": "\n\t\t‖ Kaiken kaikkiaan louhijan toiminta-aika: ",
+ "fasthash_available": "Käytetään fasthash-hajautusnopeuksia",
+ "fasthash_download": "Ladataan fasthash-kiihdytysmoduuli",
+ "node_picker_unavailable": "Nodenn valitsin ei näytä vastaavan oikein - yritetään uudelleen ",
+ "node_picker_error": "Vakava virhe noudettaessa palvelinta noden valitsimesta - yritetään uudelleen ",
+ "connecting_node": " Haettu louhintanode: ",
+ "new_version": "Uusi versio on saatavilla, haluatko päivittää louhijan (Y/n) ? ",
+ "updating": "Louhija on vanhentunut. Päivitetään....",
+ "ask_mining_key": "Syötä louhintatunnuksesi (vain tarpeen, jos aktivoit tämän vaihtoehdon web-lompakossa - paina enter ohittaaksesi): ",
+ "mining_key_required": "Louhintatunnus vaaditaan tälle tilille louhimiseen",
+ "invalid_mining_key": "Antamasi louhintatunnus on virheellinen!",
+ "running_on_rpi": "Louhija näyttää toimivan Raspberry Pi:llä.",
+ "running_on_rpi2": "Sisäiset tila-LEDit syttyvät louhintaprosessin tilan mukaisesti",
+ "discord_launch_error": "Virhe käynnistettäessä Discord RPC-säiettä:",
+ "discord_update_error": "Virhe päivitettäessä Discord RPC-tilastoja:",
+ "key_retry": "Haluatko yrittää uudelleen? (Y/n): ",
+ "incorrect_username": "Antamasi käyttäjänimi ei ole olemassa!",
+ "system_threads_notice": "Varoitus: yrität käyttää enemmän säikeitä kuin sinulla on.\n\t\tTämä aiheuttaa ei-toivottuja sivuvaikutuksia, kuten järjestelmän vastaamattomuuden.\n\t\tAloitetaan 10s kuluttua",
+ "using_config": "Käyttöasetustiedosto: ",
+ "motd": "Palvelimen päivän viesti: "
}
}
diff --git a/Resources/README_TRANSLATIONS/README-fr-FR.md b/Resources/README_TRANSLATIONS/README-fr-FR.md
index 3145c8d7..092bd177 100644
--- a/Resources/README_TRANSLATIONS/README-fr-FR.md
+++ b/Resources/README_TRANSLATIONS/README-fr-FR.md
@@ -38,6 +38,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_cz_CZ.md b/Resources/README_TRANSLATIONS/README_cz_CZ.md
index c2da2dd9..97387201 100644
--- a/Resources/README_TRANSLATIONS/README_cz_CZ.md
+++ b/Resources/README_TRANSLATIONS/README_cz_CZ.md
@@ -41,6 +41,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_de_DE.md b/Resources/README_TRANSLATIONS/README_de_DE.md
index 06b107cb..e02f14f1 100644
--- a/Resources/README_TRANSLATIONS/README_de_DE.md
+++ b/Resources/README_TRANSLATIONS/README_de_DE.md
@@ -44,6 +44,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_es_LATAM.md b/Resources/README_TRANSLATIONS/README_es_LATAM.md
index d3a43d97..dd11bcc8 100644
--- a/Resources/README_TRANSLATIONS/README_es_LATAM.md
+++ b/Resources/README_TRANSLATIONS/README_es_LATAM.md
@@ -45,6 +45,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_fi_FI.md b/Resources/README_TRANSLATIONS/README_fi_FI.md
new file mode 100644
index 00000000..1f8569b3
--- /dev/null
+++ b/Resources/README_TRANSLATIONS/README_fi_FI.md
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Duino-Coin on kolikko, jota voi louhia Arduinolla, ESP8266/32-korteilla, Raspberry Pi:llä, tietokoneilla ja monella muulla laitteella (mukaan lukien Wi-Fi-reitittimet, älytelevisiot, älypuhelimet, älykellot, SBC:t, MCUs tai jopa GPU:t).
+
+
+
+| Avainominaisuudet | Tekniset tiedot | Tuetut piirikortit (muutamia esimerkkejä) |
+|-|-|-|
+| 💻 Tukee laajaa valikoimaa alustoja
👥 Nopeasti kasvava yhteisö
💱 Helppo käyttää ja vaihtaa
(DUCO-pörssissä, JustSwap, SushiSwap)
🌎 Saatavilla kaikkialla
:new: Täysin alkuperäinen ja avoimen lähdekoodin projekti
🌳 Aloittelijaystävällinen ja ympäristöystävällinen
💰 Kustannustehokas ja helppo louhia | ⚒️ Algoritmi: DUCO-S1
♐ Palkkiot: tuettu "Kolka-järjestelmällä"
jonka avulla voidaan palkita louhijoita oikeudenmukaisesti
⚡ Siirtoaika: Heti
🪙 Kolikkovaranto: Rajaton
(poltto tapahtuu)
🔤 Tunnus: DUCO (ᕲ)
🔢 Desimaalit: jopa 20 | ♾️ Arduino (Uno, Nano, Mega, Due, Pro Mini, jne.)
📶 ESP8266 (NodeMCU, Wemos, jne.)
📶 ESP32 (ESP-WROOM, ESP32-CAM, jne.)
🍓 Raspberry Pi (1, 2, Zero (W/WH), 3, 4, Pico, 400)
🍊 Orange Pi (Zero, Zero 2, PC, Plus, jne.)
⚡ Teensy 4.1 -kortit |
+
+
+## Aloittaminen
+
+#### Helpoin tapa aloittaa Duino-Coinin kanssa on ladata [viimeisin julkaisu](https://github.com/revoxhere/duino-coin/releases/latest) käyttöjärjestelmällesi.
+Latauksen jälkeen pura paketti ja käynnistä haluamasi ohjelma.
+Mitään riippuvuuksia ei tarvita.
+
+Jos tarvitset apua, voit tutustua virallisiin aloitusoppaisiin, jotka löytyvät viralliselta verkkosivustolta.
+UKK ja vianmääritysohjeita löytyy [Wikistä](https://github.com/revoxhere/duino-coin/wiki).
+
+
+#### Linux (manuaalinen asennus)
+
+```BASH
+sudo apt update
+sudo apt install python3 python3-pip git python3-pil python3-pil.imagetk -y # Asenna vaaditut riippuvuudet
+git clone https://github.com/revoxhere/duino-coin # Kloonaa Duino-Coin repositorio
+cd duino-coin
+python3 -m pip install -r requirements.txt # Asenna pip-riippuvuudet
+```
+
+Tämän jälkeen voit käynnistää ohjelman kirjoittamalla (esim. `python3 PC_Miner.py`).
+
+#### Windows (manuaalinen asennus)
+
+1. Lataa ja asenna [Python 3](https://www.python.org/downloads/) (varmista, että lisäät Pythonin ja Pipin PATH:iin)
+2. Lataa [the Duino-Coin repo](https://github.com/revoxhere/duino-coin/archive/master.zip)
+3. Pura ladattu zip-tiedosto ja avaa kansio komentokehotteessa
+4. Komentokehotteessa kirjoita `py -m pip install -r requirements.txt` asentaaksesi tarvittavat pip-riippuvuudet
+
+When you have completed the installation, you can launch the software by either double-clicking on the desired .py file or typing py PC_Miner.py in the command prompt.
+
+#### Raspberry Pi (automaattinen asennus)
+
+```BASH
+wget https://raw.githubusercontent.com/revoxhere/duino-coin/master/Tools/duco-install-rpi.sh
+sudo chmod a+x duco-install-rpi.sh
+./duco-install-rpi.sh
+```
+
+## DUCO, wDUCO, bscDUCO, maticDUCO & celoDUCO
+
+Duino-Coin on hybridivaluutta, joka tarjoaa tuen sekä keskitetyille että hajautetuille tavoille tallentaa varoja. Duino-Coinit voidaan muuntaa wDUCO: ksi, bscDUCO: ksi tai muiksi vastaaviksi Duino-Coiniksi, jotka ovat tallennettu (kääritty) muihin verkkoihin tokeneina. Esimerkkiohjeet wDUCO:n käyttämisestä ovat saatavilla [wDUCO wiki](https://github.com/revoxhere/duino-coin/wiki/wDUCO-tutorial). Kolikot voidaan kääriä suoraan verkkolompakostasi - napsauta Wrap Coins -painiketta aloittaaksesi.
+
+## Kehitys
+
+Panostasi-tekijöistä tekee avoimen lähdekoodiyhteisöstä niin uskomattoman hienon paikan oppia, inspiroitua ja luoda.
+Kaikki panostuksesi Duino-Coin-projektiin ovat erittäin arvostettuja.
+
+Kuinka voit auttaa?
+
+* Forkkaa projektin repositorio
+* Luo uusi haarautumishaara (feature branch)
+* Tee muutokset
+* Varmista, että kaikki toimii tarkoitetulla tavalla
+* Luo uusi vedä-pyyntö (pull request)
+
+Palvelimen lähdekoodi, API-kutsujen dokumentaatio sekä viralliset kirjastot oman sovelluksen kehittämiseen Duino-Coinille ovat saatavilla [useful tools](https://github.com/revoxhere/duino-coin/tree/useful-tools) -haarassa.
+
+
+## Testatut laitteet ja kehysalustat
+
+### Huomaa, että palkkiot riippuvat monista tekijöistä ja alla oleva taulukko on vain suuntaa antava.
+
+ | Laite/CPU/SBC/MCU/piiri | Keskimääräinen hashrate
(kaikki säikeet) | Louhinta
säikeet | Virran
-kulutus | Keskimääräinen
DUCO/päivä |
+ |-----------------------------------------------------------|-----------------------------------|-------------------|----------------|---------------------|
+ | Arduino Pro Mini, Uno, Nano jne.
(Atmega 328p/pb/16u2) | 258 H/s | 1 | 0.2 W | 15-20 |
+ | Raspberry Pi Pico | 5 kH/s | 1 | 0.3 W | 10 |
+ | Teensy 4.1 (pehmeä salaus) | 80 kH/s | 1 | 0.5 W | ? |
+ | NodeMCU, Wemos D1 jne.
(ESP8266) | 9-10 kH/s (160MHz) 5 kH/s (80Mhz) | 1 | 0.6 W | 3-6 |
+ | ESP32 | 40-42 kH/s | 2 | 1 W | 6-9 |
+ | Raspberry Pi Zero | 18 kH/s | 1 | 1.1 W | ? |
+ | Raspberry Pi 3 **(32bit)** | 440 kH/s | 4 | 5.1 W | 4-5 |
+ | Raspberry Pi 4 **(32bit)** | 740 kH/s | 4 | 6.4 W | ? |
+ | Raspberry Pi 4 **(64bit, fasthash)** | 6.8 MH/s | 4 | 6.4 W | 5 |
+ | ODROID XU4 | 1.0 MH/s | 8 | 5 W | 6 |
+ | Atomic Pi | 690 kH/s | 4 | 6 W | ? |
+ | Orange Pi Zero 2 | 740 kH/s | 4 | 2.55 W | ? |
+ | Khadas Vim 2 Pro | 1.12 MH/s | 8 | 6.2 W | ? |
+ | Libre Computers Tritium H5CC | 480 kH/s | 4 | 5 W | ? |
+ | Libre Computers Le Potato | 410 kH/s | 4 | 5 W | ? |
+ | Pine64 ROCK64 | 640 kH/s | 4 | 5 W | ? |
+ | Intel Celeron G1840 | 1.25 MH/s | 2 | 53 W | 3.3 |
+ | Intel Core i5-2430M | 1.18 MH/s | 4 | 35 W | 6.5 |
+ | Intel Core i5-3230M | 1.52 MH/s | 4 | 35 W | 7.2 |
+ | Intel Core i5-5350U | 1.35 MH/s | 4 | 15 W | 6.0 |
+ | Intel Core i5-7200U | 1.62 MH/s | 4 | 15 W | 7.5 |
+ | Intel Core i5-8300H | 3.67 MH/s | 8 | 45 W | 9.1 |
+ | Intel Core i3-4130 | 1.45 MH/s | 4 | 54 W | 3.7 |
+ | AMD Ryzen 5 2600 | 4.9 MH/s | 12 | 65 W | 15.44 |
+ | AMD Ryzen R1505G **(fasthash)** | 8.5 MH/s | 4 | 35 W | - |
+ | Intel Core i7-11370H **(fasthash)** | 17.3 MH/s | 8 | 35 W | 4.28 |
+ | Realtek RTD1295 | 490 kH/s | 4 | - | - |
+ | Realtek RTD1295 **(fasthash)** | 3.89 MH/s | 4 | - | - |
+
+Kaikki testit suoritettiin käyttäen DUCO-S1-algoritmia **ilman fasthash-kiihdytyksiä**, ellei toisin mainita. Tämä taulukko päivitetään aktiivisesti.
+
+
+
+## Yhteisön tekemät ohjelmistot
+
+### Huomioithan, että nämä ohjelmistot eivät ole kehittämiämme, emmekä anna mitään takuita siitä, ettei niiden käyttö johda tilin sulkemiseen. Käytä niitä omalla vastuullasi.
+
+ ### Muut tiedossa olevat Duino-Coinin kaivostyökalut:
+ * :point_right: [**RP2040-HAT-MINING-C**](https://github.com/Wiznet/RP2040-HAT-MINING-C) - **WIZnet RP2040** mining stack
+ * [DuinoCoinEthernetMiner](https://github.com/Pumafron/DuinoCoinEthernetMiner) - Arduino Ethernet shield Miner by Pumafron
+ * [STM8 DUCO Miner](https://github.com/BBS215/STM8_DUCO_miner) - STM8S firmware for mining DUCO by BBS215
+ * [DuinoCoinbyLabVIEW](https://github.com/ericddm/DuinoCoinbyLabVIEW) - miner for LabVIEW family by ericddm
+ * [Duino-JS](https://github.com/Hoiboy19/Duino-JS) - a JavaScript miner which you can easily implement in your site by Hoiboy19
+ * [Duinotize](https://github.com/mobilegmYT/Duinotize) - Duino website monetizer by mobilegmYT
+ * [hauchel's duco-related stuff repository](https://github.com/hauchel/duco/) - Collection of various codes for mining DUCO on other microcontrollers
+ * [duino-coin-php-miner](https://github.com/ricardofiorani/duino-coin-php-miner) Dockerized Miner in PHP by ricardofiorani
+ * [duino-coin-kodi](https://github.com/SandUhrGucker/duino-coin-kodi) - Mining addon for Kodi Media Center by SandUhrGucker
+ * [MineCryptoOnWifiRouter](https://github.com/BastelPichi/MineCryptoOnWifiRouter) - Python script to mine Duino-Coin on routers by BastelPichi
+ * [Duino-Coin_Android_Cluster Miner](https://github.com/DoctorEenot/DuinoCoin_android_cluster) - mine with less connections on multiple devices by DoctorEenot
+ * [ESPython DUCO Miner](https://github.com/fabiopolancoe/ESPython-DUCO-Miner) - MicroPython miner for ESP boards by fabiopolancoe
+ * [DUCO Miner for Nintendo 3DS](https://github.com/BunkerInnovations/duco-3ds) - Python miner for Nintendo 3DS by PhereloHD & HGEpro
+ * [Dockerized DUCO Miner](https://github.com/Alicia426/Dockerized_DUCO_Miner_minimal) - Miner in Docker by Alicia426
+ * [NodeJS-DuinoCoin-Miner](https://github.com/LDarki/NodeJS-DuinoCoin-Miner/) - simple NodeJS miner by LDarki
+ * [d-cpuminer](https://github.com/phantom32-0/d-cpuminer) - pure C miner by phantom32 & revoxhere
+ * [Go Miner](https://github.com/yippiez/go-miner) by yippiez
+ * [ducominer](https://github.com/its5Q/ducominer) by its5Q
+ * [Unofficial miners directory](https://github.com/revoxhere/duino-coin/tree/master/Unofficial%20miners)
+ * [Julia Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Julia_Miner.jl) by revoxhere
+ * [Ruby Miner](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Ruby_Miner.rb) by revoxhere
+ * [Minimal Python Miner (DUCO-S1)](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Minimal_PC_Miner.py) by revoxhere
+ * [Teensy 4.1 code for Arduino IDE](https://github.com/revoxhere/duino-coin/blob/master/Unofficial%20miners/Teensy_code/Teensy_code.ino) by joaquinbvw
+
+ ### Muut työkalut:
+ * [Duino Miner](https://github.com/g7ltt/Duino-Miner) - Arduino Nano based DUCO miner files and documentation by g7ltt
+ * [DUINO Mining Rig](https://repalmakershop.com/pages/duino-mining-rig) - 3D files, PCB designs and instructions for creating your own Duino rig by ReP_AL
+ * [DuinoCoin-balance-Home-Assistant](https://github.com/NL647/DuinoCoin-balance-Home-Assistant) - addon for home assistant displaying your balance by NL647
+ * [ducopanel](https://github.com/ponsato/ducopanel) - a GUI app for controling your Duino-Coin miners by ponsato
+ * [Duino AVR Monitor](https://www.microsoft.com/store/apps/9NJ7HPFSR9V5) - GUI Windows App for monitoring AVR devices mining DUCO by niknak
+ * [Duino-Coin Arduino library](https://github.com/ricaun/arduino-DuinoCoin) by ricaun
+ * [DuinoCoinI2C](https://github.com/ricaun/DuinoCoinI2C) - Use ESP8266/ESP32 as a master for Arduinos by ricaun
+ * [Duino-Coin Mining Dashboard](https://lulaschkas.github.io/duco-mining-dashboard/) and troubleshooting helper by Lulaschkas
+ * [duco-miners](https://github.com/dansinclair25/duco-miners) CLI mining dashboard made by dansinclair25
+ * [Duco-Coin Symbol Icon ttf](https://github.com/SandUhrGucker/Duco-Coin-Symbol-Icon-ttf-.h) by SandUhrGucker
+ * [DUCO Monitor](https://siunus.github.io/duco-monitor/) account statistics website by siunus
+ * [Duino Stats](https://github.com/Bilaboz/duino-stats) official Discord bot by Bilaboz
+ * [DuCoWallet](https://github.com/viktor02/DuCoWallet) GUI Wallet by viktor02
+ * [Duco-widget-ios](https://github.com/naphob/duco-widget-ios) - a Duino-Coin iOS widget by Naphob
+ * [Duino Lookup](https://axorax.github.io/duino-lookup/) by axorax
+
+ Voit tarkastella vastaavaa listaa myös Duino-Coinin virallisilla verkkosivuilla. [website](https://duinocoin.com/apps).
+
+
+## License
+
+Duino-Coin on pääosin jaettu MIT-lisenssillä. Lisätietoja saat tiedostosta `LICENSE`.
+Joissakin kolmannen osapuolen tiedostoissa saattaa olla erilaiset lisenssit - tarkista niiden `LICENSE` -lausekkeet (yleensä lähdekooditiedoston alusta).
+
+
+## Käyttöehdot
+1. Duino-Coinit ("DUCO:t") ansaitaan louhimalla prosessilla, jota kutsutaan kaivamiseksi.
+2. Louhinta tapahtuu käyttämällä DUCO-S1-algoritmia (kuten selitetty Duino-Coinin Whitepaperissa), jossa oikean vastauksen löytäminen matemaattiseen ongelmaan antaa louhijalle palkkion.
+3. Louhinta voidaan suorittaa virallisesti käyttäen CPU:ita, AVR-kortteja (esim. Arduino-kortteja), yksikorttitietokoneita (esim. Raspberry Pi -kortteja) ja ESP32/8266-kortteja virallisten kaivostyöläisten käyttämisen avulla (muut virallisesti sallitut kaivostyöläiset on kuvattu README:n yläosassa).
+4. Kaikkien kaivostyöläisten on käytettävä heille sopivaa vaikeustasoa.
+5. Louhinta GPU:illa, FPGA:illa ja muilla korkean suorituskyvyn laitteilla on sallittua, mutta käyttämällä vain EXTREME-louhintavaikeutta.
+6. Mitkä tahansa käyttäjät, jotka käyttävät kaivostyöläisiä, joille ei ole sopiva vaikeustaso (katso vaikeuslista), rajoitetaan automaattisesti siirtymällä oikealle vaikeustasolle.
+7. Mitkä tahansa käyttäjät, jotka yrittävät käyttää liian alhaista vaikeustasoa kuin heille sopii, saattavat saada tilapäisen eston tai pysyvän porttikiellon.
+8. Porttikiellon yhteydessä käyttäjä estetään pääsemästä käsiksi kolikoihinsa ja hänen tilinsä poistetaan.
+9. Vaihtoon kelpaavat vain laillisesti ansaitut kolikot.
+10. Tilejä voidaan väliaikaisesti keskeyttää tutkimaan ToS-rikkomuksia ("rikkomus" tai "väärinkäyttö").
+11. Vaihtopyynnön tekeminen viralliselle DUCO-vaihdolle ("virallinen vaihto") voi viivästyä ja/tai hylätä tutkimusten aikana.
+12. Viralliselle vaihdolle tehtyjä vaihtopyyntöjä voidaan hylätä ToS-rikkomusten ja/tai vähäisen rahoituksen vuoksi.
+13. Ilmaisilla pilvipalveluilla (tai ilmaisilla VPS-palveluilla, kuten Repl.it, GitHub Actions jne.) louhkiminen ei ole sallittua, koska se on epäreilua muille.
+14. Käyttäjän DUCOja voidaan polttaa, jos rikkomus voidaan todistaa.
+15. Nämä käyttöehdot voivat muuttua milloin tahansa ilman ennakkoilmoitusta.
+16. Useampien käyttäjätilien omistaminen ilman järkevää syytä (esim. mon louhiminen) ei ole sallittua - useita tilejä käytettäessä samalla tietokoneella/verkolla, ellei niille ole myönnetty poikkeusta, tullaan estämään.
+17. Muiden palveluiden tai tuotteiden mainostaminen lähettämällä tapahtumia ei ole sallittua.
+18. Suuri määrä tapahtumia lyhyessä ajassa voi aktivoida Kolka-järjestelmän, joka rajoittaa ja/tai estää käyttäjän.
+19. Yhteisön tekemien ohjelmien on noudatettava sääntöjä (käyttöehdot, vaikeustasot jne.) - järjestelmän väärinkäyttö johtaa ohjelmiston ja/tai käyttäjän estämiseen.
+20. Tilit, joiden nimi tai käyttö on harhaanjohtavaa (henkilöllisyyden varastaminen, tekaistut bottitilit jne.), eivät ole sallittuja..
+21. Loukkaavan tai epäolennaisen todentamiskuvan ja/tai kuvauksen lähettäminen johtaa tilin välittömään estämiseen.
+22. Jokaisen Duino-Coin-käyttäjän on noudatettava edellä mainittuja sääntöjä. Epäasianmukainen käyttäytyminen johtaa tilin estämiseen.
+
+
+## Tietosuojakäytäntö
+1. Pääpalvelimella tallennetaan käyttäjien käyttäjänimet, tiivistetyt salasanat (bcrypt-menetelmällä), tilin luomispäivämäärät, viimeiset kirjautumisajat ja sähköpostiosoitteet.
+2. Sähköpostiosoitteet eivät ole julkisesti saatavilla ja niitä käytetään vain käyttäjän kanssa tarvittaessa kommunikointiin, vahvistamaan vaihtoja DUCO-Exchange -sivustolla ja vastaanottamaan satunnaisia uutiskirjeitä (suunniteltu tulevaisuutta varten).
+3. Saldot, siirrot ja kaivostoimintaan liittyvät tiedot ovat julkisesti saatavilla JSON APIn kautta.
+4. Tietosuojakäytäntöä voidaan muuttaa tulevaisuudessa, mutta käyttäjät saavat ilmoituksen ennen muutoksia.
+
+
+## Aktiiviset projektin ylläpitäjät
+
+* [@revoxhere](https://github.com/revoxhere/) - robik123.345@gmail.com (Johtava Python-kehittäjä, projektin perustaja)
+* [@Bilaboz](https://github.com/bilaboz/) (Johtava NodeJS-kehittäjä)
+* [@connorhess](https://github.com/connorhess) (Johtava Python-kehittäjä, Node-S:n omistaja)
+* [@JoyBed](https://github.com/JoyBed) (Johtava AVR-kehittäjä)
+* [@Yennefer](https://www.instagram.com/vlegle/) (Johtava sosiaalisen median manageri)
+* [@Tech1k](https://github.com/Tech1k/) - kristian@beyondcoin.io (Johtava Webmaster ja DUCO-kehittäjä)
+* [@ygboucherk](https://github.com/ygboucherk) ([wDUCO](https://github.com/ygboucherk/wrapped-duino-coin-v2) kehittäjä)
+* [@Lulaschkas](https://github.com/Lulaschkas) (Kehittäjä)
+* [@joaquinbvw](https://github.com/joaquinbvw) (AVR kehittäjä)
+
+Suuret kiitokset kaikille [contributors](https://github.com/revoxhere/duino-coin/graphs/contributors), jotka ovat auttaneet kehittämään Duino-Coin-projektia.
+
+
+
+Projektin linkki: [https://github.com/revoxhere/duino-coin/](https://github.com/revoxhere/duino-coin/)
+
+Verkkosivuston linkki: [https://duinocoin.com/](https://duinocoin.com/)
+
+Duino-Coin tilan sivu: [https://status.duinocoin.com](https://status.duinocoin.com)
diff --git a/Resources/README_TRANSLATIONS/README_id_ID.md b/Resources/README_TRANSLATIONS/README_id_ID.md
index c9c671a4..85821dcb 100644
--- a/Resources/README_TRANSLATIONS/README_id_ID.md
+++ b/Resources/README_TRANSLATIONS/README_id_ID.md
@@ -32,6 +32,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_in_HI.md b/Resources/README_TRANSLATIONS/README_in_HI.md
index 35c29e3e..d63d3987 100644
--- a/Resources/README_TRANSLATIONS/README_in_HI.md
+++ b/Resources/README_TRANSLATIONS/README_in_HI.md
@@ -43,6 +43,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_it_IT.md b/Resources/README_TRANSLATIONS/README_it_IT.md
index 7544f46f..5bfcae04 100644
--- a/Resources/README_TRANSLATIONS/README_it_IT.md
+++ b/Resources/README_TRANSLATIONS/README_it_IT.md
@@ -39,6 +39,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_ja_JP.md b/Resources/README_TRANSLATIONS/README_ja_JP.md
index d0c7adbe..fb21bbf3 100644
--- a/Resources/README_TRANSLATIONS/README_ja_JP.md
+++ b/Resources/README_TRANSLATIONS/README_ja_JP.md
@@ -45,6 +45,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_kr_KR.md b/Resources/README_TRANSLATIONS/README_kr_KR.md
index 2e7fac84..d6eb2a3f 100644
--- a/Resources/README_TRANSLATIONS/README_kr_KR.md
+++ b/Resources/README_TRANSLATIONS/README_kr_KR.md
@@ -31,6 +31,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_pt_BR.md b/Resources/README_TRANSLATIONS/README_pt_BR.md
index 0c320f7c..6d656ec0 100644
--- a/Resources/README_TRANSLATIONS/README_pt_BR.md
+++ b/Resources/README_TRANSLATIONS/README_pt_BR.md
@@ -27,6 +27,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_ru_RU.md b/Resources/README_TRANSLATIONS/README_ru_RU.md
index 79256448..7e58ea11 100644
--- a/Resources/README_TRANSLATIONS/README_ru_RU.md
+++ b/Resources/README_TRANSLATIONS/README_ru_RU.md
@@ -20,6 +20,9 @@
+
+
+
diff --git a/Resources/README_TRANSLATIONS/README_sk_SK.md b/Resources/README_TRANSLATIONS/README_sk_SK.md
index 27a710e8..9081907f 100644
--- a/Resources/README_TRANSLATIONS/README_sk_SK.md
+++ b/Resources/README_TRANSLATIONS/README_sk_SK.md
@@ -38,6 +38,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_th_TH.md b/Resources/README_TRANSLATIONS/README_th_TH.md
index 28c96837..25a5638c 100644
--- a/Resources/README_TRANSLATIONS/README_th_TH.md
+++ b/Resources/README_TRANSLATIONS/README_th_TH.md
@@ -30,6 +30,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_tr_TR.md b/Resources/README_TRANSLATIONS/README_tr_TR.md
index 7777b7ef..04941a83 100644
--- a/Resources/README_TRANSLATIONS/README_tr_TR.md
+++ b/Resources/README_TRANSLATIONS/README_tr_TR.md
@@ -14,6 +14,8 @@
+
+
diff --git a/Resources/README_TRANSLATIONS/README_zh_CN.md b/Resources/README_TRANSLATIONS/README_zh_CN.md
index c1abe736..4ceabcc6 100644
--- a/Resources/README_TRANSLATIONS/README_zh_CN.md
+++ b/Resources/README_TRANSLATIONS/README_zh_CN.md
@@ -34,6 +34,8 @@
+
+
diff --git a/Resources/Wallet_langs.json b/Resources/Wallet_langs.json
index fe16bfcd..1c827ecd 100644
--- a/Resources/Wallet_langs.json
+++ b/Resources/Wallet_langs.json
@@ -2094,5 +2094,110 @@
"sessionprofit_unavailable2": "最初に見積もり利益を確認する。",
"tray_show": "ウィンドウを表示する",
"tray_exit": "ウィンドウを閉じる"
+ },
+ "finnish": {
+ "translation_author": "EeroVakiparta",
+ "welcome_message": "Tervetuloa\nDuino-Coin\nTkinter GUI Lompakkoon",
+ "warning": "Varoitus",
+ "duino_coin_wallet": "Duino-Coin Lompakko",
+ "uppercase_duino_coin_wallet": "DUINO-COIN LOMPAKKO",
+ "loading_database": "Ladataan tietokantaa...",
+ "please_wait": "Odota hetki...",
+ "please_wait_calculating": "Odota hetki - lasketaan...",
+ "preparing_wallet_window": "Valmistellaan lompakon ikkunaa...",
+ "username": "KÄYTTÄJÄTUNNUS",
+ "passwd": "SALASANA",
+ "keep_me_logged_in": "Pidä minut kirjautuneena",
+ "login": "KIRJAUDU",
+ "register": "REKISTERÖIDY",
+ "login_error": "Kirjautumisvirhe",
+ "fill_the_blanks_warning": "Täytä ensin tyhjät kohdat",
+ "registration_success": "Rekisteröinti onnistui",
+ "registration_success_msg": "Uusi käyttäjä on rekisteröity onnistuneesti. Voit nyt kirjautua sisään",
+ "register_on_network": "Rekisteröidy verkkoon",
+ "register_tos_warning": "Käyttämällä Duino-Coinia hyväksyt noudattavasi käyttöehtoja",
+ "confirm_passwd": "Vahvista salasana",
+ "old_passwd": "VANHA SALASANA",
+ "new_passwd": "UUSI SALASANA",
+ "confirm_new_passwd": "VAHVISTA UUSI SALASANA",
+ "register_error": "Käyttäjän rekisteröintivirhe",
+ "error_passwd_dont_match": "Salasanat eivät täsmää",
+ "same_passwd_error": "Uusi salasana on sama kuin vanha",
+ "loading": "Ladataan",
+ "wallet": "Lompakko",
+ "recipient": "VASTAANOTTAJA",
+ "amount": "MÄÄRÄ",
+ "send_funds": "LÄHETÄ DUCO",
+ "send_funds_warning": "Haluatko varmasti lähettää",
+ "send_funds_to": "kohteeseen",
+ "wrap_duco": "KÄÄRI DUCO",
+ "unwrap_duco": "PURKAUTA DUCO",
+ "estimated_profit": "ARVIOITU TUOTTO",
+ "estimated_profit_miner_warning": "Käynnistä louhintalaitteet ensin nähdäksesi arvioidun tuoton.",
+ "wallet_transactions": "Duino-Coin Lompakko - Tapahtumat",
+ "local_transactions": "PAIKALLISET TAPAHTUMAT",
+ "transaction_list": "TAPAHTUMALUETTELO",
+ "transaction_list_notice": "Klikkaa tapahtumaa nähdäksesi sen selaimessa.",
+ "currency_converter": "VALUUTTAMUUNNIN",
+ "from": "MISTÄ",
+ "to": "MIHIN",
+ "input_amount": "SYÖTÄ MÄÄRÄ",
+ "calculate": "LASKE",
+ "calculate_error": "Virheellinen laskenta",
+ "wallet_calculator": "Duino-Coin Lompakko - Valuuttamuunnin",
+ "result": "TULOS",
+ "statistics": "Tilastot",
+ "statistics_title": "Duino-Coin Lompakko - Tilastot",
+ "your miners": "SINUN LOUHIJAT",
+ "statistics_miner_warning": "Louhijoita ei voitu havaita tililläsi",
+ "richlist": "RIKASLISTA",
+ "network_info": "VERKON TIEDOT",
+ "difficulty": "Vaikeustaso",
+ "mined_blocks": "Louhitut lohkot",
+ "network_hashrate": "Verkon hashrate",
+ "active_miners": "Aktiiviset louhijat",
+ "estimated_price": "arvioitu hinta",
+ "registered_users": "Rekisteröityneet käyttäjät",
+ "mined_duco": "Kaiken aikaa louhittu DUCO",
+ "wrapper_title": "Duino-Coin Lompakko - Kääre",
+ "wrapped_error_tronpy": "Tronpy ei ole asennettu, asenna se käyttämällä komentoa `pip install tronpy`",
+ "wrapper_error": "Kääre ei ole määritetty. Määritä se asetuksissa!",
+ "wrapper_error_title": "Kääre-virhe",
+ "invalid_passphrase": "Virheellinen tunnuslause, poistetaan kääre käytöstä täksi istunnoksi",
+ "wrapper_config_title": "DUCO Kääre-asetukset",
+ "unwrapper_title": "Duino-Coin Lompakko - Kääreen purkaja",
+ "unwrap_amount": "Purkamisen määrä: ",
+ "ask_passphrase": "Tunnuslause (yksityisen avaimen käyttöön):",
+ "ask_private_key": "Yksityinen avain: ",
+ "passphrase": "Tunnuslause: ",
+ "settings": "Asetukset",
+ "uppercase_settings": "ASETUKSET",
+ "settings_title": "Duino-Coin Lompakko - Asetukset",
+ "logout": "KIRJAUDU ULOS",
+ "change_passwd": "VAIHDA SALASANA",
+ "change_passwd_lowercase": "Vaihda salasana",
+ "change_passwd_error": "Virhe salasanan vaihtamisessa",
+ "change_passwd_ok": "Salasana vaihdettu",
+ "configure_wrapper": "MÄÄRITÄ KÄÄRE",
+ "configure_wrapper_lowercase": "Määritä kääre",
+ "clear_transactions": "TYHJENNÄ TAPAHTUMAT",
+ "logged_in_as": "Kirjautunut käyttäjänä",
+ "wallet_version": "Lompakon versio",
+ "minute": "MINUUTTI",
+ "hour": "TUNTI",
+ "day": "PÄIVÄ",
+ "config_dev_warning": "Lisää vaihtoehtoja tulee tulevaisuudessa",
+ "your_miners": "SINUN KAIVUREITA",
+ "session": "ISTUNTO",
+ "wrapper_success": "Onnistunut kääriminen",
+ "wrapper_amount_to_wrap": "Käärittävä määrä",
+ "email": "SÄHKÖPOSTI",
+ "wrapper_error_tronpy": "Virhe Tronpyssa",
+ "translation_author_message": "Lompakko käännetty:",
+ "notification_new_transaction": "Uusi siirto",
+ "sessionprofit_unavailable1": "Käynnistä kaivurit",
+ "sessionprofit_unavailable2": "ensin nähdäksesi arvioidun tuoton.",
+ "tray_show": "Näytä ikkuna",
+ "tray_exit": "Sulje ikkuna"
}
}
diff --git a/Wallet.py b/Wallet.py
index 9530a058..baba00f8 100644
--- a/Wallet.py
+++ b/Wallet.py
@@ -2623,6 +2623,8 @@ def clear_amount_placeholder(self):
lang = "thai"
elif locale.startswith("ko"):
lang = "korean"
+ elif locale.startswith("fi"):
+ lang = "finnish"
else:
lang = "english"
except IndexError: