diff --git a/Cargo.lock b/Cargo.lock
index 8e0ae00..f95c075 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -298,6 +298,32 @@ dependencies = [
"typenum",
]
+[[package]]
+name = "curve25519-dalek"
+version = "4.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "fiat-crypto",
+ "rustc_version",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
[[package]]
name = "digest"
version = "0.10.7"
@@ -354,6 +380,12 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+[[package]]
+name = "fiat-crypto"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
+
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
@@ -1058,6 +1090,7 @@ dependencies = [
"argon2",
"bs58",
"chrono",
+ "curve25519-dalek",
"hex",
"serde",
"serde_json",
@@ -1087,6 +1120,7 @@ dependencies = [
"anyhow",
"base64",
"bs58",
+ "curve25519-dalek",
"dotenvy",
"flume",
"hex",
@@ -1099,6 +1133,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
+ "sha3",
"tempfile",
"tokio",
"tracing",
@@ -1400,6 +1435,15 @@ version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+[[package]]
+name = "rustc_version"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+dependencies = [
+ "semver",
+]
+
[[package]]
name = "rustix"
version = "1.1.4"
diff --git a/Cargo.toml b/Cargo.toml
index d3c2aa4..46e6208 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,6 +21,7 @@ axum = "0.7"
base64 = "0.22"
bs58 = "0.5"
chrono = "0.4"
+curve25519-dalek = "4.1"
dotenvy = "0.15"
flume = "0.11"
hex = "0.4"
diff --git a/crates/pool-common/Cargo.toml b/crates/pool-common/Cargo.toml
index 34e0f47..005f278 100644
--- a/crates/pool-common/Cargo.toml
+++ b/crates/pool-common/Cargo.toml
@@ -8,6 +8,7 @@ anyhow.workspace = true
argon2.workspace = true
bs58.workspace = true
chrono.workspace = true
+curve25519-dalek.workspace = true
hex.workspace = true
serde.workspace = true
serde_json.workspace = true
diff --git a/crates/pool-common/src/protocol.rs b/crates/pool-common/src/protocol.rs
index aff8ff8..ff1c16d 100644
--- a/crates/pool-common/src/protocol.rs
+++ b/crates/pool-common/src/protocol.rs
@@ -1,3 +1,4 @@
+use curve25519_dalek::ristretto::CompressedRistretto;
use serde::{Deserialize, Serialize};
use sha3::{Digest, Sha3_256};
@@ -137,6 +138,7 @@ fn parse_address_network(address: &str) -> Result