diff --git a/Sources/ElixxirDAppsSDK/Channel/Channel.swift b/Sources/ElixxirDAppsSDK/Channel/Channel.swift
new file mode 100644
index 0000000000000000000000000000000000000000..532a04edc33bc471bac5a7697aa021b2f6725eb1
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Channel.swift
@@ -0,0 +1,37 @@
+import Bindings
+
+public struct Channel {
+  public var broadcast: ChannelBroadcast
+  public var broadcastAsymmetric: ChannelBroadcastAsymmetric
+  public var get: ChannelGet
+  public var listen: ChannelListen
+  public var maxAsymmetricPayloadSize: ChannelMaxAsymmetricPayloadSize
+  public var maxPayloadSize: ChannelMaxPayloadSize
+  public var stop: ChannelStop
+}
+
+extension Channel {
+  public static func live(_ bindingsChannel: BindingsChannel) -> Channel {
+    Channel(
+      broadcast: .live(bindingsChannel),
+      broadcastAsymmetric: .live(bindingsChannel),
+      get: .live(bindingsChannel),
+      listen: .live(bindingsChannel),
+      maxAsymmetricPayloadSize: .live(bindingsChannel),
+      maxPayloadSize: .live(bindingsChannel),
+      stop: .live(bindingsChannel)
+    )
+  }
+}
+
+extension Channel {
+  public static let unimplemented = Channel(
+    broadcast: .unimplemented,
+    broadcastAsymmetric: .unimplemented,
+    get: .unimplemented,
+    listen: .unimplemented,
+    maxAsymmetricPayloadSize: .unimplemented,
+    maxPayloadSize: .unimplemented,
+    stop: .unimplemented
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcast.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcast.swift
new file mode 100644
index 0000000000000000000000000000000000000000..ee9a3adf8b5f4cf6e745a9f103715663165279bd
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcast.swift
@@ -0,0 +1,22 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelBroadcast {
+  public var run: (Data) throws -> Data
+
+  public func callAsFunction(_ payload: Data) throws -> Data {
+    try run(payload)
+  }
+}
+
+extension ChannelBroadcast {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelBroadcast {
+    ChannelBroadcast(run: bindingsChannel.broadcast)
+  }
+}
+
+extension ChannelBroadcast {
+  public static let unimplemented = ChannelBroadcast(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcastAsymmetric.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcastAsymmetric.swift
new file mode 100644
index 0000000000000000000000000000000000000000..9d92e00297cc99ce2b0b195180994cb0aa8666d0
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelBroadcastAsymmetric.swift
@@ -0,0 +1,25 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelBroadcastAsymmetric {
+  public var run: (Data, Data) throws -> Data
+
+  public func callAsFunction(
+    payload: Data,
+    privateKey: Data
+  ) throws -> Data {
+    try run(payload, privateKey)
+  }
+}
+
+extension ChannelBroadcastAsymmetric {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelBroadcastAsymmetric {
+    ChannelBroadcastAsymmetric(run: bindingsChannel.broadcastAsymmetric(_:pk:))
+  }
+}
+
+extension ChannelBroadcastAsymmetric {
+  public static let unimplemented = ChannelBroadcastAsymmetric(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelGet.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelGet.swift
new file mode 100644
index 0000000000000000000000000000000000000000..7c27a3dca1b537f9a6bc0ef322d89b65c46ad412
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelGet.swift
@@ -0,0 +1,24 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelGet {
+  public var run: () throws -> ChannelDef
+
+  public func callAsFunction() throws -> ChannelDef {
+    try run()
+  }
+}
+
+extension ChannelGet {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelGet {
+    ChannelGet {
+      try ChannelDef.decode(bindingsChannel.get())
+    }
+  }
+}
+
+extension ChannelGet {
+  public static let unimplemented = ChannelGet(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelListen.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelListen.swift
new file mode 100644
index 0000000000000000000000000000000000000000..65fc1089f9076c57ab2fae004ce0fdab79cd80d8
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelListen.swift
@@ -0,0 +1,30 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelListen {
+  public var run: (Int, BroadcastListener) throws -> Void
+
+  public func callAsFunction(
+    method: Int,
+    callback: BroadcastListener
+  ) throws {
+    try run(method, callback)
+  }
+}
+
+extension ChannelListen {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelListen {
+    ChannelListen { method, callback in
+      try bindingsChannel.listen(
+        callback.makeBindingsBroadcastListener(),
+        method: method
+      )
+    }
+  }
+}
+
+extension ChannelListen {
+  public static let unimplemented = ChannelListen(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxAsymmetricPayloadSize.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxAsymmetricPayloadSize.swift
new file mode 100644
index 0000000000000000000000000000000000000000..6b315b0f695f241d56b044822764b1266f5fd90d
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxAsymmetricPayloadSize.swift
@@ -0,0 +1,22 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelMaxAsymmetricPayloadSize {
+  public var run: () -> Int
+
+  public func callAsFunction() -> Int {
+    run()
+  }
+}
+
+extension ChannelMaxAsymmetricPayloadSize {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelMaxAsymmetricPayloadSize {
+    ChannelMaxAsymmetricPayloadSize(run: bindingsChannel.maxAsymmetricPayloadSize)
+  }
+}
+
+extension ChannelMaxAsymmetricPayloadSize {
+  public static let unimplemented = ChannelMaxAsymmetricPayloadSize(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxPayloadSize.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxPayloadSize.swift
new file mode 100644
index 0000000000000000000000000000000000000000..b6ef89f873eb4d7667487e2242151b3f3cdf1b21
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelMaxPayloadSize.swift
@@ -0,0 +1,22 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelMaxPayloadSize {
+  public var run: () -> Int
+
+  public func callAsFunction() -> Int {
+    run()
+  }
+}
+
+extension ChannelMaxPayloadSize {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelMaxPayloadSize {
+    ChannelMaxPayloadSize(run: bindingsChannel.maxPayloadSize)
+  }
+}
+
+extension ChannelMaxPayloadSize {
+  public static let unimplemented = ChannelMaxPayloadSize(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelStop.swift b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelStop.swift
new file mode 100644
index 0000000000000000000000000000000000000000..faddcb18be457355ec685e30fb3cb5ac937c1bed
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Channel/Functors/ChannelStop.swift
@@ -0,0 +1,22 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct ChannelStop {
+  public var run: () -> Void
+
+  public func callAsFunction() {
+    run()
+  }
+}
+
+extension ChannelStop {
+  public static func live(_ bindingsChannel: BindingsChannel) -> ChannelStop {
+    ChannelStop(run: bindingsChannel.stop)
+  }
+}
+
+extension ChannelStop {
+  public static let unimplemented = ChannelStop(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}