diff --git a/Sources/ElixxirDAppsSDK/Fact.swift b/Sources/ElixxirDAppsSDK/Fact.swift
new file mode 100644
index 0000000000000000000000000000000000000000..ecf0e64de5565c4fb58ee367b2ca77fd72167189
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/Fact.swift
@@ -0,0 +1,39 @@
+import Foundation
+
+public struct Fact: Equatable {
+  public init(
+    fact: String,
+    type: Int
+  ) {
+    self.fact = fact
+    self.type = type
+  }
+
+  public var fact: String
+  public var type: Int
+}
+
+extension Fact: Codable {
+  enum CodingKeys: String, CodingKey {
+    case fact = "Fact"
+    case type = "Type"
+  }
+
+  static func decode(_ data: Data) throws -> Fact {
+    try JSONDecoder().decode(Self.self, from: data)
+  }
+
+  func encode() throws -> Data {
+    try JSONEncoder().encode(self)
+  }
+}
+
+extension Array where Element == Fact {
+  static func decode(_ data: Data) throws -> [Fact] {
+    try JSONDecoder().decode(Self.self, from: data)
+  }
+
+  func encode() throws -> Data {
+    try JSONEncoder().encode(self)
+  }
+}
diff --git a/Sources/ElixxirDAppsSDK/GetFactsFromContact.swift b/Sources/ElixxirDAppsSDK/GetFactsFromContact.swift
new file mode 100644
index 0000000000000000000000000000000000000000..697f799741f21feec1aba79346d6d842b7cc2338
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/GetFactsFromContact.swift
@@ -0,0 +1,30 @@
+import Bindings
+import XCTestDynamicOverlay
+
+public struct GetFactsFromContact {
+  public var run: (Data) throws -> [Fact]
+
+  public func callAsFunction(contact: Data) throws -> [Fact] {
+    try run(contact)
+  }
+}
+
+extension GetFactsFromContact {
+  public static let live = GetFactsFromContact { contact in
+    var error: NSError?
+    let data = BindingsGetFactsFromContact(contact, &error)
+    if let error = error {
+      throw error
+    }
+    guard let data = data else {
+      fatalError("BindingsGetFactsFromContact returned `nil` without providing error")
+    }
+    return try [Fact].decode(data)
+  }
+}
+
+extension GetFactsFromContact {
+  public static let unimplemented = GetFactsFromContact(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/ElixxirDAppsSDK/Legacy/ContactFactsProvider.swift b/Sources/ElixxirDAppsSDK/Legacy/ContactFactsProvider.swift
deleted file mode 100644
index 2029dc6f306aa74ef1fd48da93ed5038723e5e7b..0000000000000000000000000000000000000000
--- a/Sources/ElixxirDAppsSDK/Legacy/ContactFactsProvider.swift
+++ /dev/null
@@ -1,34 +0,0 @@
-import Bindings
-
-public struct ContactFactsProvider {
-  public var get: (Data) throws -> [Fact]
-
-  public func callAsFunction(contact: Data) throws -> [Fact] {
-    try get(contact)
-  }
-}
-
-extension ContactFactsProvider {
-  public static let live = ContactFactsProvider { contact in
-    var error: NSError?
-    let factsData = BindingsGetFactsFromContact(contact, &error)
-    if let error = error {
-      throw error
-    }
-    guard let factsData = factsData else {
-      fatalError("BindingsGetFactsFromContact returned `nil` without providing error")
-    }
-    let decoder = JSONDecoder()
-    let facts = try decoder.decode([Fact].self, from: factsData)
-    return facts
-  }
-}
-
-#if DEBUG
-extension ContactFactsProvider {
-  public static let failing = ContactFactsProvider { _ in
-    struct NotImplemented: Error {}
-    throw NotImplemented()
-  }
-}
-#endif
diff --git a/Sources/ElixxirDAppsSDK/Legacy/Fact.swift b/Sources/ElixxirDAppsSDK/Legacy/Fact.swift
deleted file mode 100644
index fa4a277b64bdbfedd773167da10d29dc4bf0d379..0000000000000000000000000000000000000000
--- a/Sources/ElixxirDAppsSDK/Legacy/Fact.swift
+++ /dev/null
@@ -1,19 +0,0 @@
-public struct Fact: Equatable {
-  public init(
-    fact: String,
-    type: Int
-  ) {
-    self.fact = fact
-    self.type = type
-  }
-
-  public var fact: String
-  public var type: Int
-}
-
-extension Fact: Codable {
-  enum CodingKeys: String, CodingKey {
-    case fact = "Fact"
-    case type = "Type"
-  }
-}