PR changes
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
index bc8920b..9a0fcc0 100644
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
+++ b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
@@ -16,6 +16,21 @@
  */
 package org.apache.tuweni.devp2p.v5
 
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.apache.tuweni.bytes.Bytes
+import org.apache.tuweni.crypto.SECP256K1
+import org.apache.tuweni.devp2p.EthereumNodeRecord
+import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
+import org.apache.tuweni.devp2p.v5.packet.RandomMessage
+import org.apache.tuweni.io.Base64URLSafe
+import java.net.InetSocketAddress
+import java.time.Instant
+import kotlin.coroutines.CoroutineContext
+
 /**
  * Service executes network discovery, according to discv5 specification
  * (https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md)
@@ -31,4 +46,54 @@
    * Executes service shut down
    */
   fun terminate(await: Boolean = false)
+
+}
+
+internal class DefaultNodeDiscoveryService(
+  private val keyPair: SECP256K1.KeyPair,
+  private val localPort: Int,
+  private val bindAddress: InetSocketAddress = InetSocketAddress(localPort),
+  private val bootstrapENRList: List<String> = emptyList(),
+  private val enrSeq: Long = Instant.now().toEpochMilli(),
+  private val selfENR: Bytes = EthereumNodeRecord.toRLP(
+    keyPair,
+    enrSeq,
+    emptyMap(),
+    bindAddress.address,
+    null,
+    bindAddress.port
+  ),
+  private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR),
+  override val coroutineContext: CoroutineContext = Dispatchers.Default
+) : NodeDiscoveryService, CoroutineScope {
+
+  override fun start() {
+    connector.start()
+    launch { bootstrap() }
+  }
+
+  override fun terminate(await: Boolean) {
+    runBlocking {
+      val job = async { connector.terminate() }
+      if (await) {
+        job.await()
+      }
+    }
+  }
+
+  private fun bootstrap() {
+    bootstrapENRList.forEach {
+      if (it.startsWith("enr:")) {
+        val encodedEnr = it.substringAfter("enr:")
+        val rlpENR = Base64URLSafe.decode(encodedEnr)
+        val enr = EthereumNodeRecord.fromRLP(rlpENR)
+
+        val randomMessage = RandomMessage()
+        val address = InetSocketAddress(enr.ip(), enr.udp())
+
+        connector.addPendingNodeId(address, rlpENR)
+        connector.send(address, randomMessage, rlpENR)
+      }
+    }
+  }
 }
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
index 48c359d..bb3eaee 100644
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
+++ b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
@@ -61,11 +61,11 @@
 
     cipher.updateAAD(data)
 
-    val encriptedText = Bytes.wrap(cipher.doFinal(message))
+    val encryptedText = Bytes.wrap(cipher.doFinal(message))
 
     val wrappedNonce = Bytes.wrap(nonce)
     val nonceSize = Bytes.ofUnsignedInt(nonce.size.toLong())
-    return Bytes.wrap(nonceSize, wrappedNonce, encriptedText).toArray()
+    return Bytes.wrap(nonceSize, wrappedNonce, encryptedText).toArray()
   }
 
   /**
@@ -92,8 +92,8 @@
     val nonceLength = buffer.int
     val nonce = ByteArray(nonceLength)
     buffer.get(nonce)
-    val encriptedText = ByteArray(buffer.remaining())
-    buffer.get(encriptedText)
+    val encryptedText = ByteArray(buffer.remaining())
+    buffer.get(encryptedText)
 
     val keySpec = SecretKeySpec(key, ALGO_NAME)
 
@@ -103,6 +103,6 @@
 
     cipher.updateAAD(data)
 
-    return cipher.doFinal(encriptedText)
+    return cipher.doFinal(encryptedText)
   }
 }
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt
deleted file mode 100644
index 8575452..0000000
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tuweni.devp2p.v5.internal
-
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.apache.tuweni.bytes.Bytes
-import org.apache.tuweni.crypto.SECP256K1
-import org.apache.tuweni.devp2p.EthereumNodeRecord
-import org.apache.tuweni.devp2p.v5.NodeDiscoveryService
-import org.apache.tuweni.devp2p.v5.UdpConnector
-import org.apache.tuweni.devp2p.v5.packet.RandomMessage
-import org.apache.tuweni.io.Base64URLSafe
-import java.net.InetSocketAddress
-import java.time.Instant
-import kotlin.coroutines.CoroutineContext
-
-class DefaultNodeDiscoveryService(
-  private val keyPair: SECP256K1.KeyPair,
-  private val localPort: Int,
-  private val bindAddress: InetSocketAddress = InetSocketAddress(localPort),
-  private val bootstrapENRList: List<String> = emptyList(),
-  private val enrSeq: Long = Instant.now().toEpochMilli(),
-  private val selfENR: Bytes = EthereumNodeRecord.toRLP(
-    keyPair,
-    enrSeq,
-    emptyMap(),
-    bindAddress.address,
-    null,
-    bindAddress.port
-  ),
-  private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR),
-  override val coroutineContext: CoroutineContext = Dispatchers.Default
-) : NodeDiscoveryService, CoroutineScope {
-
-  override fun start() {
-    connector.start()
-    launch { bootstrap() }
-  }
-
-  override fun terminate(await: Boolean) {
-    runBlocking {
-      val job = async { connector.terminate() }
-      if (await) {
-        job.await()
-      }
-    }
-  }
-
-  private fun bootstrap() {
-    bootstrapENRList.forEach {
-      if (it.startsWith("enr:")) {
-        val encodedEnr = it.substringAfter("enr:")
-        val rlpENR = Base64URLSafe.decode(encodedEnr)
-        val enr = EthereumNodeRecord.fromRLP(rlpENR)
-
-        val randomMessage = RandomMessage()
-        val address = InetSocketAddress(enr.ip(), enr.udp())
-
-        connector.addPendingNodeId(address, rlpENR)
-        connector.send(address, randomMessage, rlpENR)
-      }
-    }
-  }
-}
diff --git a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
similarity index 89%
rename from devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt
rename to devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
index 895db0b..a9f64e5 100644
--- a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt
+++ b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
@@ -14,14 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tuweni.devp2p.v5.internal
+package org.apache.tuweni.devp2p.v5
 
 import kotlinx.coroutines.runBlocking
 import org.apache.tuweni.bytes.Bytes
 import org.apache.tuweni.crypto.SECP256K1
 import org.apache.tuweni.devp2p.EthereumNodeRecord
-import org.apache.tuweni.devp2p.v5.NodeDiscoveryService
-import org.apache.tuweni.devp2p.v5.UdpConnector
+import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
 import org.apache.tuweni.devp2p.v5.packet.RandomMessage
 import org.apache.tuweni.devp2p.v5.packet.UdpMessage
 import org.apache.tuweni.io.Base64URLSafe
@@ -41,7 +40,6 @@
   private val recipientEnr: Bytes =
     EthereumNodeRecord.toRLP(recipientKeyPair, ip = InetAddress.getLocalHost(), udp = 9091)
   private val encodedEnr: String = "enr:${Base64URLSafe.encode(recipientEnr)}"
-
   private val keyPair: SECP256K1.KeyPair = SECP256K1.KeyPair.random()
   private val localPort: Int = 9090
   private val bindAddress: InetSocketAddress = InetSocketAddress(localPort)
@@ -55,10 +53,19 @@
     null,
     bindAddress.port
   )
-  private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR)
+  private val connector: UdpConnector =
+    DefaultUdpConnector(bindAddress, keyPair, selfENR)
 
   private val nodeDiscoveryService: NodeDiscoveryService =
-    DefaultNodeDiscoveryService(keyPair, localPort, bindAddress, bootstrapENRList, enrSeq, selfENR, connector)
+    DefaultNodeDiscoveryService(
+      keyPair,
+      localPort,
+      bindAddress,
+      bootstrapENRList,
+      enrSeq,
+      selfENR,
+      connector
+    )
 
   @Test
   fun startInitializesConnectorAndBootstraps() {
diff --git a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
index ebbad34..46b0d47 100644
--- a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
+++ b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
@@ -22,7 +22,6 @@
 import org.apache.tuweni.crypto.SECP256K1
 import org.apache.tuweni.devp2p.EthereumNodeRecord
 import org.apache.tuweni.devp2p.v5.internal.DefaultAuthenticationProvider
-import org.apache.tuweni.devp2p.v5.internal.DefaultNodeDiscoveryService
 import org.apache.tuweni.devp2p.v5.internal.DefaultPacketCodec
 import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
 import org.apache.tuweni.devp2p.v5.packet.FindNodeMessage