├── .gitignore ├── Cargo.toml ├── pushtx-cli ├── demo.gif ├── Cargo.toml ├── README.md └── src │ └── main.rs ├── pushtx ├── seeds │ ├── signet.txt │ ├── testnet.txt │ └── mainnet.txt ├── Cargo.toml ├── src │ ├── p2p │ │ ├── protocol.rs │ │ └── client.rs │ ├── seeds.rs │ ├── handshake.rs │ ├── p2p.rs │ ├── net.rs │ ├── lib.rs │ └── broadcast.rs └── README.md ├── .github └── workflows │ └── rust.yml ├── LICENSE ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | resolver = "2" 3 | members = ["pushtx", "pushtx-cli"] 4 | -------------------------------------------------------------------------------- /pushtx-cli/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alfred-hodler/pushtx/HEAD/pushtx-cli/demo.gif -------------------------------------------------------------------------------- /pushtx/seeds/signet.txt: -------------------------------------------------------------------------------- 1 | 178.128.221.177 2 | v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333 3 | -------------------------------------------------------------------------------- /pushtx/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "pushtx" 3 | version = "0.4.0" 4 | edition = "2021" 5 | authors = ["Alfred Hodler "] 6 | license = "MIT" 7 | repository = "https://github.com/alfred-hodler/pushtx" 8 | description = "Bitcoin Transaction Broadcast Library" 9 | keywords = ["p2p", "peer-to-peer", "networking"] 10 | categories = ["cryptography::cryptocurrencies", "command-line-utilities"] 11 | 12 | [dependencies] 13 | bitcoin = "0.31.1" 14 | crossbeam-channel = "0.5.12" 15 | data-encoding = "2.5.0" 16 | dns-lookup = "2.0.4" 17 | fastrand = "2.0.2" 18 | hex = "0.4.3" 19 | log = "0.4.20" 20 | peerlink = { version = "0.8.0", features = ["socks"] } 21 | sha3 = "0.10.8" 22 | -------------------------------------------------------------------------------- /pushtx-cli/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "pushtx-cli" 3 | version = "0.4.0" 4 | edition = "2021" 5 | authors = ["Alfred Hodler "] 6 | license = "MIT" 7 | repository = "https://github.com/alfred-hodler/pushtx" 8 | description = "Bitcoin Transaction Broadcast Tool" 9 | keywords = ["p2p", "peer-to-peer", "networking"] 10 | categories = ["cryptography::cryptocurrencies", "command-line-utilities"] 11 | 12 | [[bin]] 13 | name = "pushtx" 14 | path = "src/main.rs" 15 | 16 | [dependencies] 17 | anyhow = "1.0.86" 18 | clap = { version = "4.5.4", features = ["derive"] } 19 | env_logger = { version = "0.11.3", default-features = false } 20 | log = "0.4.20" 21 | pushtx = { version = "0.4.0", path = "../pushtx" } 22 | thiserror = "1.0.61" 23 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | - name: Build 18 | run: cargo build --verbose 19 | - name: Run tests 20 | run: RUST_LOG=trace cargo test --all-features --verbose 21 | 22 | format: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v3 26 | - name: Format 27 | run: cargo fmt --all --check 28 | 29 | clippy: 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: actions/checkout@v3 33 | - name: Run Clippy 34 | run: cargo clippy 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Alfred Hodler 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pushtx-cli/README.md: -------------------------------------------------------------------------------- 1 | ## Privacy-focused Bitcoin Transaction Broadcaster 2 | 3 | This is a Rust program that broadcasts Bitcoin transactions **directly into the P2P network** by 4 | connecting to a set of random Bitcoin nodes. This differs from other broadcast tools in that it 5 | does not not interact with any centralized services, such as block explorers. 6 | 7 | The program is entirely self-contained and does not require Bitcoin Core or other dependencies. 8 | 9 | If Tor is running on the same system, connectivity to the P2P network is established through a 10 | newly created circuit. Having Tor Browser running in the background is sufficient. Tor daemon 11 | also works. 12 | 13 | ### Broadcast Process 14 | 15 | 1. Resolve peers through DNS seeds. 16 | 2. Detect if Tor is present. 17 | 3. Connect to 10 random peers, through Tor if possible. 18 | 4. Broadcast the transaction to a single peer. 19 | 5. Wait until the transaction is seen on the network. 20 | 6. Disconnect. 21 | 22 | ### Usage 23 | 24 | Install with Cargo: `cargo install pushtx-cli` 25 | 26 | ![Demo](demo.gif) 27 | 28 | A library is also available (`pushtx`). 29 | 30 | ### Disclaimer 31 | 32 | This project comes with no warranty whatsoever. Please refer to the license for details. 33 | -------------------------------------------------------------------------------- /pushtx/seeds/testnet.txt: -------------------------------------------------------------------------------- 1 | 80.114.119.141 2 | 74.213.175.99 3 | 89.117.19.191 4 | 129.80.4.58 5 | 52.0.54.100 6 | 95.217.41.40 7 | 68.183.181.57 8 | 99.229.106.225 9 | 51.77.42.234 10 | 185.162.249.27 11 | 88.198.11.139 12 | 173.230.136.29 13 | 65.21.33.227 14 | 65.21.15.203 15 | 80.79.4.249 16 | 147.182.251.92 17 | 38.242.151.13 18 | 16.162.87.225 19 | 95.216.21.149 20 | 188.213.90.149 21 | 35.183.31.133 22 | 95.217.44.33 23 | 199.195.250.230 24 | 152.53.18.109 25 | 27.148.206.140 26 | 3.208.10.153 27 | 217.160.200.231 28 | 185.162.249.27 29 | 51.75.147.82 30 | 18.168.119.254 31 | 23.122.52.241 32 | 85.208.69.17 33 | 18.170.107.186 34 | 74.118.143.20 35 | 147.135.254.190 36 | 49.13.134.40 37 | 34.65.45.157 38 | 78.47.119.18 39 | 68.183.181.57 40 | 161.35.182.37 41 | 178.63.87.163 42 | 34.239.184.228 43 | 88.81.139.83 44 | 204.16.241.8 45 | 185.190.24.72 46 | 188.40.164.205 47 | 34.91.255.249 48 | 185.180.220.12 49 | 204.16.241.8 50 | 138.201.51.42 51 | 5.189.162.76 52 | 5.188.119.196 53 | 71.13.92.62 54 | 35.207.3.50 55 | 88.198.91.246 56 | 39.98.193.129 57 | 18.162.45.10 58 | 51.210.208.202 59 | 64.190.113.17 60 | 13.229.104.97 61 | 23.93.101.158 62 | 178.21.118.96 63 | 99.192.223.18 64 | 72.211.1.222 65 | 51.210.220.135 66 | 132.145.213.181 67 | 161.35.211.215 68 | 142.44.138.161 69 | 122.248.200.20 70 | 69.59.18.207 71 | 69.59.18.23 72 | -------------------------------------------------------------------------------- /pushtx/src/p2p/protocol.rs: -------------------------------------------------------------------------------- 1 | use bitcoin::consensus::{encode, Encodable}; 2 | use bitcoin::p2p::message::{NetworkMessage, RawNetworkMessage}; 3 | use peerlink::DecodeError; 4 | 5 | #[derive(Debug)] 6 | pub struct Message(pub RawNetworkMessage); 7 | 8 | impl peerlink::Message for Message { 9 | fn encode(&self, dest: &mut impl std::io::Write) -> usize { 10 | self.0.consensus_encode(dest).unwrap() 11 | } 12 | 13 | fn decode(buffer: &[u8]) -> Result<(Self, usize), peerlink::DecodeError> { 14 | let payload_size = buffer.get(16..20).ok_or(DecodeError::NotEnoughData)?; 15 | 16 | let payload_size = 17 | encode::deserialize::(payload_size).expect("4 bytes -> u32 cannot fail") as usize; 18 | 19 | if 24 + payload_size > bitcoin::p2p::message::MAX_MSG_SIZE { 20 | Err(DecodeError::MalformedMessage) 21 | } else if buffer.len() < 24 + payload_size { 22 | Err(DecodeError::NotEnoughData) 23 | } else { 24 | match encode::deserialize_partial(buffer) { 25 | Ok((msg, consumed)) => Ok((Self(msg), consumed)), 26 | Err(_) => Err(DecodeError::MalformedMessage), 27 | } 28 | } 29 | } 30 | } 31 | 32 | impl From<(bitcoin::Network, NetworkMessage)> for Message { 33 | fn from((network, message): (bitcoin::Network, NetworkMessage)) -> Self { 34 | Self(RawNetworkMessage::new(network.magic(), message)) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pushtx/README.md: -------------------------------------------------------------------------------- 1 | ## Privacy-focused Bitcoin Transaction Broadcaster 2 | 3 | This is a Rust crate that broadcasts Bitcoin transactions **directly into the P2P network** by 4 | connecting to a set of random Bitcoin nodes. This differs from other broadcast tools in that it 5 | does not not interact with any centralized services, such as block explorers. 6 | 7 | The library is entirely self-contained and does not require Bitcoin Core or other dependencies. 8 | 9 | If Tor is running on the same system, connectivity to the P2P network is established through a 10 | newly created circuit. Having Tor Browser running in the background is sufficient. Tor daemon 11 | also works. 12 | 13 | ### Broadcast Process 14 | 15 | 1. Resolve peers through DNS seeds. 16 | 2. Detect if Tor is present. 17 | 3. Connect to 10 random peers, through Tor if possible. 18 | 4. Broadcast the transaction to a single peer. 19 | 5. Wait until the transaction is seen on the network. 20 | 6. Disconnect. 21 | 22 | ### Usage 23 | 24 | ```rust 25 | // this is our hex-encoded transaction that we want to parse and broadcast 26 | let tx = "6afcc7949dd500000....".parse().unwrap(); 27 | 28 | // we start the broadcast process and acquire a receiver to the info events 29 | let receiver = pushtx::broadcast(vec![tx], pushtx::Opts::default()); 30 | 31 | // start reading info events until `Done` is received 32 | loop { 33 | match receiver.recv().unwrap() { 34 | pushtx::Info::Done(Ok(report)) => { 35 | println!("{} transactions broadcast successfully", report.success.len()); 36 | break; 37 | } 38 | pushtx::Info::Done(Err(err)) => { 39 | println!("we failed to broadcast to any peers, reason = {err}"); 40 | break; 41 | } 42 | _ => {} 43 | } 44 | } 45 | ``` 46 | 47 | An executable is also available (`pushtx-cli`). 48 | 49 | ### Disclaimer 50 | 51 | This project comes with no warranty whatsoever. Please refer to the license for details. 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Documentation](https://img.shields.io/docsrs/pushtx)](https://docs.rs/pushtx/latest/pushtx/) 2 | [![Crates.io](https://img.shields.io/crates/v/pushtx.svg)](https://crates.io/crates/pushtx) 3 | [![License](https://img.shields.io/crates/l/pushtx.svg)](https://github.com/alfred-hodler/pushtx/blob/master/LICENSE) 4 | [![Test Status](https://github.com/alfred-hodler/pushtx/actions/workflows/rust.yml/badge.svg?branch=master)](https://github.com/alfred-hodler/pushtx/actions) 5 | 6 | ## Privacy-focused Bitcoin Transaction Broadcaster 7 | 8 | This is a Rust program that broadcasts Bitcoin transactions **directly into the P2P network** by 9 | connecting to a set of random Bitcoin nodes. This differs from other broadcast tools in that it 10 | does not not interact with any centralized services, such as block explorers. 11 | 12 | The program is entirely self-contained and does not require Bitcoin Core or other dependencies. 13 | 14 | If Tor is running on the same system, connectivity to the P2P network is established through a 15 | newly created circuit. Having Tor Browser running in the background is sufficient. Tor daemon 16 | also works. 17 | 18 | ### Broadcast Process 19 | 20 | 1. Resolve peers through DNS seeds. 21 | 2. Detect if Tor is present. 22 | 3. Connect to 10 random peers, through Tor if possible. 23 | 4. Broadcast the transaction to a single peer. 24 | 5. Wait until the transaction is seen on the network. 25 | 6. Disconnect. 26 | 27 | ### Executable 28 | 29 | Install with Cargo: `cargo install pushtx-cli` 30 | 31 | ![Demo](pushtx-cli/demo.gif) 32 | 33 | ### Library 34 | 35 | ```rust 36 | // this is our hex-encoded transaction that we want to parse and broadcast 37 | let tx = "6afcc7949dd500000....".parse().unwrap(); 38 | 39 | // we start the broadcast process and acquire a receiver to the info events 40 | let receiver = pushtx::broadcast(vec![tx], pushtx::Opts::default()); 41 | 42 | // start reading info events until `Done` is received 43 | loop { 44 | match receiver.recv().unwrap() { 45 | pushtx::Info::Done(Ok(report)) => { 46 | println!("{} transactions broadcast successfully", report.success.len()); 47 | break; 48 | } 49 | pushtx::Info::Done(Err(err)) => { 50 | println!("we failed to broadcast to any peers, reason = {err}"); 51 | break; 52 | } 53 | _ => {} 54 | } 55 | } 56 | ``` 57 | 58 | ### Disclaimer 59 | 60 | This project comes with no warranty whatsoever. Please refer to the license for details. 61 | -------------------------------------------------------------------------------- /pushtx/src/seeds.rs: -------------------------------------------------------------------------------- 1 | use std::net::SocketAddr; 2 | 3 | use crate::{net::Service, Network}; 4 | 5 | const FIXED_MAINNET: &str = include_str!("../seeds/mainnet.txt"); 6 | const FIXED_TESTNET: &str = include_str!("../seeds/testnet.txt"); 7 | const FIXED_SIGNET: &str = include_str!("../seeds/signet.txt"); 8 | 9 | const DNS_MAINNET: &[&str] = &[ 10 | "dnsseed.bluematt.me.", 11 | "dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us.", 12 | "seed.bitcoinstats.com.", 13 | "seed.bitcoin.jonasschnelli.ch.", 14 | "seed.btc.petertodd.net.", 15 | "seed.bitcoin.sprovoost.nl.", 16 | "dnsseed.emzy.de.", 17 | "seed.bitcoin.wiz.biz.", 18 | ]; 19 | 20 | const DNS_TESTNET: &[&str] = &[ 21 | "testnet-seed.bluematt.me", 22 | "testnet-seed.bitcoin.jonasschnelli.ch", 23 | "seed.tbtc.petertodd.org", 24 | "seed.testnet.bitcoin.sprovoost.nl", 25 | ]; 26 | 27 | const DNS_SIGNET: &[&str] = &["seed.signet.bitcoin.sprovoost.nl"]; 28 | 29 | /// Returns nodes returned by DNS seeds. 30 | pub fn dns(network: Network) -> Vec { 31 | let (seeds, port): (&[_], _) = match network { 32 | Network::Mainnet => (DNS_MAINNET, 8333), 33 | Network::Testnet => (DNS_TESTNET, 18333), 34 | Network::Regtest => (&[], 18444), 35 | Network::Signet => (DNS_SIGNET, 38333), 36 | }; 37 | 38 | seeds 39 | .iter() 40 | .map(|seed| { 41 | std::thread::spawn(move || { 42 | let mut addrs: Vec = Vec::with_capacity(128); 43 | if let Ok(iter) = dns_lookup::getaddrinfo(Some(seed), None, None) { 44 | for addr in iter.filter_map(Result::ok) { 45 | let socket_addr: SocketAddr = (addr.sockaddr.ip(), port).into(); 46 | addrs.push(socket_addr.into()); 47 | } 48 | } 49 | addrs 50 | }) 51 | }) 52 | .filter_map(|h| h.join().ok()) 53 | .fold(Vec::with_capacity(1024), |mut acc, val| { 54 | acc.extend(val); 55 | acc 56 | }) 57 | } 58 | 59 | /// Returns an iterator over hardcoded seed nodes. 60 | pub fn fixed(network: Network) -> impl Iterator { 61 | match network { 62 | Network::Mainnet => parse_fixed(FIXED_MAINNET), 63 | Network::Testnet => parse_fixed(FIXED_TESTNET), 64 | Network::Regtest => parse_fixed(""), 65 | Network::Signet => parse_fixed(FIXED_SIGNET), 66 | } 67 | } 68 | 69 | /// Parses a string containing seed nodes, one per line, and returns an iterator over it. 70 | fn parse_fixed(s: &'static str) -> impl Iterator { 71 | s.lines().filter_map(|line| { 72 | line.split_whitespace() 73 | .next() 74 | .and_then(|addr| addr.parse().ok()) 75 | }) 76 | } 77 | -------------------------------------------------------------------------------- /pushtx/src/handshake.rs: -------------------------------------------------------------------------------- 1 | use bitcoin::p2p::message::NetworkMessage; 2 | use bitcoin::p2p::message_network::VersionMessage; 3 | 4 | /// Types of updates that an in-progress handshake wants to know about. 5 | #[derive(Debug)] 6 | pub enum Update { 7 | /// The peer sent a `Version` message. 8 | Version(VersionMessage), 9 | /// The peer sent a `Verack` message. 10 | Verack, 11 | /// The peer sent a `SendAddrV2` message (BIP-155). 12 | SendAddrV2, 13 | /// The peer sent a `WtxidRelay` message (BIP-0339). 14 | WtxidRelay, 15 | /// The peer sent another message. 16 | Other, 17 | } 18 | 19 | impl From<&NetworkMessage> for Update { 20 | fn from(value: &NetworkMessage) -> Self { 21 | match value { 22 | NetworkMessage::Version(v) => Self::Version(v.clone()), 23 | NetworkMessage::Verack => Self::Verack, 24 | NetworkMessage::SendAddrV2 => Self::SendAddrV2, 25 | NetworkMessage::WtxidRelay => Self::WtxidRelay, 26 | _ => Self::Other, 27 | } 28 | } 29 | } 30 | 31 | #[derive(Debug)] 32 | pub enum Event<'a> { 33 | Wait, 34 | /// Send a `Verack` message to the peer. 35 | SendVerack, 36 | /// The peer violated the handshake protocol. 37 | Violation, 38 | /// The handshake is done. 39 | Done { 40 | /// The peer's advertised version. 41 | version: &'a VersionMessage, 42 | /// Whether the peer prefers AddrV2 messages. 43 | wants_addr_v2: bool, 44 | /// Wtxid relay 45 | wtxid_relay: bool, 46 | }, 47 | } 48 | 49 | /// Contains the state of a handshake with a peer. 50 | #[derive(Debug, Default)] 51 | pub struct Handshake { 52 | /// The version message maybe received from the peer. 53 | their_version: Option, 54 | /// Whether their verack has been received. 55 | their_verack: bool, 56 | /// Whether the peer prefers AddrV2 messages. 57 | wants_addr_v2: bool, 58 | /// Wtxid relay 59 | wtxid_relay: bool, 60 | } 61 | 62 | impl Handshake { 63 | /// Updates the handshake. 64 | pub fn update(&mut self, update: Update) -> Event { 65 | match (self, update) { 66 | ( 67 | Self { 68 | their_version: their_version @ None, 69 | their_verack: false, 70 | .. 71 | }, 72 | Update::Version(v), 73 | ) => { 74 | *their_version = Some(v); 75 | Event::SendVerack 76 | } 77 | 78 | ( 79 | Self { 80 | their_version: Some(_), 81 | their_verack: false, 82 | wants_addr_v2: wants_addr_v2 @ false, 83 | .. 84 | }, 85 | Update::SendAddrV2, 86 | ) => { 87 | *wants_addr_v2 = true; 88 | Event::Wait 89 | } 90 | 91 | ( 92 | Self { 93 | their_version: Some(_), 94 | their_verack: false, 95 | wtxid_relay: wtxid_relay @ false, 96 | .. 97 | }, 98 | Update::WtxidRelay, 99 | ) => { 100 | *wtxid_relay = true; 101 | Event::Wait 102 | } 103 | 104 | ( 105 | Self { 106 | their_version: Some(v), 107 | their_verack: their_verack @ false, 108 | wants_addr_v2, 109 | wtxid_relay, 110 | }, 111 | Update::Verack, 112 | ) => { 113 | *their_verack = true; 114 | Event::Done { 115 | version: v, 116 | wants_addr_v2: *wants_addr_v2, 117 | wtxid_relay: *wtxid_relay, 118 | } 119 | } 120 | 121 | _ => Event::Violation, 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /pushtx/src/p2p.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | mod protocol; 3 | 4 | use std::io; 5 | use std::net::SocketAddr; 6 | use std::thread::JoinHandle; 7 | 8 | use bitcoin::p2p::message::RawNetworkMessage; 9 | 10 | use crate::net; 11 | 12 | /// Provides common functionality that uniquely identifies a peer. 13 | pub trait Peerlike: 14 | Clone + Copy + Eq + PartialEq + std::fmt::Debug + std::fmt::Display + std::hash::Hash 15 | { 16 | } 17 | 18 | /// Describes a type that queues commands for outbound delivery. 19 | pub trait Outbox { 20 | /// Queues a command to connect to a peer. 21 | fn connect(&self, target: net::Service); 22 | 23 | /// Queues a command to disconnect from a peer. 24 | #[allow(unused)] 25 | fn disconnect(&self, peer: P); 26 | 27 | /// Queues a `Version` message for sending. 28 | fn version(&self, peer: P); 29 | 30 | /// Queues a `VerAck` message for sending. 31 | fn verack(&self, peer: P); 32 | 33 | /// Queues a `Tx` message for sending. 34 | fn tx(&self, peer: P, tx: bitcoin::Transaction); 35 | } 36 | 37 | /// Describes a type capable of receiving p2p events. 38 | pub trait Receiver>> { 39 | fn receiver(&self) -> &crossbeam_channel::Receiver; 40 | } 41 | 42 | /// Describes a type that sends queued commands outbound. 43 | pub trait Sender { 44 | /// Sends all the queued commands to the delivery subsystem. 45 | fn send(&self) -> io::Result<()>; 46 | 47 | /// Shuts down the client. 48 | fn shutdown(self) -> JoinHandle>; 49 | } 50 | 51 | /// Possible p2p network events. 52 | #[derive(Debug)] 53 | pub enum Event { 54 | /// The result of connecting to a remote peer. 55 | ConnectedTo { 56 | /// The remote host that was connected to. 57 | target: net::Service, 58 | /// The result of the connection attempt. 59 | result: io::Result

, 60 | }, 61 | /// Inbound connection received. 62 | ConnectedFrom { 63 | /// The peer associated with the event. 64 | peer: P, 65 | /// The address of the remote peer. 66 | addr: SocketAddr, 67 | /// The address of the local interface that accepted the connection. 68 | interface: SocketAddr, 69 | }, 70 | /// A peer disconnected. 71 | Disconnected { 72 | /// The peer associated with the event. 73 | peer: P, 74 | /// The reason the peer left. 75 | reason: DisconnectReason, 76 | }, 77 | /// A peer produced a message. 78 | Message { 79 | /// The peer associated with the event. 80 | peer: P, 81 | /// The message received from the peer. 82 | message: RawNetworkMessage, 83 | }, 84 | /// No peer exists with the specified id. Sent when an operation was specified using a peer id 85 | /// that is not present. 86 | NoPeer(P), 87 | /// The send buffer associated with the peer is full. It means the peer is probably not 88 | /// reading data from the wire in a timely manner. 89 | SendBufferFull { 90 | /// The peer associated with the event. 91 | peer: P, 92 | /// The message that could not be sent to the peer. 93 | message: RawNetworkMessage, 94 | }, 95 | } 96 | 97 | /// Explains why a client connection was disconnected. 98 | #[derive(Debug)] 99 | pub enum DisconnectReason { 100 | /// The disconnect was requested. 101 | Requested, 102 | /// The peer left. 103 | Left, 104 | /// The peer violated the protocol in some way. 105 | CodecViolation, 106 | /// The write side is stale, i.e. the peer is not reading the data we are sending. 107 | WriteStale, 108 | /// A network related error occurred. 109 | Error, 110 | } 111 | 112 | pub fn client( 113 | socks_proxy: Option, 114 | network: crate::Network, 115 | ua: Option<(String, u64, u64)>, 116 | ) -> impl Sender 117 | + Receiver> 118 | + Outbox { 119 | client::client(socks_proxy, network, ua) 120 | } 121 | -------------------------------------------------------------------------------- /pushtx/src/p2p/client.rs: -------------------------------------------------------------------------------- 1 | use std::cell::RefCell; 2 | use std::net::SocketAddr; 3 | use std::thread::JoinHandle; 4 | 5 | use bitcoin::p2p::message::{NetworkMessage, RawNetworkMessage}; 6 | use bitcoin::p2p::message_network::VersionMessage; 7 | use bitcoin::Network; 8 | use peerlink::PeerId; 9 | 10 | use crate::net; 11 | 12 | use super::protocol; 13 | 14 | pub fn client( 15 | socks_proxy: Option, 16 | network: crate::Network, 17 | ua: Option<(String, u64, u64)>, 18 | ) -> Client { 19 | let config = peerlink::Config { 20 | stream_config: peerlink::StreamConfig { 21 | tx_buf_min_size: 4096, 22 | ..Default::default() 23 | }, 24 | receive_buffer_size: 32 * 1024, 25 | ..Default::default() 26 | }; 27 | 28 | let (handle, join_handle) = match socks_proxy { 29 | Some(proxy) => { 30 | let (reactor, handle) = peerlink::Reactor::with_connector( 31 | config, 32 | peerlink::connector::Socks5Connector { 33 | proxy, 34 | // random proxy credentials to get an isolated Tor circuit 35 | credentials: Some(( 36 | fastrand::u32(..).to_string(), 37 | fastrand::u32(..).to_string(), 38 | )), 39 | }, 40 | ) 41 | .unwrap(); 42 | (handle, reactor.run()) 43 | } 44 | None => { 45 | let (reactor, handle) = peerlink::Reactor::new(config).unwrap(); 46 | (handle, reactor.run()) 47 | } 48 | }; 49 | 50 | let (user_agent, timestamp, start_height) = ua.unwrap_or(("/pynode:0.0.1/".to_string(), 0, 0)); 51 | 52 | Client { 53 | peerlink: handle, 54 | commands: Default::default(), 55 | network: network.into(), 56 | join_handle, 57 | our_version: VersionMessage { 58 | version: 70016, 59 | services: bitcoin::p2p::ServiceFlags::NONE, 60 | timestamp: timestamp as i64, 61 | receiver: bitcoin::p2p::Address { 62 | services: bitcoin::p2p::ServiceFlags::NONE, 63 | address: [0; 8], 64 | port: 0, 65 | }, 66 | sender: bitcoin::p2p::Address { 67 | services: bitcoin::p2p::ServiceFlags::NONE, 68 | address: [0; 8], 69 | port: 0, 70 | }, 71 | nonce: fastrand::u64(..), 72 | user_agent, 73 | start_height: start_height as i32, 74 | relay: true, 75 | }, 76 | } 77 | } 78 | 79 | pub struct Client { 80 | peerlink: peerlink::Handle, 81 | commands: RefCell>>, 82 | network: Network, 83 | join_handle: JoinHandle>, 84 | our_version: VersionMessage, 85 | } 86 | 87 | impl super::Peerlike for PeerId {} 88 | 89 | impl super::Outbox for Client { 90 | fn connect(&self, target: net::Service) { 91 | self.queue(peerlink::Command::Connect(target)); 92 | } 93 | 94 | fn disconnect(&self, peer: PeerId) { 95 | self.queue(peerlink::Command::Disconnect(peer)); 96 | } 97 | 98 | fn version(&self, peer: PeerId) { 99 | self.queue(self.message(peer, NetworkMessage::Version(self.our_version.clone()))); 100 | } 101 | 102 | fn verack(&self, peer: PeerId) { 103 | self.queue(self.message(peer, NetworkMessage::Verack)); 104 | } 105 | 106 | fn tx(&self, peer: PeerId, tx: bitcoin::Transaction) { 107 | self.queue(self.message(peer, NetworkMessage::Tx(tx))) 108 | } 109 | } 110 | 111 | impl super::Sender for Client { 112 | fn send(&self) -> std::io::Result<()> { 113 | self.commands.borrow_mut().drain(..).try_for_each(|cmd| { 114 | log::debug!(">> P2P: {:?}", cmd); 115 | self.peerlink.send(cmd) 116 | }) 117 | } 118 | 119 | fn shutdown(self) -> JoinHandle> { 120 | let _ = self.peerlink.shutdown(); 121 | self.join_handle 122 | } 123 | } 124 | 125 | impl super::Receiver> for Client { 126 | fn receiver( 127 | &self, 128 | ) -> &crossbeam_channel::Receiver> { 129 | self.peerlink.receiver() 130 | } 131 | } 132 | 133 | impl Client { 134 | /// Queues a command for the p2p reactor. 135 | fn queue(&self, cmd: peerlink::Command) { 136 | self.commands.borrow_mut().push(cmd); 137 | } 138 | 139 | /// Constructs a message with the correct magic. 140 | fn message( 141 | &self, 142 | peer_id: PeerId, 143 | message: NetworkMessage, 144 | ) -> peerlink::Command { 145 | peerlink::Command::Message( 146 | peer_id, 147 | protocol::Message(RawNetworkMessage::new(self.network.magic(), message)), 148 | ) 149 | } 150 | } 151 | 152 | impl From> for super::Event { 153 | fn from(value: peerlink::Event) -> Self { 154 | match value { 155 | peerlink::Event::ConnectedTo { target, result } => Self::ConnectedTo { 156 | target, 157 | result: result.map(From::from), 158 | }, 159 | 160 | peerlink::Event::ConnectedFrom { 161 | peer, 162 | addr, 163 | interface, 164 | } => Self::ConnectedFrom { 165 | peer, 166 | addr, 167 | interface, 168 | }, 169 | 170 | peerlink::Event::Disconnected { peer, reason } => Self::Disconnected { 171 | peer, 172 | reason: reason.into(), 173 | }, 174 | 175 | peerlink::Event::Message { peer, message } => Self::Message { 176 | peer, 177 | message: message.0, 178 | }, 179 | 180 | peerlink::Event::NoPeer(peer) => Self::NoPeer(peer), 181 | 182 | peerlink::Event::SendBufferFull { peer, message } => Self::SendBufferFull { 183 | peer, 184 | message: message.0, 185 | }, 186 | } 187 | } 188 | } 189 | 190 | impl From for super::DisconnectReason { 191 | fn from(value: peerlink::reactor::DisconnectReason) -> Self { 192 | match value { 193 | peerlink::reactor::DisconnectReason::Requested => Self::Requested, 194 | peerlink::reactor::DisconnectReason::Left => Self::Left, 195 | peerlink::reactor::DisconnectReason::CodecViolation => Self::CodecViolation, 196 | peerlink::reactor::DisconnectReason::WriteStale => Self::WriteStale, 197 | peerlink::reactor::DisconnectReason::Error(err) => { 198 | log::debug!("peer disconnect: IO error: {}", err); 199 | Self::Error 200 | } 201 | } 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /pushtx/src/net.rs: -------------------------------------------------------------------------------- 1 | //! Network related types (supported networks, addresses etc.) 2 | 3 | use std::{ 4 | net::{Ipv4Addr, Ipv6Addr, SocketAddr}, 5 | str::FromStr, 6 | }; 7 | 8 | /// Supported network. 9 | #[derive(Debug, Clone, Copy)] 10 | #[allow(unused)] 11 | pub enum Network { 12 | /// IPv4. 13 | Ipv4, 14 | /// IPv6. 15 | Ipv6, 16 | /// Onion V3. 17 | TorV3, 18 | } 19 | 20 | /// Address variant. 21 | #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] 22 | pub enum Address { 23 | /// IPv4. 24 | Ipv4(Ipv4Addr), 25 | /// IPv6. 26 | Ipv6(Ipv6Addr), 27 | /// Onion V3. 28 | TorV3([u8; 32]), 29 | } 30 | 31 | impl std::fmt::Display for Address { 32 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 33 | match self { 34 | Address::Ipv4(ip) => write!(f, "{}", ip), 35 | Address::Ipv6(ip) => write!(f, "{}", ip), 36 | Address::TorV3(pk) => write!(f, "{}", tor::v3_pubkey_to_domain(pk)), 37 | } 38 | } 39 | } 40 | 41 | /// The combination of `Address` and port describing a peer/node/service on the network. 42 | #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] 43 | pub struct Service(Address, u16); 44 | 45 | impl Service { 46 | /// Whether the service is on a particular network. 47 | pub fn on_network(&self, network: Network) -> bool { 48 | matches!( 49 | (self.0, network), 50 | (Address::Ipv4(_), Network::Ipv4) 51 | | (Address::Ipv6(_), Network::Ipv6) 52 | | (Address::TorV3(_), Network::TorV3) 53 | ) 54 | } 55 | } 56 | 57 | impl From for Service { 58 | fn from(value: SocketAddr) -> Self { 59 | match value { 60 | SocketAddr::V4(socket) => Self(Address::Ipv4(*socket.ip()), socket.port()), 61 | SocketAddr::V6(socket) => Self(Address::Ipv6(*socket.ip()), socket.port()), 62 | } 63 | } 64 | } 65 | 66 | impl FromStr for Service { 67 | type Err = InvalidConnectTarget; 68 | 69 | fn from_str(s: &str) -> Result { 70 | if let Ok(socket) = s.parse::() { 71 | Ok(socket.into()) 72 | } else { 73 | let (domain, port) = s.trim().rsplit_once(':').ok_or(InvalidConnectTarget)?; 74 | if let Some((pk, port)) = tor::v3_domain_to_pk(domain).zip(port.parse().ok()) { 75 | Ok(Service(Address::TorV3(pk), port)) 76 | } else { 77 | Err(InvalidConnectTarget) 78 | } 79 | } 80 | } 81 | } 82 | 83 | impl peerlink::connector::IntoTarget for Service { 84 | fn target(&self) -> Option { 85 | use peerlink::connector::Target; 86 | let (addr, port) = (self.0, self.1); 87 | match addr { 88 | Address::Ipv4(ip) => Some(Target::Socket((ip, port).into())), 89 | Address::Ipv6(ip) => Some(Target::Socket((ip, port).into())), 90 | Address::TorV3(pk) => Some(Target::Domain(tor::v3_pubkey_to_domain(&pk), port)), 91 | } 92 | } 93 | } 94 | 95 | impl std::fmt::Display for Service { 96 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 97 | write!(f, "{}:{}", self.0, self.1) 98 | } 99 | } 100 | 101 | /// The value cannot be interpreted as a valid connect target. 102 | #[derive(Debug)] 103 | pub struct InvalidConnectTarget; 104 | 105 | /// The network type is not supported by the application. 106 | #[derive(Debug)] 107 | pub struct UnsupportedNetworkError; 108 | 109 | impl TryFrom<&bitcoin::p2p::Address> for Service { 110 | type Error = UnsupportedNetworkError; 111 | 112 | fn try_from(value: &bitcoin::p2p::Address) -> Result { 113 | match value.socket_addr() { 114 | Ok(socket) => Ok(socket.into()), 115 | Err(_) => Err(UnsupportedNetworkError), 116 | } 117 | } 118 | } 119 | 120 | impl TryFrom<&bitcoin::p2p::address::AddrV2Message> for Service { 121 | type Error = UnsupportedNetworkError; 122 | 123 | fn try_from(value: &bitcoin::p2p::address::AddrV2Message) -> Result { 124 | match value.addr { 125 | bitcoin::p2p::address::AddrV2::Ipv4(ip) => Ok(Self(Address::Ipv4(ip), value.port)), 126 | bitcoin::p2p::address::AddrV2::Ipv6(ip) => Ok(Self(Address::Ipv6(ip), value.port)), 127 | bitcoin::p2p::address::AddrV2::TorV3(pk) => Ok(Self(Address::TorV3(pk), value.port)), 128 | _ => Err(UnsupportedNetworkError), 129 | } 130 | } 131 | } 132 | 133 | mod tor { 134 | const V3_VERSION: u8 = 0x03; 135 | const TOR_V3_ADDR_LEN: usize = 62; 136 | const CHECKSUM_CONST: &[u8; 15] = b".onion checksum"; 137 | 138 | /// Converts an Onion V3 public key to an .onion domain. 139 | pub fn v3_pubkey_to_domain(pk: &[u8; 32]) -> String { 140 | let checksum = calc_checksum(pk); 141 | 142 | let mut address = [0_u8; 35]; 143 | address[0..32].copy_from_slice(pk); 144 | address[32..34].copy_from_slice(&checksum[0..2]); 145 | address[34] = V3_VERSION; 146 | 147 | let mut encoded = String::with_capacity(TOR_V3_ADDR_LEN); 148 | data_encoding::BASE32.encode_append(&address, &mut encoded); 149 | encoded.make_ascii_lowercase(); 150 | encoded.push_str(".onion"); 151 | 152 | encoded 153 | } 154 | 155 | /// Tries to convert an Onion V3 domain into a V3 public key. 156 | pub fn v3_domain_to_pk(domain: &str) -> Option<[u8; 32]> { 157 | let (addr, tld) = domain.trim().rsplit_once('.')?; 158 | 159 | if matches!(tld, "onion" | "ONION") { 160 | let mut bytes: [u8; 56] = addr.as_bytes().try_into().ok()?; 161 | bytes.make_ascii_uppercase(); 162 | 163 | let mut decoded = [0_u8; 35]; 164 | data_encoding::BASE32 165 | .decode_mut(&bytes, &mut decoded) 166 | .ok()?; 167 | 168 | let pk = &decoded[0..32]; 169 | let checksum = &decoded[32..34]; 170 | let version = decoded[34]; 171 | 172 | let exp_checksum = &calc_checksum(pk.try_into().unwrap())[0..2]; 173 | 174 | if version == V3_VERSION && exp_checksum == checksum { 175 | Some(pk.try_into().unwrap()) 176 | } else { 177 | None 178 | } 179 | } else { 180 | None 181 | } 182 | } 183 | 184 | /// Calculates an Onion address checksum. 185 | fn calc_checksum(pk: &[u8; 32]) -> [u8; 32] { 186 | use sha3::{Digest, Sha3_256}; 187 | 188 | let mut preimage = [0_u8; 15 + 32 + 1]; 189 | preimage[0..CHECKSUM_CONST.len()].copy_from_slice(CHECKSUM_CONST); 190 | preimage[CHECKSUM_CONST.len()..CHECKSUM_CONST.len() + pk.len()].copy_from_slice(pk); 191 | preimage[CHECKSUM_CONST.len() + pk.len()] = 0x03; 192 | 193 | let digest = Sha3_256::digest(preimage); 194 | 195 | digest.into() 196 | } 197 | 198 | #[test] 199 | fn onion_pubkey_to_domain_roundtrip() { 200 | let domain = "2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion"; 201 | 202 | let pk: &[u8; 32] = &[ 203 | 209, 179, 139, 131, 168, 59, 62, 217, 24, 197, 187, 105, 221, 68, 74, 213, 107, 200, 204 | 213, 131, 90, 145, 77, 231, 52, 71, 71, 78, 95, 2, 89, 27, 205 | ]; 206 | 207 | assert_eq!(v3_pubkey_to_domain(pk), domain); 208 | assert_eq!(v3_domain_to_pk(domain), Some(pk.to_owned())); 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /pushtx-cli/src/main.rs: -------------------------------------------------------------------------------- 1 | use pushtx::*; 2 | 3 | use core::panic; 4 | use std::collections::HashSet; 5 | use std::io::{IsTerminal, Read}; 6 | use std::path::PathBuf; 7 | 8 | use clap::Parser; 9 | 10 | /// Bitcoin P2P Transaction Broadcaster. 11 | /// 12 | /// This program connects directly to the Bitcoin P2P network, 13 | /// selects a number of random peers through DNS and broadcasts 14 | /// one or more transactions. If Tor is running on the same 15 | /// system, by default it will attempt to connect through a 16 | /// fresh Tor circuit. Running the Tor browser in the background 17 | /// is usually sufficient for this to work. 18 | /// 19 | /// More verbose (debug) output can be enabled by specifying the 20 | /// -v or --verbose switch up to three times. 21 | /// 22 | /// Copyright (c) 2024 Alfred Hodler 23 | #[derive(Parser)] 24 | #[command(version, about, long_about, verbatim_doc_comment, name = "pushtx")] 25 | struct Cli { 26 | /// Tor mode. 27 | #[arg(short = 'm', long, default_value_t = TorMode::Try)] 28 | tor_mode: TorMode, 29 | 30 | /// Dry-run mode. Performs the whole process except the sending part. 31 | #[arg(short, long)] 32 | dry_run: bool, 33 | 34 | /// The network to use. 35 | #[arg(short, long, default_value_t = Network::Mainnet)] 36 | network: Network, 37 | 38 | /// Zero or one paths to a file containing line-delimited hex encoded transactions 39 | /// 40 | /// If not present, stdin is used instead (hex only, one tx per line). 41 | #[arg(short = 'f', long = "file", value_name = "FILE")] 42 | txs: Option, 43 | 44 | /// Print debug info (use multiple times for more verbosity; max 3) 45 | #[arg(short, long, action = clap::ArgAction::Count)] 46 | verbose: u8, 47 | } 48 | 49 | fn main() -> anyhow::Result<()> { 50 | let cli = Cli::parse(); 51 | 52 | let log_level = match cli.verbose { 53 | 0 => None, 54 | 1 => Some(log::Level::Info), 55 | 2 => Some(log::Level::Debug), 56 | 3.. => Some(log::Level::Trace), 57 | }; 58 | 59 | if let Some(level) = log_level { 60 | env_logger::Builder::default() 61 | .filter_level(level.to_level_filter()) 62 | .init(); 63 | } 64 | 65 | let txs: Result, Error> = match cli.txs { 66 | Some(path) => { 67 | let mut contents = String::new(); 68 | let mut file = std::fs::File::open(path)?; 69 | file.read_to_string(&mut contents)?; 70 | contents 71 | .lines() 72 | .filter(|line| !line.trim().is_empty()) 73 | .map(|line| pushtx::Transaction::from_hex(line).map_err(Into::into)) 74 | .collect() 75 | } 76 | None => { 77 | let stdin = std::io::stdin(); 78 | if stdin.is_terminal() { 79 | eprintln!("Enter some hex-encoded transactions (one per line, Ctrl + {EOF_CHR} when done) ... "); 80 | } 81 | stdin 82 | .lines() 83 | .filter_map(|line| match line { 84 | Ok(line) if !line.trim().is_empty() => { 85 | Some(pushtx::Transaction::from_hex(line).map_err(Into::into)) 86 | } 87 | Ok(_) => None, 88 | Err(err) => Some(Err(Error::Io(err))), 89 | }) 90 | .collect() 91 | } 92 | }; 93 | 94 | if cli.dry_run { 95 | println!("! ** DRY RUN MODE **"); 96 | } 97 | 98 | let txs = match txs { 99 | Ok(txs) => { 100 | if !txs.is_empty() { 101 | println!("* The following transactions will be broadcast:"); 102 | for tx in &txs { 103 | println!(" - {}", tx.txid()) 104 | } 105 | Ok(txs) 106 | } else { 107 | Err(Error::EmptyTxSet) 108 | } 109 | } 110 | Err(err) => Err(err), 111 | }?; 112 | 113 | let txids: HashSet<_> = txs.iter().map(|tx| tx.txid()).collect(); 114 | 115 | let receiver = broadcast( 116 | txs, 117 | Opts { 118 | use_tor: cli.tor_mode.into(), 119 | network: cli.network.into(), 120 | dry_run: cli.dry_run, 121 | ..Default::default() 122 | }, 123 | ); 124 | 125 | loop { 126 | match receiver.recv() { 127 | Ok(Info::ResolvingPeers) => println!("* Resolving peers from DNS..."), 128 | Ok(Info::ResolvedPeers(n)) => println!("* Resolved {n} peers"), 129 | Ok(Info::ConnectingToNetwork { tor_status }) => { 130 | println!("* Connecting to the P2P network ({})...", cli.network); 131 | match tor_status { 132 | Some(proxy) => println!(" - using Tor proxy found at {proxy}"), 133 | None => println!(" - not using Tor"), 134 | } 135 | } 136 | Ok(Info::Broadcast { peer }) => println!("* Broadcast to peer {}", peer), 137 | Ok(Info::Done(Ok(Report { success, rejects }))) => { 138 | let difference: Vec<_> = txids.difference(&success).collect(); 139 | if difference.is_empty() { 140 | println!("* Done! Broadcast successful"); 141 | break Ok(()); 142 | } else { 143 | println!("* Failed to broadcast one or more transactions"); 144 | for missing in difference { 145 | println!(" - failed: {missing}"); 146 | } 147 | for (r_txid, r_reason) in rejects { 148 | println!(" - reject: {r_txid}: {r_reason}"); 149 | } 150 | break Err(Error::Partial.into()); 151 | } 152 | } 153 | Ok(Info::Done(Err(error))) => { 154 | break Err(Error::Broadcast(error).into()); 155 | } 156 | Err(_) => panic!("worker thread disconnected"), 157 | } 158 | } 159 | } 160 | 161 | #[derive(Debug, thiserror::Error)] 162 | enum Error { 163 | #[error("IO error while reading transaction(s): {0}")] 164 | Io(#[from] std::io::Error), 165 | #[error("Error while parsing transaction(s): {0}")] 166 | Parse(#[from] pushtx::ParseTxError), 167 | #[error("Empty transaction set, did you pass at least one transaction?")] 168 | EmptyTxSet, 169 | #[error("Failed to broadcast: {0}")] 170 | Broadcast(pushtx::Error), 171 | #[error("Failed to broadcast one or more transactions")] 172 | Partial, 173 | } 174 | 175 | /// Determines how to use Tor. 176 | #[derive(Debug, Clone, clap::ValueEnum)] 177 | pub enum TorMode { 178 | /// Use Tor if available. If not available, connect through clearnet. 179 | Try, 180 | /// Do not use Tor even if available and running. 181 | No, 182 | /// Exclusively use Tor. If not available, do not broadcast. 183 | Must, 184 | } 185 | 186 | impl From for pushtx::TorMode { 187 | fn from(value: TorMode) -> Self { 188 | match value { 189 | TorMode::Try => Self::BestEffort, 190 | TorMode::No => Self::No, 191 | TorMode::Must => Self::Must, 192 | } 193 | } 194 | } 195 | 196 | impl std::fmt::Display for TorMode { 197 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 198 | let name = match self { 199 | TorMode::Try => "try", 200 | TorMode::No => "no", 201 | TorMode::Must => "must", 202 | }; 203 | write!(f, "{}", name) 204 | } 205 | } 206 | 207 | /// The Bitcoin network to connect to. 208 | #[derive(Debug, Clone, Copy, clap::ValueEnum)] 209 | pub enum Network { 210 | Mainnet, 211 | Testnet, 212 | Signet, 213 | } 214 | 215 | impl From for pushtx::Network { 216 | fn from(value: Network) -> Self { 217 | match value { 218 | Network::Mainnet => Self::Mainnet, 219 | Network::Testnet => Self::Testnet, 220 | Network::Signet => Self::Signet, 221 | } 222 | } 223 | } 224 | 225 | impl std::fmt::Display for Network { 226 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 227 | let name = match self { 228 | Network::Mainnet => "mainnet", 229 | Network::Testnet => "testnet", 230 | Network::Signet => "signet", 231 | }; 232 | write!(f, "{}", name) 233 | } 234 | } 235 | 236 | const EOF_CHR: char = if cfg!(target_family = "windows") { 237 | 'Z' 238 | } else { 239 | 'D' 240 | }; 241 | -------------------------------------------------------------------------------- /pushtx/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! # Bitcoin Transaction Broadcast Library 2 | //! 3 | //! This is a library that broadcasts Bitcoin transactions directly into the P2P network by 4 | //! connecting to a set of random Bitcoin nodes. This differs from other broadcast tools in that 5 | //! it does not not interact with any centralized services, such as block explorers. 6 | //! 7 | //! If Tor is running on the same system, connectivity to the P2P network is established through a 8 | //! newly created circuit. Having Tor Browser running in the background is sufficient. Tor daemon 9 | //! also works. 10 | //! 11 | //! ## Fine-tuning 12 | //! The broadcast process can be fine-tuned using the `Opts` struct. Please refer to its 13 | //! documentation for details. 14 | //! 15 | //! ## Example 16 | //! 17 | //!```no_run 18 | //! // this is our hex-encoded transaction that we want to parse and broadcast 19 | //! let tx = "6afcc7949dd500000....".parse().unwrap(); 20 | //! 21 | //! // we start the broadcast process and acquire a receiver to the info events 22 | //! let receiver = pushtx::broadcast(vec![tx], pushtx::Opts::default()); 23 | //! 24 | //! // start reading info events until `Done` is received 25 | //! loop { 26 | //! match receiver.recv().unwrap() { 27 | //! pushtx::Info::Done(Ok(report)) => { 28 | //! println!("{} transactions broadcast successfully", report.success.len()); 29 | //! break; 30 | //! } 31 | //! pushtx::Info::Done(Err(err)) => { 32 | //! println!("we failed to broadcast to any peers, reason = {err}"); 33 | //! break; 34 | //! } 35 | //! _ => {} 36 | //! } 37 | //! } 38 | //!``` 39 | 40 | mod broadcast; 41 | mod handshake; 42 | mod net; 43 | mod p2p; 44 | mod seeds; 45 | 46 | use std::{ 47 | collections::{HashMap, HashSet}, 48 | net::SocketAddr, 49 | str::FromStr, 50 | }; 51 | 52 | use bitcoin::consensus::Decodable; 53 | 54 | /// A Bitcoin transaction to be broadcast into the network. 55 | #[derive(Debug, Clone)] 56 | pub struct Transaction(bitcoin::Transaction); 57 | 58 | impl Transaction { 59 | /// Tries to parse a hex-encoded string into `Transaction`. 60 | pub fn from_hex(tx: impl AsRef) -> Result { 61 | tx.as_ref().parse() 62 | } 63 | 64 | /// Tries to convert raw tx bytes into `Transaction`. 65 | pub fn from_bytes(tx: impl AsRef<[u8]>) -> Result { 66 | tx.as_ref().try_into() 67 | } 68 | 69 | /// Returns the txid of this transaction. 70 | pub fn txid(&self) -> Txid { 71 | Txid(self.0.txid()) 72 | } 73 | } 74 | 75 | impl FromStr for Transaction { 76 | type Err = ParseTxError; 77 | 78 | fn from_str(s: &str) -> Result { 79 | let bytes = hex::decode(s).map_err(|_| ParseTxError::NotHex)?; 80 | bytes.as_slice().try_into() 81 | } 82 | } 83 | 84 | impl TryFrom<&[u8]> for Transaction { 85 | type Error = ParseTxError; 86 | 87 | fn try_from(mut value: &[u8]) -> Result { 88 | let tx = bitcoin::Transaction::consensus_decode(&mut value) 89 | .map_err(|_| ParseTxError::InvalidTxBytes)?; 90 | Ok(Self(tx)) 91 | } 92 | } 93 | 94 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] 95 | pub struct Txid(bitcoin::Txid); 96 | 97 | impl std::fmt::Display for Txid { 98 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 99 | write!(f, "{}", self.0) 100 | } 101 | } 102 | 103 | /// Why an input could not be interpereted as a valid transaction. 104 | #[derive(Debug)] 105 | pub enum ParseTxError { 106 | /// The input was not valid hex. 107 | NotHex, 108 | /// The provided bytes did not deserialize to a valid transaction. 109 | InvalidTxBytes, 110 | } 111 | 112 | impl std::error::Error for ParseTxError {} 113 | 114 | impl std::fmt::Display for ParseTxError { 115 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 116 | match self { 117 | ParseTxError::NotHex => write!(f, "Transaction is not valid hex"), 118 | ParseTxError::InvalidTxBytes => write!(f, "Transaction bytes are invalid"), 119 | } 120 | } 121 | } 122 | 123 | /// Determines how to use Tor. The default is `BestEffort`. 124 | #[derive(Debug, Default, Clone)] 125 | pub enum TorMode { 126 | /// Detects whether Tor is running locally at the usual port and attempts to use it. If no Tor 127 | /// is detected, the connection to the p2p network is established through clearnet. 128 | #[default] 129 | BestEffort, 130 | /// Do not use Tor even if it is available and running. 131 | No, 132 | /// Exclusively use Tor. If it is not available, do not use clearnet. 133 | Must, 134 | } 135 | 136 | /// Defines how the initial pool of peers that we broadcast to is found. 137 | #[derive(Debug, Default, Clone)] 138 | pub enum FindPeerStrategy { 139 | /// First resolve peers from DNS seeds (same as Bitcoin Core). Fall back on a fixed peer list 140 | /// (also taken from Bitcoin Core) if that fails. Failure is defined a finding less than 20 peers. 141 | #[default] 142 | DnsSeedWithFixedFallback, 143 | /// Resolve peers from DNS seeds only. 144 | DnsSeedOnly, 145 | /// Use a user provided list of nodes. 146 | Custom(Vec), 147 | } 148 | 149 | /// The network to connect to. 150 | #[derive(Debug, Default, Clone, Copy)] 151 | pub enum Network { 152 | #[default] 153 | Mainnet, 154 | Testnet, 155 | Signet, 156 | Regtest, 157 | } 158 | 159 | impl From for bitcoin::Network { 160 | fn from(value: Network) -> Self { 161 | match value { 162 | Network::Mainnet => bitcoin::Network::Bitcoin, 163 | Network::Testnet => bitcoin::Network::Testnet, 164 | Network::Regtest => bitcoin::Network::Regtest, 165 | Network::Signet => bitcoin::Network::Signet, 166 | } 167 | } 168 | } 169 | 170 | /// Various options 171 | #[derive(Debug, Clone)] 172 | pub struct Opts { 173 | /// Which Bitcoin network to connect to. 174 | pub network: Network, 175 | /// Whether to broadcast through Tor if a local instance of it is found running. 176 | pub use_tor: TorMode, 177 | /// Which strategy to use to find the pool to draw peers from. 178 | pub find_peer_strategy: FindPeerStrategy, 179 | /// The maximum allowed duration for broadcasting regardless of the result. Terminates afterward. 180 | pub max_time: std::time::Duration, 181 | /// Whether to simulate the broadcast. This means that every part of the process will be 182 | /// executed as normal, including connecting to actual peers, but the final part where the tx 183 | /// is sent out is omitted (we pretend that the transaction really did go out and was seen.) 184 | pub dry_run: bool, 185 | /// How many peers to connect to. 186 | pub target_peers: u8, 187 | /// Custom user agent, POSIX time (secs) and block height to send during peer handshakes. 188 | /// Exercise caution modifying this. 189 | pub ua: Option<(String, u64, u64)>, 190 | } 191 | 192 | impl Default for Opts { 193 | fn default() -> Self { 194 | Self { 195 | network: Network::default(), 196 | use_tor: Default::default(), 197 | find_peer_strategy: Default::default(), 198 | max_time: std::time::Duration::from_secs(40), 199 | dry_run: false, 200 | target_peers: 10, 201 | ua: None, 202 | } 203 | } 204 | } 205 | 206 | /// Informational messages about the broadcast process. 207 | #[derive(Debug, Clone)] 208 | pub enum Info { 209 | /// Resolving peers from DNS or fixed peer list. 210 | ResolvingPeers, 211 | /// How many peers were resolved. 212 | ResolvedPeers(usize), 213 | /// Connecting to the p2p network. 214 | ConnectingToNetwork { tor_status: Option }, 215 | /// A tx broadcast to a particular peer was completed. 216 | Broadcast { peer: String }, 217 | /// The broadcast process is done. 218 | Done(Result), 219 | } 220 | 221 | /// An informational report on a broadcast outcome. 222 | #[derive(Debug, Clone)] 223 | pub struct Report { 224 | /// The list of transactions that were sent out and then seen on the network. 225 | pub success: HashSet, 226 | /// The list of transactions that were rejected, along with the reason. 227 | pub rejects: HashMap, 228 | } 229 | 230 | /// Possible error variants while broadcasting. 231 | #[derive(Debug, Clone)] 232 | pub enum Error { 233 | TorNotFound, 234 | } 235 | 236 | impl std::fmt::Display for Error { 237 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 238 | match self { 239 | Error::TorNotFound => write!(f, "Tor was required but a Tor proxy was not found"), 240 | } 241 | } 242 | } 243 | 244 | /// Connects to the p2p network and broadcasts a series of transactions. This runs fully in the 245 | /// background. Network and other parameters can be set through the `opts` argument. 246 | /// 247 | /// Returns a channel where status updates may be read. 248 | pub fn broadcast(tx: Vec, opts: Opts) -> crossbeam_channel::Receiver { 249 | let (broadcaster, event_rx) = broadcast::Runner::new(tx, opts); 250 | broadcaster.run(); 251 | event_rx 252 | } 253 | -------------------------------------------------------------------------------- /pushtx/src/broadcast.rs: -------------------------------------------------------------------------------- 1 | use std::collections::{HashMap, HashSet}; 2 | use std::net::{Ipv4Addr, SocketAddr}; 3 | use std::time; 4 | use std::time::Duration; 5 | 6 | use crate::handshake::{self, Handshake}; 7 | use crate::p2p::{self, Outbox, Receiver, Sender}; 8 | use crate::{net, seeds, Error, FindPeerStrategy, Info, Opts, Report, Transaction}; 9 | use bitcoin::p2p::message::NetworkMessage; 10 | use bitcoin::p2p::message_blockdata::Inventory; 11 | use crossbeam_channel::RecvTimeoutError; 12 | 13 | /// Transaction broadcast runner. Needs to be constructed and started to run. 14 | pub(crate) struct Runner { 15 | info_tx: crossbeam_channel::Sender, 16 | tx: Vec, 17 | opts: Opts, 18 | } 19 | 20 | impl Runner { 21 | /// Constructs a new broadcast runner without actually running it. 22 | /// The receiver allows the caller to follow the broadcast progress. 23 | pub fn new(tx: Vec, opts: Opts) -> (Self, crossbeam_channel::Receiver) { 24 | let (info_tx, info_rx) = crossbeam_channel::unbounded(); 25 | let runner = Self { info_tx, tx, opts }; 26 | 27 | (runner, info_rx) 28 | } 29 | 30 | /// Runs the broadcast in a background thread. 31 | pub fn run(self) { 32 | std::thread::spawn(move || { 33 | let (must_use_tor, proxy) = match self.opts.use_tor { 34 | crate::TorMode::No => (false, None), 35 | crate::TorMode::BestEffort => (false, detect_tor_proxy()), 36 | crate::TorMode::Must => (true, detect_tor_proxy()), 37 | }; 38 | 39 | if self.opts.dry_run { 40 | log::warn!("dry run is enabled, broadcast is simulated"); 41 | } 42 | 43 | log::info!("Tor proxy status: {:?}", proxy); 44 | if proxy.is_none() && must_use_tor { 45 | log::error!("Tor usage required but local proxy not found"); 46 | let _ = self.info_tx.send(Info::Done(Err(Error::TorNotFound))); 47 | return; 48 | } 49 | 50 | let client = p2p::client(proxy, self.opts.network, self.opts.ua); 51 | let mut state = HashMap::new(); 52 | 53 | let _ = self.info_tx.send(Info::ResolvingPeers); 54 | let networks: &[net::Network] = match proxy { 55 | Some(_) => &[net::Network::Ipv4, net::Network::Ipv6, net::Network::TorV3], 56 | None => &[net::Network::Ipv4], 57 | }; 58 | let addressbook = 59 | create_node_pool(self.opts.find_peer_strategy, self.opts.network, networks); 60 | let _ = self.info_tx.send(Info::ResolvedPeers(addressbook.len())); 61 | 62 | let _ = self 63 | .info_tx 64 | .send(Info::ConnectingToNetwork { tor_status: proxy }); 65 | 66 | let outbox = &client; 67 | for addr in addressbook.iter().take(self.opts.target_peers.into()) { 68 | outbox.connect(*addr); 69 | } 70 | outbox.send().unwrap(); 71 | 72 | let tx_map: HashMap<_, _> = self.tx.into_iter().map(|tx| (tx.0.txid(), tx.0)).collect(); 73 | let mut acks = HashSet::new(); 74 | let mut selected: Option> = None; 75 | 76 | let start = time::Instant::now(); 77 | let mut rejects = HashMap::new(); 78 | 79 | loop { 80 | let mut need_replacements = 0; 81 | let p2p = client.receiver(); 82 | 83 | match p2p.recv_timeout(Duration::from_secs(1)).map(Into::into) { 84 | Ok(p2p::Event::ConnectedTo { target, result }) => match result { 85 | Ok(id) => { 86 | log::info!("connected: peer @ {target}"); 87 | state.insert(id, Peer::Handshaking(target, Handshake::default())); 88 | outbox.version(id); 89 | } 90 | Err(_) => { 91 | log::info!("failed to connect to peer @ {target}"); 92 | need_replacements += 1; 93 | } 94 | }, 95 | 96 | Ok(p2p::Event::Message { peer, message }) => match state.get_mut(&peer) { 97 | Some(Peer::Handshaking(s, h)) => match h.update(message.payload().into()) { 98 | handshake::Event::Wait => {} 99 | handshake::Event::SendVerack => outbox.verack(peer), 100 | handshake::Event::Violation => { 101 | log::warn!("handshake violated: peer @ {}", s); 102 | state.remove(&peer); 103 | need_replacements += 1; 104 | } 105 | handshake::Event::Done { .. } => { 106 | let service = *s; 107 | log::info!("handshake complete: peer @ {}", s); 108 | state.insert(peer, Peer::Ready { service }); 109 | } 110 | }, 111 | Some(Peer::Ready { service }) => match message.payload() { 112 | NetworkMessage::Inv(inv) => { 113 | for inv in inv { 114 | if let Inventory::Transaction(wanted_txid) = inv { 115 | if tx_map.contains_key(wanted_txid) 116 | && selected.as_ref().map(|s| s.id) != Some(peer) 117 | { 118 | log::info!( 119 | "txid seen: peer @ {}: {}", 120 | service, 121 | wanted_txid 122 | ); 123 | acks.insert(*wanted_txid); 124 | } 125 | } 126 | } 127 | } 128 | NetworkMessage::Reject(reject) => { 129 | log::warn!( 130 | "reject: peer @ {}: type={}, code={:?}, reason={}", 131 | service, 132 | reject.message, 133 | reject.ccode, 134 | reject.reason 135 | ); 136 | if reject.message == "tx" { 137 | let txid = crate::Txid(reject.hash.into()); 138 | rejects.insert(txid, reject.reason.to_string()); 139 | } 140 | } 141 | _ => {} 142 | }, 143 | None => panic!("phantom peer {}", peer), 144 | }, 145 | 146 | Ok(p2p::Event::Disconnected { peer, reason }) => match state.get_mut(&peer) { 147 | Some(Peer::Ready { service } | Peer::Handshaking(service, _)) => { 148 | log::info!("disconnected: peer @ {}, reason: {:?}", service, reason); 149 | if selected.as_ref().map(|s| s.id) == Some(peer) { 150 | selected = None; 151 | } 152 | need_replacements += 1; 153 | state.remove(&peer); 154 | } 155 | None => panic!("phantom peer {}", peer), 156 | }, 157 | 158 | Err(RecvTimeoutError::Disconnected) => panic!("p2p reactor disconnected"), 159 | 160 | _ => {} 161 | } 162 | 163 | match &selected { 164 | Some(selected) if selected.is_stale() => { 165 | log::warn!("rotating broadcast peer"); 166 | outbox.disconnect(selected.id); 167 | } 168 | _ => {} 169 | } 170 | 171 | if selected.is_none() { 172 | let new_selected = state 173 | .iter() 174 | .filter_map(|(id, p)| match p { 175 | Peer::Handshaking(_, _) => None, 176 | Peer::Ready { service } => Some((*service, *id)), 177 | }) 178 | .next(); 179 | 180 | if let Some((service, id)) = new_selected { 181 | log::info!("selected broadcast peer @ {service}"); 182 | selected = Some(BroadcastPeer::new(id)); 183 | for tx in tx_map.values() { 184 | log::info!("broadcasting to {}", service); 185 | if !self.opts.dry_run { 186 | outbox.tx(id, tx.to_owned()); 187 | } 188 | } 189 | let _ = self.info_tx.send(Info::Broadcast { 190 | peer: service.to_string(), 191 | }); 192 | } 193 | } 194 | 195 | let elapsed = time::Instant::now() - start; 196 | 197 | if self.opts.dry_run && elapsed.as_secs() > 3 { 198 | acks.extend(tx_map.keys()); 199 | } 200 | 201 | if acks.len() == tx_map.len() || elapsed >= self.opts.max_time { 202 | log::info!("broadcast stop"); 203 | break; 204 | } 205 | 206 | for _ in 0..need_replacements { 207 | let replacement = fastrand::choice(addressbook.iter()).unwrap(); 208 | outbox.connect(*replacement); 209 | log::info!("picked replacement peer @ {replacement}"); 210 | } 211 | client.send().unwrap(); 212 | } 213 | 214 | client.shutdown().join().unwrap().unwrap(); 215 | let report = Ok(Report { 216 | success: acks.into_iter().map(crate::Txid).collect(), 217 | rejects, 218 | }); 219 | let _ = self.info_tx.send(Info::Done(report)); 220 | }); 221 | } 222 | } 223 | 224 | /// Peer status. 225 | enum Peer { 226 | /// Currently handshaking. 227 | Handshaking(net::Service, Handshake), 228 | /// Handshake established, ready for interaction. 229 | Ready { service: net::Service }, 230 | } 231 | 232 | /// A single peer that we have selected for our transaction broadcast. 233 | struct BroadcastPeer { 234 | /// The id of the peer. 235 | id: P, 236 | /// The time the broadcast took place. 237 | when: std::time::Instant, 238 | } 239 | 240 | impl BroadcastPeer

{ 241 | fn new(id: P) -> Self { 242 | Self { 243 | id, 244 | when: std::time::Instant::now(), 245 | } 246 | } 247 | /// Whether the peer is stale and should be rotated. 248 | fn is_stale(&self) -> bool { 249 | std::time::Instant::now() - self.when > Duration::from_secs(10) 250 | } 251 | } 252 | 253 | /// Tries to detect a local Tor proxy on the usual ports. 254 | fn detect_tor_proxy() -> Option { 255 | fn is_port_reachable(addr: SocketAddr) -> bool { 256 | std::net::TcpStream::connect(addr).is_ok() 257 | } 258 | 259 | // Tor daemon has a SOCKS proxy on port 9050 260 | if is_port_reachable((Ipv4Addr::LOCALHOST, 9050).into()) { 261 | return Some((Ipv4Addr::LOCALHOST, 9050).into()); 262 | } 263 | 264 | // Tor browser has a SOCKS proxy on port 9150 265 | if is_port_reachable((Ipv4Addr::LOCALHOST, 9150).into()) { 266 | return Some((Ipv4Addr::LOCALHOST, 9150).into()); 267 | } 268 | 269 | None 270 | } 271 | 272 | /// Creates a pool of nodes from where peers can be found. 273 | fn create_node_pool( 274 | strategy: FindPeerStrategy, 275 | p2p_network: crate::Network, 276 | allowed_networks: &[net::Network], 277 | ) -> Vec { 278 | match strategy { 279 | FindPeerStrategy::DnsSeedWithFixedFallback | FindPeerStrategy::DnsSeedOnly => { 280 | let mut nodes = seeds::dns(p2p_network); 281 | if matches!(strategy, FindPeerStrategy::DnsSeedWithFixedFallback) && nodes.len() < 20 { 282 | nodes.extend(seeds::fixed(p2p_network)); 283 | } 284 | fastrand::shuffle(&mut nodes); 285 | nodes 286 | .into_iter() 287 | .filter(|node| allowed_networks.iter().any(|net| node.on_network(*net))) 288 | .collect() 289 | } 290 | FindPeerStrategy::Custom(custom) => custom.into_iter().map(Into::into).collect(), 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "anstream" 7 | version = "0.6.14" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 10 | dependencies = [ 11 | "anstyle", 12 | "anstyle-parse", 13 | "anstyle-query", 14 | "anstyle-wincon", 15 | "colorchoice", 16 | "is_terminal_polyfill", 17 | "utf8parse", 18 | ] 19 | 20 | [[package]] 21 | name = "anstyle" 22 | version = "1.0.7" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" 25 | 26 | [[package]] 27 | name = "anstyle-parse" 28 | version = "0.2.4" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 31 | dependencies = [ 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle-query" 37 | version = "1.0.3" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" 40 | dependencies = [ 41 | "windows-sys 0.52.0", 42 | ] 43 | 44 | [[package]] 45 | name = "anstyle-wincon" 46 | version = "3.0.3" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 49 | dependencies = [ 50 | "anstyle", 51 | "windows-sys 0.52.0", 52 | ] 53 | 54 | [[package]] 55 | name = "anyhow" 56 | version = "1.0.86" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 59 | 60 | [[package]] 61 | name = "autocfg" 62 | version = "1.3.0" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 65 | 66 | [[package]] 67 | name = "bech32" 68 | version = "0.10.0-beta" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" 71 | 72 | [[package]] 73 | name = "bitcoin" 74 | version = "0.31.2" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" 77 | dependencies = [ 78 | "bech32", 79 | "bitcoin-internals", 80 | "bitcoin_hashes", 81 | "hex-conservative", 82 | "hex_lit", 83 | "secp256k1", 84 | ] 85 | 86 | [[package]] 87 | name = "bitcoin-internals" 88 | version = "0.2.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" 91 | 92 | [[package]] 93 | name = "bitcoin_hashes" 94 | version = "0.13.0" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" 97 | dependencies = [ 98 | "bitcoin-internals", 99 | "hex-conservative", 100 | ] 101 | 102 | [[package]] 103 | name = "block-buffer" 104 | version = "0.10.4" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 107 | dependencies = [ 108 | "generic-array", 109 | ] 110 | 111 | [[package]] 112 | name = "byteorder" 113 | version = "1.5.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 116 | 117 | [[package]] 118 | name = "cc" 119 | version = "1.0.98" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" 122 | 123 | [[package]] 124 | name = "cfg-if" 125 | version = "1.0.0" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 128 | 129 | [[package]] 130 | name = "clap" 131 | version = "4.5.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" 134 | dependencies = [ 135 | "clap_builder", 136 | "clap_derive", 137 | ] 138 | 139 | [[package]] 140 | name = "clap_builder" 141 | version = "4.5.2" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" 144 | dependencies = [ 145 | "anstream", 146 | "anstyle", 147 | "clap_lex", 148 | "strsim", 149 | ] 150 | 151 | [[package]] 152 | name = "clap_derive" 153 | version = "4.5.4" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" 156 | dependencies = [ 157 | "heck", 158 | "proc-macro2", 159 | "quote", 160 | "syn", 161 | ] 162 | 163 | [[package]] 164 | name = "clap_lex" 165 | version = "0.7.0" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 168 | 169 | [[package]] 170 | name = "colorchoice" 171 | version = "1.0.1" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" 174 | 175 | [[package]] 176 | name = "cpufeatures" 177 | version = "0.2.12" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 180 | dependencies = [ 181 | "libc", 182 | ] 183 | 184 | [[package]] 185 | name = "crossbeam-channel" 186 | version = "0.5.13" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" 189 | dependencies = [ 190 | "crossbeam-utils", 191 | ] 192 | 193 | [[package]] 194 | name = "crossbeam-utils" 195 | version = "0.8.20" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 198 | 199 | [[package]] 200 | name = "crypto-common" 201 | version = "0.1.6" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 204 | dependencies = [ 205 | "generic-array", 206 | "typenum", 207 | ] 208 | 209 | [[package]] 210 | name = "data-encoding" 211 | version = "2.6.0" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" 214 | 215 | [[package]] 216 | name = "digest" 217 | version = "0.10.7" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 220 | dependencies = [ 221 | "block-buffer", 222 | "crypto-common", 223 | ] 224 | 225 | [[package]] 226 | name = "dns-lookup" 227 | version = "2.0.4" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc" 230 | dependencies = [ 231 | "cfg-if", 232 | "libc", 233 | "socket2", 234 | "windows-sys 0.48.0", 235 | ] 236 | 237 | [[package]] 238 | name = "env_filter" 239 | version = "0.1.0" 240 | source = "registry+https://github.com/rust-lang/crates.io-index" 241 | checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" 242 | dependencies = [ 243 | "log", 244 | ] 245 | 246 | [[package]] 247 | name = "env_logger" 248 | version = "0.11.3" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" 251 | dependencies = [ 252 | "env_filter", 253 | "log", 254 | ] 255 | 256 | [[package]] 257 | name = "fastrand" 258 | version = "2.1.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 261 | 262 | [[package]] 263 | name = "generic-array" 264 | version = "0.14.7" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 267 | dependencies = [ 268 | "typenum", 269 | "version_check", 270 | ] 271 | 272 | [[package]] 273 | name = "heck" 274 | version = "0.5.0" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 277 | 278 | [[package]] 279 | name = "hex" 280 | version = "0.4.3" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 283 | 284 | [[package]] 285 | name = "hex-conservative" 286 | version = "0.1.2" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" 289 | 290 | [[package]] 291 | name = "hex_lit" 292 | version = "0.1.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" 295 | 296 | [[package]] 297 | name = "is_terminal_polyfill" 298 | version = "1.70.0" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 301 | 302 | [[package]] 303 | name = "keccak" 304 | version = "0.1.5" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" 307 | dependencies = [ 308 | "cpufeatures", 309 | ] 310 | 311 | [[package]] 312 | name = "libc" 313 | version = "0.2.155" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 316 | 317 | [[package]] 318 | name = "log" 319 | version = "0.4.21" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 322 | 323 | [[package]] 324 | name = "mio" 325 | version = "0.8.11" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 328 | dependencies = [ 329 | "libc", 330 | "log", 331 | "wasi", 332 | "windows-sys 0.48.0", 333 | ] 334 | 335 | [[package]] 336 | name = "nohash-hasher" 337 | version = "0.2.0" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 340 | 341 | [[package]] 342 | name = "peerlink" 343 | version = "0.8.0" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "9cec5e068ddc6eaedd4d068f3191f24289ec4228cf3179ec93575cb55e2c532d" 346 | dependencies = [ 347 | "crossbeam-channel", 348 | "log", 349 | "mio", 350 | "nohash-hasher", 351 | "slab", 352 | "socks", 353 | ] 354 | 355 | [[package]] 356 | name = "proc-macro2" 357 | version = "1.0.83" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" 360 | dependencies = [ 361 | "unicode-ident", 362 | ] 363 | 364 | [[package]] 365 | name = "pushtx" 366 | version = "0.4.0" 367 | dependencies = [ 368 | "bitcoin", 369 | "crossbeam-channel", 370 | "data-encoding", 371 | "dns-lookup", 372 | "fastrand", 373 | "hex", 374 | "log", 375 | "peerlink", 376 | "sha3", 377 | ] 378 | 379 | [[package]] 380 | name = "pushtx-cli" 381 | version = "0.4.0" 382 | dependencies = [ 383 | "anyhow", 384 | "clap", 385 | "env_logger", 386 | "log", 387 | "pushtx", 388 | "thiserror", 389 | ] 390 | 391 | [[package]] 392 | name = "quote" 393 | version = "1.0.36" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 396 | dependencies = [ 397 | "proc-macro2", 398 | ] 399 | 400 | [[package]] 401 | name = "secp256k1" 402 | version = "0.28.2" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" 405 | dependencies = [ 406 | "bitcoin_hashes", 407 | "secp256k1-sys", 408 | ] 409 | 410 | [[package]] 411 | name = "secp256k1-sys" 412 | version = "0.9.2" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" 415 | dependencies = [ 416 | "cc", 417 | ] 418 | 419 | [[package]] 420 | name = "sha3" 421 | version = "0.10.8" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 424 | dependencies = [ 425 | "digest", 426 | "keccak", 427 | ] 428 | 429 | [[package]] 430 | name = "slab" 431 | version = "0.4.9" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 434 | dependencies = [ 435 | "autocfg", 436 | ] 437 | 438 | [[package]] 439 | name = "socket2" 440 | version = "0.5.7" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 443 | dependencies = [ 444 | "libc", 445 | "windows-sys 0.52.0", 446 | ] 447 | 448 | [[package]] 449 | name = "socks" 450 | version = "0.3.4" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" 453 | dependencies = [ 454 | "byteorder", 455 | "libc", 456 | "winapi", 457 | ] 458 | 459 | [[package]] 460 | name = "strsim" 461 | version = "0.11.1" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 464 | 465 | [[package]] 466 | name = "syn" 467 | version = "2.0.65" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" 470 | dependencies = [ 471 | "proc-macro2", 472 | "quote", 473 | "unicode-ident", 474 | ] 475 | 476 | [[package]] 477 | name = "thiserror" 478 | version = "1.0.61" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 481 | dependencies = [ 482 | "thiserror-impl", 483 | ] 484 | 485 | [[package]] 486 | name = "thiserror-impl" 487 | version = "1.0.61" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 490 | dependencies = [ 491 | "proc-macro2", 492 | "quote", 493 | "syn", 494 | ] 495 | 496 | [[package]] 497 | name = "typenum" 498 | version = "1.17.0" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 501 | 502 | [[package]] 503 | name = "unicode-ident" 504 | version = "1.0.12" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 507 | 508 | [[package]] 509 | name = "utf8parse" 510 | version = "0.2.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 513 | 514 | [[package]] 515 | name = "version_check" 516 | version = "0.9.4" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 519 | 520 | [[package]] 521 | name = "wasi" 522 | version = "0.11.0+wasi-snapshot-preview1" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 525 | 526 | [[package]] 527 | name = "winapi" 528 | version = "0.3.9" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 531 | dependencies = [ 532 | "winapi-i686-pc-windows-gnu", 533 | "winapi-x86_64-pc-windows-gnu", 534 | ] 535 | 536 | [[package]] 537 | name = "winapi-i686-pc-windows-gnu" 538 | version = "0.4.0" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 541 | 542 | [[package]] 543 | name = "winapi-x86_64-pc-windows-gnu" 544 | version = "0.4.0" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 547 | 548 | [[package]] 549 | name = "windows-sys" 550 | version = "0.48.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 553 | dependencies = [ 554 | "windows-targets 0.48.5", 555 | ] 556 | 557 | [[package]] 558 | name = "windows-sys" 559 | version = "0.52.0" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 562 | dependencies = [ 563 | "windows-targets 0.52.5", 564 | ] 565 | 566 | [[package]] 567 | name = "windows-targets" 568 | version = "0.48.5" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 571 | dependencies = [ 572 | "windows_aarch64_gnullvm 0.48.5", 573 | "windows_aarch64_msvc 0.48.5", 574 | "windows_i686_gnu 0.48.5", 575 | "windows_i686_msvc 0.48.5", 576 | "windows_x86_64_gnu 0.48.5", 577 | "windows_x86_64_gnullvm 0.48.5", 578 | "windows_x86_64_msvc 0.48.5", 579 | ] 580 | 581 | [[package]] 582 | name = "windows-targets" 583 | version = "0.52.5" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 586 | dependencies = [ 587 | "windows_aarch64_gnullvm 0.52.5", 588 | "windows_aarch64_msvc 0.52.5", 589 | "windows_i686_gnu 0.52.5", 590 | "windows_i686_gnullvm", 591 | "windows_i686_msvc 0.52.5", 592 | "windows_x86_64_gnu 0.52.5", 593 | "windows_x86_64_gnullvm 0.52.5", 594 | "windows_x86_64_msvc 0.52.5", 595 | ] 596 | 597 | [[package]] 598 | name = "windows_aarch64_gnullvm" 599 | version = "0.48.5" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 602 | 603 | [[package]] 604 | name = "windows_aarch64_gnullvm" 605 | version = "0.52.5" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 608 | 609 | [[package]] 610 | name = "windows_aarch64_msvc" 611 | version = "0.48.5" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 614 | 615 | [[package]] 616 | name = "windows_aarch64_msvc" 617 | version = "0.52.5" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 620 | 621 | [[package]] 622 | name = "windows_i686_gnu" 623 | version = "0.48.5" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 626 | 627 | [[package]] 628 | name = "windows_i686_gnu" 629 | version = "0.52.5" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 632 | 633 | [[package]] 634 | name = "windows_i686_gnullvm" 635 | version = "0.52.5" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 638 | 639 | [[package]] 640 | name = "windows_i686_msvc" 641 | version = "0.48.5" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 644 | 645 | [[package]] 646 | name = "windows_i686_msvc" 647 | version = "0.52.5" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 650 | 651 | [[package]] 652 | name = "windows_x86_64_gnu" 653 | version = "0.48.5" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 656 | 657 | [[package]] 658 | name = "windows_x86_64_gnu" 659 | version = "0.52.5" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 662 | 663 | [[package]] 664 | name = "windows_x86_64_gnullvm" 665 | version = "0.48.5" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 668 | 669 | [[package]] 670 | name = "windows_x86_64_gnullvm" 671 | version = "0.52.5" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 674 | 675 | [[package]] 676 | name = "windows_x86_64_msvc" 677 | version = "0.48.5" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 680 | 681 | [[package]] 682 | name = "windows_x86_64_msvc" 683 | version = "0.52.5" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 686 | -------------------------------------------------------------------------------- /pushtx/seeds/mainnet.txt: -------------------------------------------------------------------------------- 1 | 1.253.159.19:8333 2 | 2.152.74.211:8333 3 | 5.2.23.226:8333 4 | 5.128.87.126:8333 5 | 5.157.103.202:8333 6 | 5.188.62.18:8333 7 | 5.253.18.218:8333 8 | 5.255.109.160:8333 9 | 8.129.184.255:8333 10 | 8.209.70.77:8333 11 | 8.210.18.56:8333 12 | 12.34.98.148:8333 13 | 18.27.79.17:8333 14 | 23.93.170.118:8333 15 | 23.154.136.144:8333 16 | 23.175.0.212:8333 17 | 23.175.0.222:8333 18 | 24.84.164.50:8333 19 | 24.86.90.127:8333 20 | 24.101.126.194:8333 21 | 24.183.75.154:8333 22 | 27.124.108.19:8333 23 | 27.148.206.140:8333 24 | 31.25.98.16:8333 25 | 31.41.23.249:8333 26 | 31.47.202.112:8333 27 | 31.156.128.248:8333 28 | 31.164.160.162:8333 29 | 31.201.190.134:8333 30 | 31.208.34.61:8333 31 | 34.78.14.25:8333 32 | 34.80.134.68:8333 33 | 35.137.133.225:8333 34 | 35.193.192.48:8333 35 | 35.194.39.250:8333 36 | 37.15.60.144:8333 37 | 37.60.228.251:8333 38 | 37.60.229.117:8333 39 | 37.110.132.94:8333 40 | 37.120.179.29:8333 41 | 37.139.102.73:8333 42 | 37.157.192.94:8333 43 | 37.220.135.151:8333 44 | 38.9.81.160:8333 45 | 38.21.221.252:8333 46 | 38.54.14.89:8333 47 | 38.91.106.111:8333 48 | 38.102.85.36:8333 49 | 42.2.162.218:8333 50 | 43.129.75.20:8333 51 | 43.159.61.16:8333 52 | 43.225.62.107:8333 53 | 43.245.196.214:8333 54 | 45.13.7.221:8333 55 | 45.44.213.123:8333 56 | 45.48.75.224:8333 57 | 45.79.76.12:8333 58 | 45.94.209.127:8333 59 | 45.130.23.57:8333 60 | 45.132.118.25:8333 61 | 45.144.249.207:8333 62 | 45.145.40.43:8333 63 | 45.155.169.30:8333 64 | 46.17.99.13:8333 65 | 46.17.99.26:8333 66 | 46.21.250.25:8333 67 | 46.28.204.161:8333 68 | 46.128.199.26:8333 69 | 46.164.59.139:8333 70 | 46.166.142.2:8333 71 | 46.172.233.241:8333 72 | 46.252.5.112:8333 73 | 47.28.85.71:8333 74 | 47.176.248.250:8333 75 | 47.198.60.180:8333 76 | 50.27.22.141:8333 77 | 50.39.170.149:8333 78 | 50.53.250.162:8333 79 | 51.154.62.103:8333 80 | 51.158.150.155:8333 81 | 51.174.206.76:8333 82 | 54.217.136.122:8333 83 | 54.253.15.33:8333 84 | 57.128.96.115:8333 85 | 57.128.148.169:8333 86 | 58.6.46.171:8333 87 | 58.96.77.114:8333 88 | 58.96.123.120:8333 89 | 58.168.253.35:8333 90 | 59.167.191.60:8333 91 | 60.205.205.119:8333 92 | 60.212.189.151:8333 93 | 61.74.99.193:8333 94 | 62.24.76.122:8333 95 | 62.106.70.249:8333 96 | 62.168.65.42:8333 97 | 62.171.129.32:8333 98 | 62.245.75.70:8333 99 | 62.248.8.167:8333 100 | 64.23.150.211:8333 101 | 64.98.119.136:8333 102 | 65.24.75.34:8333 103 | 65.175.185.101:8333 104 | 66.45.141.46:8333 105 | 66.58.163.185:8333 106 | 66.85.133.182:8333 107 | 66.206.22.26:8333 108 | 67.40.102.33:8333 109 | 67.43.210.62:8333 110 | 67.82.136.177:8333 111 | 67.193.87.50:8333 112 | 67.210.228.203:8333 113 | 67.211.211.118:8333 114 | 67.231.246.58:8333 115 | 68.6.84.222:8333 116 | 68.48.136.216:8333 117 | 68.69.170.92:8333 118 | 69.4.94.226:8333 119 | 69.8.175.201:8333 120 | 69.57.160.49:8333 121 | 69.112.103.124:8333 122 | 69.196.152.33:8333 123 | 71.19.148.180:8333 124 | 73.227.153.213:8333 125 | 74.50.81.93:8333 126 | 74.101.205.214:8333 127 | 74.118.137.119:8333 128 | 74.213.175.108:8333 129 | 74.213.251.239:8333 130 | 74.220.255.190:8333 131 | 77.20.48.144:8333 132 | 77.21.149.160:8333 133 | 77.37.240.209:8333 134 | 77.43.14.68:8333 135 | 77.111.57.109:8333 136 | 77.162.190.90:8333 137 | 77.173.132.140:8333 138 | 77.202.10.220:8333 139 | 78.27.139.13:8333 140 | 78.31.71.190:8333 141 | 78.35.147.203:8333 142 | 78.42.144.24:8333 143 | 78.43.153.185:8333 144 | 78.56.89.146:8333 145 | 78.70.208.53:8333 146 | 79.109.120.38:8333 147 | 79.116.56.89:8333 148 | 79.124.7.253:8333 149 | 79.136.250.162:8333 150 | 80.83.186.25:8333 151 | 80.98.75.248:8333 152 | 80.229.28.60:8333 153 | 80.244.26.192:8333 154 | 81.4.110.168:8333 155 | 81.7.17.202:8333 156 | 81.19.10.2:8333 157 | 81.83.214.134:8333 158 | 81.170.142.100:8333 159 | 81.171.22.143:8333 160 | 81.242.239.139:8333 161 | 82.66.10.11:8333 162 | 82.66.204.177:8333 163 | 82.96.96.40:8333 164 | 82.149.225.249:8333 165 | 82.155.148.211:8333 166 | 82.181.218.133:8333 167 | 83.99.247.25:8333 168 | 83.136.232.21:8333 169 | 83.192.226.66:8333 170 | 83.208.193.242:8333 171 | 83.240.118.196:8333 172 | 84.7.219.130:8333 173 | 84.52.64.82:8333 174 | 84.64.99.78:8333 175 | 84.112.60.16:8333 176 | 84.113.129.195:8333 177 | 84.211.187.211:8333 178 | 84.217.134.213:8333 179 | 84.247.128.15:8333 180 | 84.247.132.27:8333 181 | 84.247.173.117:8333 182 | 84.247.179.51:8333 183 | 84.255.245.194:8333 184 | 85.145.79.26:8333 185 | 85.173.165.66:8333 186 | 85.195.196.86:8333 187 | 85.214.118.71:8333 188 | 86.22.20.13:8333 189 | 86.45.238.115:8333 190 | 86.182.223.189:8333 191 | 86.215.168.115:8333 192 | 87.79.94.221:8333 193 | 87.90.94.120:8333 194 | 87.92.171.53:8333 195 | 87.236.195.198:8333 196 | 87.236.199.197:8333 197 | 88.6.31.66:8333 198 | 88.9.73.252:8333 199 | 88.84.223.30:8333 200 | 88.146.114.173:8333 201 | 89.35.142.177:8333 202 | 89.44.41.142:8333 203 | 89.116.25.234:8333 204 | 89.117.58.113:8333 205 | 89.117.172.121:8333 206 | 89.165.232.242:8333 207 | 89.190.142.56:8333 208 | 89.216.91.120:8333 209 | 89.247.224.28:8333 210 | 90.146.207.67:8333 211 | 90.156.26.148:8333 212 | 90.163.172.78:8333 213 | 90.192.118.202:8333 214 | 90.208.159.11:8333 215 | 90.247.70.31:8333 216 | 91.86.25.207:8333 217 | 91.123.182.164:8333 218 | 91.123.183.219:8333 219 | 91.134.145.202:8333 220 | 91.135.0.187:8333 221 | 91.152.122.36:8333 222 | 91.184.174.191:8333 223 | 91.204.149.5:8333 224 | 91.206.17.195:8333 225 | 91.209.51.131:8333 226 | 91.215.91.254:8333 227 | 91.231.182.53:8333 228 | 91.236.251.137:8333 229 | 91.236.251.139:8333 230 | 91.237.88.218:8333 231 | 92.27.150.46:8333 232 | 92.27.150.47:8333 233 | 92.42.110.219:8333 234 | 92.43.187.34:8333 235 | 92.206.105.31:8333 236 | 92.233.2.59:8333 237 | 92.240.181.45:8333 238 | 93.51.13.120:8333 239 | 93.57.81.162:8333 240 | 93.71.19.130:8333 241 | 93.81.254.159:8333 242 | 93.90.82.227:8333 243 | 93.100.35.189:8333 244 | 93.103.13.1:8333 245 | 93.123.180.164:8333 246 | 93.177.188.74:8333 247 | 93.188.102.53:8333 248 | 94.19.7.55:8333 249 | 94.63.75.74:8333 250 | 94.72.141.61:8333 251 | 94.72.143.47:8333 252 | 94.105.53.124:8333 253 | 94.181.46.106:8333 254 | 94.231.253.18:8333 255 | 95.42.140.142:8333 256 | 95.82.130.223:8333 257 | 95.88.61.176:8333 258 | 95.105.172.171:8333 259 | 95.110.234.93:8333 260 | 95.164.182.44:8333 261 | 95.191.130.100:8333 262 | 96.3.53.254:8333 263 | 97.75.144.9:8333 264 | 98.17.95.93:8333 265 | 98.128.230.186:8333 266 | 98.163.242.149:8333 267 | 98.229.126.23:8333 268 | 99.233.20.215:8333 269 | 99.246.87.2:8333 270 | 101.51.138.194:8333 271 | 102.130.113.94:8333 272 | 103.99.170.210:8333 273 | 103.99.170.220:8333 274 | 103.156.165.171:8333 275 | 103.219.169.49:8333 276 | 104.171.202.244:8333 277 | 104.225.220.33:8333 278 | 104.244.73.6:8333 279 | 104.244.79.131:8333 280 | 108.49.65.132:8333 281 | 109.86.60.33:8333 282 | 109.91.141.145:8333 283 | 109.99.63.159:8333 284 | 109.120.194.136:8333 285 | 109.196.124.182:8333 286 | 109.201.168.32:8333 287 | 109.224.84.149:8333 288 | 111.90.140.46:8333 289 | 112.139.10.25:8333 290 | 114.34.130.206:8333 291 | 116.58.171.67:8333 292 | 116.86.195.192:8333 293 | 119.31.179.202:8333 294 | 119.42.55.203:8333 295 | 120.226.39.100:8333 296 | 120.226.39.103:8333 297 | 121.6.69.73:8333 298 | 121.99.240.87:8333 299 | 122.148.147.136:8333 300 | 122.199.40.21:8333 301 | 123.60.213.192:8333 302 | 123.202.193.121:8333 303 | 124.170.182.194:8333 304 | 124.197.54.113:8333 305 | 125.168.110.28:8333 306 | 125.227.178.68:8333 307 | 128.0.190.26:8333 308 | 129.13.189.215:8333 309 | 130.44.176.111:8333 310 | 130.204.161.3:8333 311 | 131.153.232.139:8333 312 | 131.188.40.47:8333 313 | 134.65.193.149:8333 314 | 135.19.41.208:8333 315 | 135.19.253.101:8333 316 | 135.23.204.98:8333 317 | 135.181.215.237:8333 318 | 136.55.46.15:8333 319 | 136.62.58.224:8333 320 | 136.175.8.175:8333 321 | 136.244.19.126:8333 322 | 137.226.34.46:8333 323 | 138.59.20.209:8333 324 | 139.59.70.163:8333 325 | 140.238.220.99:8333 326 | 141.193.68.11:8333 327 | 142.54.181.218:8333 328 | 142.115.140.2:8333 329 | 142.188.125.200:8333 330 | 143.110.252.124:8333 331 | 144.24.236.64:8333 332 | 144.137.29.181:8333 333 | 146.71.69.103:8333 334 | 149.28.159.141:8333 335 | 149.143.32.26:8333 336 | 149.202.79.199:8333 337 | 149.248.1.254:8333 338 | 151.248.221.197:8333 339 | 152.44.137.83:8333 340 | 152.230.180.115:8333 341 | 154.26.137.105:8333 342 | 154.92.111.100:8333 343 | 157.131.20.174:8333 344 | 158.129.140.201:8333 345 | 158.181.114.196:8333 346 | 158.220.85.82:8333 347 | 158.220.121.93:8333 348 | 159.2.191.175:8333 349 | 159.224.238.145:8333 350 | 161.97.167.10:8333 351 | 162.213.119.12:8333 352 | 162.226.61.8:8333 353 | 162.254.171.209:8333 354 | 163.114.159.205:8333 355 | 163.172.84.134:8333 356 | 165.255.241.184:8333 357 | 167.179.147.155:8333 358 | 169.150.206.206:8333 359 | 170.17.151.235:8333 360 | 170.254.147.116:8333 361 | 172.92.102.115:8333 362 | 172.105.21.216:8333 363 | 172.219.229.252:8333 364 | 172.251.101.27:8333 365 | 173.12.119.133:8333 366 | 173.19.176.228:8333 367 | 173.181.35.50:8333 368 | 173.212.98.0:8333 369 | 173.241.227.243:8333 370 | 173.246.31.114:8333 371 | 174.20.57.30:8333 372 | 175.27.247.104:8333 373 | 175.136.174.174:8333 374 | 176.9.17.121:8333 375 | 176.37.82.83:8333 376 | 176.74.136.237:8333 377 | 176.118.220.29:8333 378 | 176.138.233.166:8333 379 | 177.32.50.167:8333 380 | 178.21.118.178:8333 381 | 178.41.11.254:8333 382 | 178.79.83.147:8333 383 | 178.88.189.254:8333 384 | 178.154.222.104:8333 385 | 178.159.98.133:8333 386 | 178.198.23.120:8333 387 | 178.250.232.111:8333 388 | 182.229.145.161:8333 389 | 183.88.223.208:8333 390 | 183.129.178.205:8333 391 | 185.25.48.184:8333 392 | 185.26.99.171:8333 393 | 185.31.136.246:8333 394 | 185.52.93.45:8333 395 | 185.69.53.153:8333 396 | 185.84.224.116:8333 397 | 185.107.83.55:8333 398 | 185.116.94.239:8333 399 | 185.140.209.159:8333 400 | 185.148.3.227:8333 401 | 185.152.138.74:8333 402 | 185.153.196.14:8333 403 | 185.153.196.162:8333 404 | 185.156.37.30:8333 405 | 185.156.154.129:8333 406 | 185.158.113.172:8333 407 | 185.165.170.19:8333 408 | 185.190.24.72:8333 409 | 185.199.209.52:8333 410 | 185.203.41.148:8333 411 | 185.209.12.76:8333 412 | 185.210.125.33:8333 413 | 185.233.189.210:8333 414 | 185.250.36.66:8333 415 | 185.254.97.164:8333 416 | 186.235.86.249:8333 417 | 188.27.79.235:8333 418 | 188.35.167.14:8333 419 | 188.68.53.44:8333 420 | 188.119.67.137:8333 421 | 188.127.243.41:8333 422 | 188.138.112.60:8333 423 | 188.142.199.17:8333 424 | 188.155.72.160:8333 425 | 188.214.129.52:8333 426 | 188.214.129.139:8333 427 | 188.215.62.122:8333 428 | 188.237.167.51:8333 429 | 188.246.224.12:8333 430 | 189.6.221.37:8333 431 | 190.2.146.90:8333 432 | 190.17.18.190:8333 433 | 190.210.98.253:8333 434 | 192.3.11.24:8333 435 | 192.69.53.18:8333 436 | 192.146.137.44:8333 437 | 193.22.128.12:8333 438 | 193.39.142.89:8333 439 | 193.46.74.252:8333 440 | 193.46.74.254:8333 441 | 193.95.249.3:8333 442 | 193.149.176.200:8333 443 | 193.151.155.122:8333 444 | 193.187.90.122:8333 445 | 193.196.37.62:8333 446 | 194.35.184.95:8333 447 | 194.165.30.20:8333 448 | 194.191.232.153:8333 449 | 195.32.108.164:8333 450 | 195.56.63.11:8333 451 | 195.56.63.12:8333 452 | 195.123.217.63:8333 453 | 195.128.248.153:8333 454 | 195.140.226.154:8333 455 | 195.160.222.81:8333 456 | 195.206.105.7:8333 457 | 199.36.253.252:8333 458 | 199.58.100.115:8333 459 | 202.90.242.93:8333 460 | 202.112.238.128:8333 461 | 202.186.38.99:8333 462 | 203.12.0.167:8333 463 | 203.12.10.224:8333 464 | 203.210.193.21:8333 465 | 204.228.142.211:8333 466 | 205.178.182.133:8333 467 | 206.55.178.157:8333 468 | 206.192.203.0:8333 469 | 207.98.253.88:8333 470 | 207.115.84.47:8333 471 | 207.255.193.47:8333 472 | 208.104.92.74:8333 473 | 209.38.244.87:8333 474 | 209.204.29.18:8333 475 | 209.205.204.218:8333 476 | 209.237.133.54:8333 477 | 210.6.95.127:8333 478 | 210.205.146.114:8333 479 | 211.221.42.143:8333 480 | 212.5.157.40:8333 481 | 212.51.136.50:8333 482 | 212.86.32.106:8333 483 | 212.162.152.149:8333 484 | 212.227.150.147:8333 485 | 212.227.155.170:8333 486 | 212.251.162.190:8333 487 | 213.109.236.129:8333 488 | 213.141.154.201:8333 489 | 213.193.83.251:8333 490 | 213.193.83.252:8333 491 | 213.202.225.122:8333 492 | 216.83.150.142:8333 493 | 216.186.236.98:8333 494 | 216.232.33.24:8333 495 | 217.64.47.138:8333 496 | 217.64.47.200:8333 497 | 217.76.61.78:8333 498 | 217.92.55.246:8333 499 | 217.113.121.169:8333 500 | 217.155.244.170:8333 501 | 217.170.124.170:8333 502 | 217.173.236.25:8333 503 | 217.180.192.116:8333 504 | 217.180.221.162:8333 505 | 218.43.123.236:8333 506 | 219.77.79.128:8333 507 | 223.18.222.210:8333 508 | 223.167.75.165:8333 509 | [2001:1620:5566:100::62c]:8333 510 | [2001:1620:a21:0:da5e:d3ff:fee3:68a0]:8333 511 | [2001:19f0:4401:e8a:5400:4ff:fe8e:d398]:8333 512 | [2001:1bc0:c1::2000]:8333 513 | [2001:4060:4419:8001::42]:8333 514 | [2001:41d0:203:8f46::]:8333 515 | [2001:41d0:30e:8e00::]:8333 516 | [2001:41d0:403:3d61::]:8333 517 | [2001:41d0:405:6e00::]:8333 518 | [2001:41d0:8:83cf:195b:b202:9271:cc5b]:8333 519 | [2001:41d0:8:ed7f::1]:8333 520 | [2001:41d0:a:69a2::1]:8333 521 | [2001:41d0:a:6b4d::1]:8333 522 | [2001:470:1b55::]:8333 523 | [2001:470:1b62::]:8333 524 | [2001:470:1f09:b14::11]:8333 525 | [2001:470:1f0a:89a::2]:8333 526 | [2001:470:1f1b:5a6:216:3eff:fe24:1162]:8333 527 | [2001:470:75e9:1::10]:8333 528 | [2001:470:88ff:2e::1]:8333 529 | [2001:470:8ca0:2:7646:a0ff:fe9b:e662]:8333 530 | [2001:470:a:c13::2]:8333 531 | [2001:470:c:1077::2]:8333 532 | [2001:4dd0:3564:0:30b7:1d7b:6fec:4c5c]:8333 533 | [2001:4dd0:3564:0:88e:b4ff:2ad0:699b]:8333 534 | [2001:4dd0:3564:0:9c1c:cc31:9fe8:5505]:8333 535 | [2001:4dd0:3564:0:a0c4:d41f:4c4:1bb0]:8333 536 | [2001:4dd0:3564:0:fd76:c1d3:1854:5bd9]:8333 537 | [2001:4dd0:3564:1::7676:8090]:8333 538 | [2001:4dd0:3564:1:b977:bd71:4612:8e40]:8333 539 | [2001:4dd0:af0e:3564::69:1]:8333 540 | [2001:4dd0:af0e:3564::69:90]:8333 541 | [2001:560:441f:1::4]:8333 542 | [2001:5a8:40c7:f500:7a0d:d50:255e:dbac]:8333 543 | [2001:638:a000:4140::ffff:47]:8333 544 | [2001:67c:26b4:ff00::44]:8333 545 | [2001:67c:440:688:91:236:251:137]:8333 546 | [2001:67c:440:688:91:236:251:139]:8333 547 | [2001:7c0:2310:0:f816:3eff:fe6c:4f58]:8333 548 | [2001:861:c62:2fd0:ca7f:54ff:fece:6d9]:8333 549 | [2001:871:23d:d5d1:5a47:caff:fe71:c8d]:8333 550 | [2001:910:109d:2c03:d217:c2ff:fe07:2cd9]:8333 551 | [2001:b07:6461:7811:489:d2da:e07:1af7]:8333 552 | [2001:b07:646b:8074:32e8:9243:a337:e60a]:8333 553 | [2001:bc8:1201:715:ca1f:66ff:fec9:5ff0]:8333 554 | [2001:bc8:1201:71a:2e59:e5ff:fe42:52f4]:8333 555 | [2001:bc8:1600:0:208:a2ff:fe0c:8a2e]:8333 556 | [2003:dc:2f4a:eb00:4ecc:6aff:fe25:c9a3]:8333 557 | [2003:f6:3f31:600:4c9f:7620:8324:d4a7]:8333 558 | [2400:6180:100:d0::848:5001]:8333 559 | [2400:6180:100:d0::940:4001]:8333 560 | [2400:6180:100:d0::953:8001]:8333 561 | [2400:6180:100:d0::a02:2001]:8333 562 | [2400:6180:100:d0::a0f:9001]:8333 563 | [2400:6180:100:d0::a3d:b001]:8333 564 | [2400:6180:100:d0::a3f:1001]:8333 565 | [2400:6180:100:d0::a49:a001]:8333 566 | [2400:6180:100:d0::a56:d001]:8333 567 | [2400:6180:100:d0::a56:e001]:8333 568 | [2401:b140:1::100:210]:8333 569 | [2401:b140:1::100:220]:8333 570 | [2402:e280:3d17:945:1889:d3c6:8e85:d3c4]:8333 571 | [2403:6200:8821:2fdf:3903:a2b1:9f:c897]:8333 572 | [2406:3400:216:8b00:211:32ff:feca:336b]:8333 573 | [2406:da14:335:b600:eb14:5fd:2072:3653]:8333 574 | [2406:da1c:50b:cd00:3cae:1728:ecfc:4334]:8333 575 | [2406:da1c:50b:cd03:36d6:13fa:eba8:6543]:8333 576 | [2406:da1e:a4e:8a03:d90a:fbb0:23d3:ccb4]:8333 577 | [2407:3640:2107:1278::1]:8333 578 | [2407:7000:9f71:2d00:1c5a:5292:5108:c734]:8333 579 | [2408:8207:2655:fae0::10b]:8333 580 | [2408:8207:5456:d8d0::5c6]:8333 581 | [2409:250:60a0:2600:a971:1cdd:3d5b:654d]:8333 582 | [240d:1a:4b1:e700:19:d9ef:7f3:8e75]:8333 583 | [2600:1700:3948:82f:ce04:d382:5226:4cac]:8333 584 | [2600:1f16:a08:b900:4bfe:2f81:ae31:5f5]:8333 585 | [2600:1f1c:2d3:2401:6989:b1fd:d2a6:fbc8]:8333 586 | [2600:1f1e:2fe:3601:63a8:ebf6:83e4:1932]:8333 587 | [2600:2104:1003:c5ab:dc5e:90ff:fe18:1d08]:8333 588 | [2600:3c00::f03c:91ff:fe4b:c52]:8333 589 | [2600:3c00:e002:2e32::1:c8]:8333 590 | [2600:3c02::f03c:94ff:fecc:c99c]:8333 591 | [2600:6c4e:a00:cd0:428d:5cff:fe58:4884]:8333 592 | [2600:6c54:7100:1ad1:c92e:36d:651:bd18]:8333 593 | [2601:184:300:156c:ba4c:30:9da:6c06]:8333 594 | [2601:185:8302:12f0:1ab2:2840:9de4:1550]:8333 595 | [2603:3003:11b:e100:20c:29ff:fe38:bbc0]:8333 596 | [2603:3004:6a1:3800:851f:584d:7aba:affb]:8333 597 | [2603:3024:18ee:8000:20e:c4ff:fed1:ef15]:8333 598 | [2603:8080:1f07:6fdd:7de2:d969:78c9:b7ea]:8333 599 | [2604:4080:1036:80b1:50e1:43ff:fe0e:9df5]:8333 600 | [2605:6400:30:f220::]:8333 601 | [2605:6400:30:fd6f::4]:8333 602 | [2605:c000:2a0a:1::102]:8333 603 | [2606:6d00:100:5102:3d2:f06a:c2e8:a54]:8333 604 | [2607:5300:60:2e54::1]:8333 605 | [2607:5300:61:854::1]:8333 606 | [2607:9280:b:73b:250:56ff:fe14:25b5]:8333 607 | [2607:9280:b:73b:250:56ff:fe21:9c2f]:8333 608 | [2607:9280:b:73b:250:56ff:fe21:bf32]:8333 609 | [2607:9280:b:73b:250:56ff:fe33:4d1b]:8333 610 | [2607:9280:b:73b:250:56ff:fe3d:401]:8333 611 | [2620:a6:2000:1:1:0:d:3015]:8333 612 | [2620:a6:2000:1:2:0:3:266c]:8333 613 | [2620:a6:2000:1:2:0:9:930b]:8333 614 | [2620:a6:2000:1:2:0:b:3011]:8333 615 | [2800:150:11d:2426:62b:b164:704a:6962]:8333 616 | [2800:300:8251:b50::d]:8333 617 | [2800:300:8251:b50:e92:64f5:22af:c31e]:8333 618 | [2800:40:15:6ad:48e8:2200:a882:e08e]:8333 619 | [2803:5180:4100:4000::2]:8333 620 | [2803:9800:9447:84bb:cab8:d2f5:388c:9a57]:8333 621 | [2804:14d:7e33:83b0:6e41:1ccc:cf20:aff9]:8333 622 | [2804:431:e038:cd01:aaa1:59ff:fe0d:44b8]:8333 623 | [2804:d57:450d:f00:a422:9828:b00e:91e9]:8333 624 | [2806:2f0:5020:d287:4dcd:6204:909b:4125]:8333 625 | [2a00:1298:8001::6542]:8333 626 | [2a00:12e0:101:99:20c:29ff:fe29:d03f]:8333 627 | [2a00:1398:4:2a03:3eec:efff:fe05:d93e]:8333 628 | [2a00:1398:4:2a03::bc03]:8333 629 | [2a00:1768:2001:27::ef6a]:8333 630 | [2a00:1f40:5001:108:5d17:7703:b0f5:4133]:8333 631 | [2a00:23c5:fe80:7301:d6ae:52ff:fed5:56a5]:8333 632 | [2a00:23c6:5c8a:5c00:c05a:4dff:fe65:9d69]:8333 633 | [2a00:6020:4503:3700:5054:ff:fe90:640e]:8333 634 | [2a00:6020:b489:2000:5054:ff:fefc:5ed8]:8333 635 | [2a00:8a60:e012:a00::21]:8333 636 | [2a00:bbe0:0:221f::246]:8333 637 | [2a00:d520:9:9300:420b:544e:8019:6d3a]:8333 638 | [2a00:fd40:c:c::c]:8333 639 | [2a01:4f8:171:1f16::2]:8333 640 | [2a01:4f8:200:7222::2]:8333 641 | [2a01:4f8:202:4205::2]:8333 642 | [2a01:4f8:242:2016::2]:8333 643 | [2a01:4f8:261:420c::2]:8333 644 | [2a01:4f8:272:4cd9::2]:8333 645 | [2a01:4f9:1a:a966::2]:8333 646 | [2a01:4f9:1a:af0d::2]:8333 647 | [2a01:4f9:2b:29a::2]:8333 648 | [2a01:4f9:5a:44a5::2]:8333 649 | [2a01:7a7:2:2804:ae1f:6bff:fe9d:6c94]:8333 650 | [2a01:8740:1:753::e5cb]:8333 651 | [2a01:8740:1:ff2e::9428]:8333 652 | [2a01:8740:1:ffc5::8c6a]:8333 653 | [2a01:cb00:790:f500:110b:b446:2260:7d2c]:8333 654 | [2a01:cb10:336:cb00:61ac:d15d:4ac0:2cbd]:8333 655 | [2a01:cb10:336:cb00:d237:45ff:fec5:2cd0]:8333 656 | [2a01:cb15:804c:8000:21e:6ff:fe51:2c32]:8333 657 | [2a01:e0a:185:55f0:a0ba:9eaf:9853:92b7]:8333 658 | [2a01:e0a:301:7010:b87d:e14b:cea9:b998]:8333 659 | [2a01:e0a:3b3:1420:7ca0:3a9a:5cc3:b644]:8333 660 | [2a01:e0a:5:9390:bf35:4d41:8a2a:570]:8333 661 | [2a01:e0a:9e9:c240:8e3a:af64:4f0:8f79]:8333 662 | [2a01:e0a:b0f:37e0:a13f:e65:ac42:8e36]:8333 663 | [2a01:e0a:b5:7f50:c257:a55b:4846:97e1]:8333 664 | [2a01:e0a:bf6:8d70:20c:29ff:fe30:4fd2]:8333 665 | [2a01:e11:100c:70:39f3:e3c9:832f:37a]:8333 666 | [2a01:e34:ec1d:7100:8aae:ddff:fe02:4159]:8333 667 | [2a02:1210:7c92:5100:211:32ff:feae:152d]:8333 668 | [2a02:1210:86bf:f100:a9ac:d041:1f8e:6925]:8333 669 | [2a02:22a0:bbb3:dc10:50e1:57ff:fe70:9492]:8333 670 | [2a02:247a:215:3e00:1::1]:8333 671 | [2a02:2c60:f103:7c0:1a31:bfff:fecc:5d91]:8333 672 | [2a02:3102:4d5c:f000:dea6:32ff:febb:b9cb]:8333 673 | [2a02:3102:bc00:10e9:ca5:9dff:fea9:1cbb]:8333 674 | [2a02:390:9000:0:aaa1:59ff:fe43:b57b]:8333 675 | [2a02:768:f92b:db46:5e46:772b:71d:29b7]:8333 676 | [2a02:8070:f181:f600:bcb:2d1:d790:78ff]:8333 677 | [2a02:8071:6380:c500:7285:c2ff:feb5:a39c]:8333 678 | [2a02:8084:2021:73f3::66e6]:8333 679 | [2a02:8308:8188:5100:6d8b:4531:4331:eee2]:8333 680 | [2a02:8388:e302:7980:6f85:a0b3:4b4d:8b0f]:8333 681 | [2a02:8388:e5c3:4a80:201:2eff:fe82:b3cc]:8333 682 | [2a02:a31a:e03d:9400:3f18:2729:c86:d754]:8333 683 | [2a02:a45a:94cd:f00d::1]:8333 684 | [2a02:a465:80f4:1:f369:4ef5:aa12:7566]:8333 685 | [2a02:ab88:20b:ce00:223:24ff:fe56:6202]:8333 686 | [2a02:c206:2016:2394::1]:8333 687 | [2a02:c206:2162:5603::1]:8333 688 | [2a02:c206:2162:5605::1]:8333 689 | [2a02:c206:2162:5606::1]:8333 690 | [2a02:c206:2162:5856::1]:8333 691 | [2a02:c206:2162:7348::1]:8333 692 | [2a02:c206:2162:7352::1]:8333 693 | [2a02:c206:2162:8026::1]:8333 694 | [2a02:c207:2034:7358::1]:8333 695 | [2a02:c207:3006:3185::1]:8333 696 | [2a03:cfc0:8000:2a::9532:6507]:8333 697 | [2a03:cfc0:8000:2a::9532:6510]:8333 698 | [2a03:cfc0:8000:2a::9532:6511]:8333 699 | [2a03:cfc0:8000:2a::9532:6516]:8333 700 | [2a03:cfc0:8000:2a::9532:651d]:8333 701 | [2a03:cfc0:8000:2a::9532:6520]:8333 702 | [2a03:cfc0:8000:2a::9532:6522]:8333 703 | [2a03:cfc0:8000:2a::9532:6523]:8333 704 | [2a03:cfc0:8000:2a::9532:659a]:8333 705 | [2a03:cfc0:8000:2a::9532:659d]:8333 706 | [2a03:ec0:0:928::701:701]:8333 707 | [2a04:ee41:86:50b6:fa75:a4ff:fe3c:243f]:8333 708 | [2a05:d012:42a:5703:4dc5:8116:787c:e016]:8333 709 | [2a05:d014:a55:4001:f6ab:dd5e:4039:b46c]:8333 710 | [2a05:d018:a75:6c00:c05b:4d0a:3658:1030]:8333 711 | [2a07:9a07:3::2:1]:8333 712 | [2a07:d884::130e]:8333 713 | [2a0a:ef40:e44:9b01:2746:ca1e:6788:351c]:8333 714 | [2a0b:f4c0:c1:920e:b25a:daff:fe87:77b4]:8333 715 | [2a10:c941:100:24::2:1001]:8333 716 | [2a12:8e40:5668:f001::1]:8333 717 | [2a12:a302:1:a180::b5ca]:8333 718 | [2c0f:f4a8:b:b108:807d:b2d6:9146:38be]:8333 719 | [2c0f:f4a8:b:b108:c458:5c61:dcca:cb10]:8333 720 | ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333 721 | ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333 722 | yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333 723 | ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333 724 | ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333 725 | ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333 726 | ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333 727 | yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333 728 | yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333 729 | yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333 730 | ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333 731 | ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333 732 | ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333 733 | ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333 734 | ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333 735 | yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333 736 | yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333 737 | yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333 738 | yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333 739 | yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333 740 | yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333 741 | yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333 742 | yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333 743 | yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333 744 | yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333 745 | yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333 746 | yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333 747 | yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333 748 | yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333 749 | yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333 750 | yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333 751 | yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333 752 | yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333 753 | ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333 754 | ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333 755 | ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333 756 | yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333 757 | ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333 758 | ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333 759 | ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333 760 | yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333 761 | yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333 762 | yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333 763 | yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333 764 | yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333 765 | yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333 766 | yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333 767 | yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333 768 | yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333 769 | yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333 770 | yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333 771 | yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333 772 | yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333 773 | yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333 774 | yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333 775 | yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333 776 | yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333 777 | yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333 778 | yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333 779 | yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333 780 | yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333 781 | yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333 782 | yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333 783 | yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333 784 | yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333 785 | yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333 786 | yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333 787 | yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333 788 | yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333 789 | yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333 790 | yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333 791 | yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333 792 | yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333 793 | yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333 794 | ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333 795 | ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333 796 | ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333 797 | yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333 798 | ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333 799 | yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333 800 | yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333 801 | yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333 802 | yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333 803 | ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333 804 | ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333 805 | ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333 806 | yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333 807 | ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333 808 | ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333 809 | yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333 810 | ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333 811 | ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333 812 | ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333 813 | ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333 814 | ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333 815 | ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333 816 | ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333 817 | ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333 818 | ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333 819 | yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333 820 | yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333 821 | ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333 822 | ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333 823 | ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333 824 | ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333 825 | yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333 826 | yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333 827 | yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333 828 | yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333 829 | yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333 830 | yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333 831 | yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333 832 | yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333 833 | yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333 834 | yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333 835 | yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333 836 | ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333 837 | ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333 838 | ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333 839 | ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333 840 | ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333 841 | ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333 842 | ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333 843 | yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333 844 | yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333 845 | yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333 846 | yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333 847 | yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333 848 | yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333 849 | yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333 850 | yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333 851 | yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333 852 | yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333 853 | yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333 854 | yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333 855 | ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333 856 | yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333 857 | ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333 858 | ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333 859 | yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333 860 | yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333 861 | yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333 862 | ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333 863 | ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333 864 | ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333 865 | ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333 866 | ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333 867 | ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333 868 | ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333 869 | ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333 870 | yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333 871 | yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333 872 | yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333 873 | yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333 874 | yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333 875 | yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333 876 | yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333 877 | yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333 878 | yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333 879 | yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333 880 | yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333 881 | yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333 882 | yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333 883 | yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333 884 | yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333 885 | yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333 886 | ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333 887 | ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333 888 | ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333 889 | ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333 890 | ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333 891 | ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333 892 | ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333 893 | ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333 894 | yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333 895 | yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333 896 | yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333 897 | yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333 898 | yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333 899 | yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333 900 | yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333 901 | yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333 902 | yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333 903 | yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333 904 | yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333 905 | yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333 906 | yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333 907 | yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333 908 | yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333 909 | yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333 910 | yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333 911 | yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333 912 | yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333 913 | yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333 914 | yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333 915 | yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333 916 | yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333 917 | yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333 918 | yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333 919 | yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333 920 | yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333 921 | z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333 922 | z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333 923 | z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333 924 | z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333 925 | z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333 926 | z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333 927 | z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333 928 | z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333 929 | z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333 930 | z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333 931 | z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333 932 | z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333 933 | z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333 934 | z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333 935 | z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333 936 | z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333 937 | z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333 938 | z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333 939 | z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333 940 | z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333 941 | z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333 942 | z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333 943 | z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333 944 | z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333 945 | z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333 946 | z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333 947 | z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333 948 | z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333 949 | z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333 950 | z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333 951 | z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333 952 | z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333 953 | z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333 954 | z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333 955 | z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333 956 | z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333 957 | z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333 958 | z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333 959 | z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333 960 | z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333 961 | z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333 962 | z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333 963 | z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333 964 | z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333 965 | z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333 966 | z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333 967 | z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333 968 | z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333 969 | z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333 970 | z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333 971 | z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333 972 | z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333 973 | z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333 974 | z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333 975 | z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333 976 | z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333 977 | z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333 978 | z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333 979 | z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333 980 | z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333 981 | za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333 982 | zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333 983 | zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333 984 | zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333 985 | zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333 986 | zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333 987 | zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333 988 | zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333 989 | zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333 990 | zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333 991 | zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333 992 | zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333 993 | zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333 994 | zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333 995 | zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333 996 | zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333 997 | zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333 998 | zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333 999 | zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333 1000 | zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333 1001 | zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333 1002 | zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333 1003 | zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333 1004 | zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333 1005 | zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333 1006 | zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333 1007 | zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333 1008 | zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333 1009 | zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333 1010 | zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333 1011 | zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333 1012 | zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333 1013 | zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333 1014 | zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333 1015 | zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333 1016 | zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333 1017 | zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333 1018 | zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333 1019 | zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333 1020 | zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333 1021 | zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333 1022 | zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333 1023 | zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333 1024 | zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333 1025 | zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333 1026 | zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333 1027 | zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333 1028 | zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333 1029 | zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333 1030 | zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333 1031 | zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333 1032 | zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333 1033 | zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333 1034 | zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333 1035 | zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333 1036 | zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333 1037 | zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333 1038 | zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333 1039 | zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333 1040 | zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333 1041 | zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333 1042 | zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333 1043 | zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333 1044 | zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333 1045 | zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333 1046 | zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333 1047 | zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333 1048 | zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333 1049 | zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333 1050 | zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333 1051 | zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333 1052 | zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333 1053 | zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333 1054 | zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333 1055 | zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333 1056 | zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333 1057 | zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333 1058 | zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333 1059 | zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333 1060 | ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333 1061 | ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333 1062 | zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333 1063 | zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333 1064 | zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333 1065 | zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333 1066 | zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333 1067 | zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333 1068 | zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333 1069 | zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333 1070 | zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333 1071 | zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333 1072 | zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333 1073 | zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333 1074 | zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333 1075 | zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333 1076 | zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333 1077 | zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333 1078 | zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333 1079 | zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333 1080 | zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333 1081 | zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333 1082 | zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333 1083 | zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333 1084 | zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333 1085 | zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333 1086 | zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333 1087 | zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333 1088 | zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333 1089 | zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333 1090 | zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333 1091 | zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333 1092 | zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333 1093 | zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333 1094 | zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333 1095 | zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333 1096 | zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333 1097 | zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333 1098 | zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333 1099 | zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333 1100 | zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333 1101 | zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333 1102 | zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333 1103 | zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333 1104 | zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333 1105 | zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333 1106 | zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333 1107 | zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333 1108 | znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333 1109 | znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333 1110 | znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333 1111 | znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333 1112 | zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333 1113 | zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333 1114 | znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333 1115 | znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333 1116 | znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333 1117 | znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333 1118 | znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333 1119 | znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333 1120 | znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333 1121 | zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333 1122 | zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333 1123 | zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333 1124 | zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333 1125 | zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333 1126 | zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333 1127 | zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333 1128 | zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333 1129 | zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333 1130 | zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333 1131 | zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333 1132 | zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333 1133 | zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333 1134 | zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333 1135 | zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333 1136 | zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333 1137 | zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333 1138 | zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333 1139 | zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333 1140 | zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333 1141 | zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333 1142 | zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333 1143 | zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333 1144 | zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333 1145 | zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333 1146 | zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333 1147 | zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333 1148 | zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333 1149 | zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333 1150 | zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333 1151 | zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333 1152 | zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333 1153 | zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333 1154 | zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333 1155 | zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333 1156 | zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333 1157 | zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333 1158 | zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333 1159 | zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333 1160 | zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333 1161 | zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333 1162 | zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333 1163 | zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333 1164 | zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333 1165 | zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333 1166 | zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333 1167 | zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333 1168 | zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333 1169 | ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333 1170 | zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333 1171 | ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333 1172 | ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333 1173 | ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333 1174 | zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333 1175 | zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333 1176 | zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333 1177 | zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333 1178 | zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333 1179 | zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333 1180 | zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333 1181 | zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333 1182 | zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333 1183 | zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333 1184 | zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333 1185 | zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333 1186 | zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333 1187 | zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333 1188 | zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333 1189 | zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333 1190 | zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333 1191 | zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333 1192 | zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333 1193 | zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333 1194 | zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333 1195 | zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333 1196 | zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333 1197 | zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333 1198 | zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333 1199 | zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333 1200 | zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333 1201 | zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333 1202 | zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333 1203 | zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333 1204 | zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333 1205 | zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333 1206 | zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333 1207 | zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333 1208 | zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333 1209 | zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333 1210 | zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333 1211 | zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333 1212 | zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333 1213 | zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333 1214 | zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333 1215 | zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333 1216 | zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333 1217 | zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333 1218 | zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333 1219 | zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333 1220 | zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333 1221 | zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333 1222 | zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333 1223 | zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333 1224 | zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333 1225 | zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333 1226 | zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333 1227 | zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333 1228 | zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333 1229 | zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333 1230 | zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333 1231 | zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333 1232 | 1233 | --------------------------------------------------------------------------------