diff --git a/eclair-wire/pom.xml b/eclair-wire/pom.xml
new file mode 100644
index 000000000..46f53acc7
--- /dev/null
+++ b/eclair-wire/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ fr.acinq.eclair
+ eclair_2.11
+ 0.2-SNAPSHOT
+
+
+ eclair-wire_2.11
+ jar
+
+ ${project.artifactId}
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ generate-sources
+
+ add-source
+
+
+
+ ${project.build.directory}/generated-sources/scala
+
+
+
+
+
+
+
+
+
+
+ org.scodec
+ scodec-core_${scala.version.short}
+
+
+
+
diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala
new file mode 100644
index 000000000..880831223
--- /dev/null
+++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Packet.scala
@@ -0,0 +1,21 @@
+package fr.acinq.eclair.wire
+
+import fr.acinq.eclair.wire.PacketType._
+import scodec.Codec
+import scodec.codecs._
+
+/**
+ * Created by PM on 17/10/2016.
+ */
+object Packet {
+ implicit val codec: Codec[Packet] = {
+ ("packet_type" | Codec[PacketType]) ::
+ (("data_length" | uint16) >>:~ { length =>
+ ("data" | vectorOfN(provide(length), uint8)).hlist
+ })
+ }.as[Packet]
+}
+
+case class Packet(packetType: PacketType, dataLength: Int, data: Vector[Int]) {
+ require(dataLength == data.length)
+}
\ No newline at end of file
diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala
new file mode 100644
index 000000000..d8d30cc5f
--- /dev/null
+++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/PacketType.scala
@@ -0,0 +1,36 @@
+package fr.acinq.eclair.wire
+
+import scodec.bits.BitVector
+import scodec.{Attempt, Codec, DecodeResult, Err, SizeBound}
+import scodec.codecs._
+
+/**
+ * Created by PM on 17/10/2016.
+ */
+object PacketType extends Enumeration {
+ type PacketType = Value
+ val ADD = Value(0)
+ val FAIL = Value(1)
+ val FULFILL = Value(2)
+
+ implicit val commandTypeCodec: Codec[PacketType] =
+ mappedEnum(uint(2), PacketType.values.map(v => (v, v.id)).toMap)
+}
+
+import fr.acinq.eclair.wire.PacketType._
+
+class PacketTypeCodec() extends Codec[PacketType] {
+ override def sizeBound = SizeBound.exact(1)
+
+ override def encode(a: PacketType) = Attempt.successful(BitVector.empty)
+
+ override def decode(buffer: BitVector) =
+ buffer.acquire(1) match {
+ case Left(e) => Attempt.failure(Err.insufficientBits(1, buffer.size))
+ case Right(b) if b(0) == 0 => Attempt.successful(DecodeResult(ADD, buffer))
+ case Right(b) if b(0) == 1 => Attempt.successful(DecodeResult(FAIL, buffer))
+ case Right(b) if b(0) == 2 => Attempt.successful(DecodeResult(FULFILL, buffer))
+ }
+
+ override def toString = s"PacketTypeCodec"
+}
diff --git a/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala
new file mode 100644
index 000000000..71b784f71
--- /dev/null
+++ b/eclair-wire/src/main/scala/fr/acinq/eclair/wire/Test.scala
@@ -0,0 +1,14 @@
+package fr.acinq.eclair.wire
+
+import scodec.Codec
+import scodec.bits._
+
+/**
+ * Created by PM on 17/10/2016.
+ */
+object Test extends App {
+ val bin = hex"0x00010000000000".bits
+ println(Codec[Packet].decode(bin))
+}
+
+
diff --git a/pom.xml b/pom.xml
index fea47abce..f956c6ba6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,6 +8,7 @@
pom
+ eclair-wire
lightning-types
eclair-node
@@ -160,6 +161,11 @@
+
+ org.scodec
+ scodec-core_${scala.version.short}
+ 1.10.2
+
fr.acinq
bitcoin-lib_${scala.version.short}