Next draft. Features: connectpeer, listchannels, sendpayment, autoreconnect to chan...
[ldk-sample] / src / hex_utils.rs
diff --git a/src/hex_utils.rs b/src/hex_utils.rs
new file mode 100644 (file)
index 0000000..c9c55b9
--- /dev/null
@@ -0,0 +1,42 @@
+use bitcoin::secp256k1::key::PublicKey;
+
+pub fn to_vec(hex: &str) -> Option<Vec<u8>> {
+         let mut out = Vec::with_capacity(hex.len() / 2);
+
+         let mut b = 0;
+         for (idx, c) in hex.as_bytes().iter().enumerate() {
+                   b <<= 4;
+                   match *c {
+                             b'A'..=b'F' => b |= c - b'A' + 10,
+                             b'a'..=b'f' => b |= c - b'a' + 10,
+                             b'0'..=b'9' => b |= c - b'0',
+                             _ => return None,
+                   }
+                   if (idx & 1) == 1 {
+                             out.push(b);
+                             b = 0;
+                   }
+         }
+
+         Some(out)
+}
+
+#[inline]
+pub fn hex_str(value: &[u8]) -> String {
+         let mut res = String::with_capacity(64);
+         for v in value {
+                   res += &format!("{:02x}", v);
+         }
+         res
+}
+
+pub fn to_compressed_pubkey(hex: &str) -> Option<PublicKey> {
+         let data = match to_vec(&hex[0..33*2]) {
+                   Some(bytes) => bytes,
+                   None => return None
+         };
+         match PublicKey::from_slice(&data) {
+                   Ok(pk) => Some(pk),
+                   Err(_) => None,
+         }
+}