Skip to content

fix(swift-sdk): use platform-wallet-ffi headers instead of hardcoded function signatures#3500

Merged
QuantumExplorer merged 1 commit intov3.1-devfrom
chore/using-platform-ffi-header
Apr 16, 2026
Merged

fix(swift-sdk): use platform-wallet-ffi headers instead of hardcoded function signatures#3500
QuantumExplorer merged 1 commit intov3.1-devfrom
chore/using-platform-ffi-header

Conversation

@ZocoLini
Copy link
Copy Markdown
Collaborator

@ZocoLini ZocoLini commented Apr 16, 2026

Okay, rs-platform-wallet-ffi was exporting symbols and creating a header, but this headers was not being used, we were using hardcoded (and outdated) symbols written directly in the swift code, to be more specific, in the 'PlatformWalletFFI.swift' and 'PlatformWalletTypes.swift', and rs-sdk-ffi was re-exporting the platform-wallet-ffi symbols.

So, this is what I did:

  • Removed the platform_wallet_ffi.h and made cbindgen generate a new one in the <RUST_OUT>/include directory I am using for all headers in the rs-unified-sdk
  • Removed the hardcoded symbols in the swift code and updated everything to use the real symbols exported by the platform-wallet-ffi library and defined in the header by cbindgen
  • Using FFINetwork enum defined in key-wallet-ffi wrapping dashcore::Network type instead of using dashcore::Network in the platform-wallet-ffi exported functions, that way we avoid using a Rust enum in swift, and we use a C compatible one
  • rs-sdk-ffi no longer re-exports platform-wallet-ffi symbols
  • rs-unified-sdk now re-exports platform-wallet-ffi symbols
  • updated build_ios.sh to correctly add the new header for swift to use

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have added "!" to the title and described breaking changes in the corresponding section if my code contains any
  • I have made corresponding changes to the documentation if needed

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

Summary by CodeRabbit

  • Breaking Changes

    • Network parameter added to PlatformWallet.fromSeed() and PlatformWallet.fromMnemonic() methods
    • BlockTime type renamed to PlatformBlockTime with updated field types
    • Contact request API methods updated to use ContactRequest objects instead of individual parameters
    • Identity manager block time methods now use PlatformBlockTime
  • Updates

    • Platform wallet network enum updated with new cases

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 16, 2026

📝 Walkthrough

Walkthrough

This PR refactors the Platform Wallet FFI architecture by migrating from manual C header definitions to automated generation via cbindgen, reorganizing FFI dependencies, updating network type handling from Network to FFINetwork, and removing platform wallet exports from the main SDK FFI in favor of direct integration through the unified SDK.

Changes

Cohort / File(s) Summary
Rust FFI Build Infrastructure
packages/rs-platform-wallet-ffi/build.rs, packages/rs-platform-wallet-ffi/Cargo.toml
Added cbindgen build script for automated C header generation. Added cbindgen dependency and configured key-wallet-ffi (replacing key-wallet). Removed dashcore dependency.
Rust FFI Configuration
packages/rs-platform-wallet-ffi/cbindgen.toml
Updated to include dependency header key-wallet-ffi/key-wallet-ffi.h. Removed export rename mappings for Handle, PlatformWalletFFIError, and PlatformWalletFFIResult.
Rust FFI Type Updates
packages/rs-platform-wallet-ffi/src/platform_wallet_info.rs, packages/rs-platform-wallet-ffi/src/types.rs
Updated function signatures to accept FFINetwork instead of Network. Removed Network re-export from types module.
Rust FFI Header Removal
packages/rs-platform-wallet-ffi/platform_wallet_ffi.h
Deleted manually-maintained C header file (670 lines). Now generated automatically by cbindgen.
Rust FFI Tests
packages/rs-platform-wallet-ffi/tests/integration_tests.rs
Updated to use key_wallet_ffi::FFINetwork::Testnet instead of platform_wallet_ffi::Network::Testnet.
SDK FFI Decoupling
packages/rs-sdk-ffi/Cargo.toml, packages/rs-sdk-ffi/src/lib.rs, packages/rs-sdk-ffi/src/platform_wallet_types.rs
Removed platform-wallet-ffi dependency and all associated re-exports. Deleted platform_wallet_types module and cleaned up selective re-exports.
Unified SDK Integration
packages/rs-unified-sdk-ffi/Cargo.toml, packages/rs-unified-sdk-ffi/src/lib.rs
Added platform-wallet-ffi as direct dependency. Added public re-export of platform_wallet_ffi.
Swift API Refactoring
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift, packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/ManagedIdentity.swift, packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/ContactRequest.swift, packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/DashPayService.swift
Updated PlatformWallet creation methods to accept network parameter. Refactored contact request APIs to use object-oriented model (ContactRequest object) instead of individual parameters. Updated block time handling (BlockTime → PlatformBlockTime with height as UInt64).
Swift FFI Type Consolidation
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletTypes.swift
Removed locally-defined FFI types. Updated error result mapping. Replaced BlockTime with PlatformBlockTime. Changed PlatformNetwork cases from devnet/local to regtest/devnet. Updated network FFI value type from UInt32 to FFINetwork.
Swift Utility Updates
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/IdentityManager.swift, packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/EstablishedContact.swift
Explicit return value discarding in destructors. Simplified FFI type conversions and loop indexing.
Swift FFI Binding Removal
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletFFI.swift
Deleted entire FFI binding declarations file (403 lines). Bindings now provided through cbindgen-generated headers.
Build Configuration
packages/swift-sdk/build_ios.sh
Updated umbrella header to include platform-wallet-ffi/platform-wallet-ffi.h in DashSDKFFI module.

Sequence Diagram(s)

The changes do not meet the criteria for sequence diagram generation. While they introduce significant refactoring and architectural reorganization, the modifications are primarily build infrastructure updates, dependency restructuring, type system changes, and API signature updates rather than new feature flows or substantial control flow alterations. The contact request refactoring (from parameters to object model) is primarily a structural API change without new multi-component interactions.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~35 minutes

Poem

🐰 With cbindgen's magic, headers now bloom,
No more manual C files filling the room!
Swift types refined, the network now flows,
Platform Wallet stands tall as the refactor goes.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix(swift-sdk): use platform-wallet-ffi headers instead of hardcoded function signatures' clearly summarizes the main change: replacing hardcoded FFI function signatures with actual platform-wallet-ffi headers.
Docstring Coverage ✅ Passed Docstring coverage is 94.44% which is sufficient. The required threshold is 80.00%.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/using-platform-ffi-header

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions bot added this to the v3.1.0 milestone Apr 16, 2026
@ZocoLini ZocoLini force-pushed the chore/using-platform-ffi-header branch from 2f85d31 to 5e1b90d Compare April 16, 2026 18:17
@ZocoLini ZocoLini changed the title use platform-wallet-ffi headers instead of hardcoded function signatures fix(swift-sdk): use platform-wallet-ffi headers instead of hardcoded function signatures Apr 16, 2026
@ZocoLini ZocoLini marked this pull request as ready for review April 16, 2026 18:27
@thepastaclaw
Copy link
Copy Markdown
Collaborator

thepastaclaw commented Apr 16, 2026

⏳ Review in progress (commit 5e1b90d)

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 16, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 84.84%. Comparing base (85a7117) to head (5e1b90d).
⚠️ Report is 1 commits behind head on v3.1-dev.

Additional details and impacted files
@@            Coverage Diff             @@
##           v3.1-dev    #3500    +/-   ##
==========================================
  Coverage     84.83%   84.84%            
==========================================
  Files          2476     2476            
  Lines        267733   267915   +182     
==========================================
+ Hits         227123   227302   +179     
- Misses        40610    40613     +3     
Components Coverage Δ
dpp 82.00% <ø> (+<0.01%) ⬆️
drive 84.21% <ø> (ø)
drive-abci 87.48% <ø> (+0.02%) ⬆️
sdk ∅ <ø> (∅)
dapi-client ∅ <ø> (∅)
platform-version ∅ <ø> (∅)
platform-value 92.10% <ø> (ø)
platform-wallet ∅ <ø> (∅)
drive-proof-verifier 55.66% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletTypes.swift (1)

94-111: ⚠️ Potential issue | 🟠 Major

Add a public initializer for PlatformBlockTime.

ManagedIdentity.setLastUpdatedBalanceBlockTime(_:) is public, but this type currently has only internal initializers. SDK consumers can receive a PlatformBlockTime from getters, but they cannot construct one to call the setter.

Suggested fix
 public struct PlatformBlockTime {
     public let height: UInt64
     public let coreHeight: UInt32
     public let timestamp: UInt64

+    public init(height: UInt64, coreHeight: UInt32, timestamp: UInt64) {
+        self.height = height
+        self.coreHeight = coreHeight
+        self.timestamp = timestamp
+    }
+
     init(ffi: BlockTime) {
         self.height = ffi.height
         self.coreHeight = ffi.core_height
         self.timestamp = ffi.timestamp
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletTypes.swift`
around lines 94 - 111, The PlatformBlockTime struct lacks a public initializer,
preventing SDK consumers from constructing instances to call public methods like
ManagedIdentity.setLastUpdatedBalanceBlockTime(_:). Add a public initializer
such as public init(height: UInt64, coreHeight: UInt32, timestamp: UInt64) to
PlatformBlockTime so callers can create instances; also consider making the
existing init(ffi: BlockTime) public if external code needs to construct from
FFI values (refer to PlatformBlockTime, init(ffi:), and ffiValue).
🧹 Nitpick comments (1)
packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift (1)

80-84: The network argument is only a cache key now.

These FFI calls no longer take a network, but this wrapper still exposes for network: and stores managers in [PlatformNetwork: IdentityManager]. That lets one wallet cache separate Swift managers under arbitrary networks even though the underlying wallet is already bound to a single network.

Consider collapsing this to one cached manager, or storing the wallet's creation network and rejecting mismatched requests.

Also applies to: 99-103

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift`
around lines 80 - 84, The wrapper currently exposes and caches IdentityManager
per PlatformNetwork even though the underlying FFI call
platform_wallet_info_get_identity_manager is network-agnostic; update
PlatformWallet to either (A) collapse to a single cached IdentityManager (e.g.,
replace the [PlatformNetwork: IdentityManager] store with a single optional
IdentityManager property and remove the network parameter from the getter), or
(B) record the wallet's creation network when the wallet is constructed and in
the getter validate that the requested network matches that stored network,
returning an error on mismatch; make changes around the methods/fields that
reference PlatformNetwork and IdentityManager and the call site that invokes
platform_wallet_info_get_identity_manager to ensure only one manager is cached
or mismatches are rejected.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/DashPayService.swift`:
- Around line 137-148: The code currently hardcodes senderKeyIndex and
recipientKeyIndex to 0 when constructing ContactRequest via
ContactRequest.create after calling identity.getId(); instead, derive the
correct key indices: obtain the sender key index from the identity (e.g., via
the identity's key management API or a method on the identity object) and look
up the recipient's key index from the recipient/contact store or contact
metadata before building the request, then pass those derived indices into
ContactRequest.create (replace the literal 0 values for senderKeyIndex and
recipientKeyIndex with the derived values).

In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift`:
- Line 18: The wallet factory functions (PlatformWallet.fromSeed and
PlatformWallet.fromMnemonic) must not default the network to .testnet because
the network is fixed at creation; remove the default parameter value so the
signatures become fromSeed(_ seed: Data, network: PlatformNetwork) throws ->
PlatformWallet and fromMnemonic(_ mnemonic: String, network: PlatformNetwork)
throws -> PlatformWallet, update any calls (e.g.,
DashPayService.initializeWallet which calls PlatformWallet.fromMnemonic) to pass
the intended PlatformNetwork explicitly, and run the build to fix any call sites
that relied on the implicit default.

---

Outside diff comments:
In
`@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletTypes.swift`:
- Around line 94-111: The PlatformBlockTime struct lacks a public initializer,
preventing SDK consumers from constructing instances to call public methods like
ManagedIdentity.setLastUpdatedBalanceBlockTime(_:). Add a public initializer
such as public init(height: UInt64, coreHeight: UInt32, timestamp: UInt64) to
PlatformBlockTime so callers can create instances; also consider making the
existing init(ffi: BlockTime) public if external code needs to construct from
FFI values (refer to PlatformBlockTime, init(ffi:), and ffiValue).

---

Nitpick comments:
In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift`:
- Around line 80-84: The wrapper currently exposes and caches IdentityManager
per PlatformNetwork even though the underlying FFI call
platform_wallet_info_get_identity_manager is network-agnostic; update
PlatformWallet to either (A) collapse to a single cached IdentityManager (e.g.,
replace the [PlatformNetwork: IdentityManager] store with a single optional
IdentityManager property and remove the network parameter from the getter), or
(B) record the wallet's creation network when the wallet is constructed and in
the getter validate that the requested network matches that stored network,
returning an error on mismatch; make changes around the methods/fields that
reference PlatformNetwork and IdentityManager and the call site that invokes
platform_wallet_info_get_identity_manager to ensure only one manager is cached
or mismatches are rejected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 571ae591-ee90-4155-a432-76df2a6ce15b

📥 Commits

Reviewing files that changed from the base of the PR and between 85a7117 and 5e1b90d.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (21)
  • packages/rs-platform-wallet-ffi/Cargo.toml
  • packages/rs-platform-wallet-ffi/build.rs
  • packages/rs-platform-wallet-ffi/cbindgen.toml
  • packages/rs-platform-wallet-ffi/platform_wallet_ffi.h
  • packages/rs-platform-wallet-ffi/src/platform_wallet_info.rs
  • packages/rs-platform-wallet-ffi/src/types.rs
  • packages/rs-platform-wallet-ffi/tests/integration_tests.rs
  • packages/rs-sdk-ffi/Cargo.toml
  • packages/rs-sdk-ffi/src/lib.rs
  • packages/rs-sdk-ffi/src/platform_wallet_types.rs
  • packages/rs-unified-sdk-ffi/Cargo.toml
  • packages/rs-unified-sdk-ffi/src/lib.rs
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/ContactRequest.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/DashPayService.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/EstablishedContact.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/IdentityManager.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/ManagedIdentity.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletFFI.swift
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletTypes.swift
  • packages/swift-sdk/build_ios.sh
💤 Files with no reviewable changes (5)
  • packages/rs-platform-wallet-ffi/src/types.rs
  • packages/rs-sdk-ffi/src/platform_wallet_types.rs
  • packages/rs-sdk-ffi/src/lib.rs
  • packages/rs-platform-wallet-ffi/platform_wallet_ffi.h
  • packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWalletFFI.swift

Comment on lines +137 to +148
// Build the contact request object, then hand it off to the FFI layer.
// Real callers should derive key indices from the identity/recipient.
let senderId = try identity.getId()
let request = try ContactRequest.create(
senderId: senderId,
recipientId: recipientId,
senderKeyIndex: 0, // Should be derived from identity keys
recipientKeyIndex: 0, // Should be looked up from recipient
senderKeyIndex: 0, // Should be derived from identity keys
recipientKeyIndex: 0, // Should be looked up from recipient
accountReference: 0,
encryptedPublicKey: encryptedPublicKey
encryptedPublicKey: encryptedPublicKey,
coreHeightCreatedAt: coreHeightCreatedAt,
createdAt: createdAt
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Derive the real key indices before building the request.

senderKeyIndex and recipientKeyIndex are hardcoded to 0 here. Now that this service constructs the ContactRequest itself, any identity/contact pair that uses non-zero keys will get incorrect request metadata and the downstream send/accept flow can break.

Possible fix
 public func sendContactRequest(
     from identity: ManagedIdentity,
     to recipientId: Identifier,
     encryptedPublicKey: Data,
+    senderKeyIndex: UInt32,
+    recipientKeyIndex: UInt32,
     coreHeightCreatedAt: UInt32 = 0,
     createdAt: UInt64 = UInt64(Date().timeIntervalSince1970 * 1000)
 ) throws {
     // Build the contact request object, then hand it off to the FFI layer.
-    // Real callers should derive key indices from the identity/recipient.
     let senderId = try identity.getId()
     let request = try ContactRequest.create(
         senderId: senderId,
         recipientId: recipientId,
-        senderKeyIndex: 0,      // Should be derived from identity keys
-        recipientKeyIndex: 0,   // Should be looked up from recipient
+        senderKeyIndex: senderKeyIndex,
+        recipientKeyIndex: recipientKeyIndex,
         accountReference: 0,
         encryptedPublicKey: encryptedPublicKey,
         coreHeightCreatedAt: coreHeightCreatedAt,
         createdAt: createdAt
     )

If you want, I can sketch the lookup plumbing for those indices or help turn it into a follow-up issue.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/DashPayService.swift`
around lines 137 - 148, The code currently hardcodes senderKeyIndex and
recipientKeyIndex to 0 when constructing ContactRequest via
ContactRequest.create after calling identity.getId(); instead, derive the
correct key indices: obtain the sender key index from the identity (e.g., via
the identity's key management API or a method on the identity object) and look
up the recipient's key index from the recipient/contact store or contact
metadata before building the request, then pass those derived indices into
ContactRequest.create (replace the literal 0 values for senderKeyIndex and
recipientKeyIndex with the derived values).


/// Create a new Platform Wallet from a 64-byte seed
public static func fromSeed(_ seed: Data) throws -> PlatformWallet {
public static func fromSeed(_ seed: Data, network: PlatformNetwork = .testnet) throws -> PlatformWallet {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't default the wallet network during creation.

platform_wallet_info_get_identity_manager can no longer correct the network later, so the wallet's network is now fixed at fromSeed / fromMnemonic time. Keeping .testnet as a default lets stale callers keep compiling and silently create the wrong wallet; for example, DashPayService.initializeWallet still calls PlatformWallet.fromMnemonic(mnemonic) on Line 55 of packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/DashPayService.swift.

Suggested fix
-public static func fromSeed(_ seed: Data, network: PlatformNetwork = .testnet) throws -> PlatformWallet {
+public static func fromSeed(_ seed: Data, network: PlatformNetwork) throws -> PlatformWallet {
 public static func fromMnemonic(
     _ mnemonic: String,
     passphrase: String? = nil,
-    network: PlatformNetwork = .testnet
+    network: PlatformNetwork
 ) throws -> PlatformWallet {

Also applies to: 44-48

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/swift-sdk/Sources/SwiftDashSDK/PlatformWallet/PlatformWallet.swift`
at line 18, The wallet factory functions (PlatformWallet.fromSeed and
PlatformWallet.fromMnemonic) must not default the network to .testnet because
the network is fixed at creation; remove the default parameter value so the
signatures become fromSeed(_ seed: Data, network: PlatformNetwork) throws ->
PlatformWallet and fromMnemonic(_ mnemonic: String, network: PlatformNetwork)
throws -> PlatformWallet, update any calls (e.g.,
DashPayService.initializeWallet which calls PlatformWallet.fromMnemonic) to pass
the intended PlatformNetwork explicitly, and run the build to fix any call sites
that relied on the implicit default.

@github-actions
Copy link
Copy Markdown
Contributor

✅ DashSDKFFI.xcframework built for this PR.

SwiftPM (host the zip at a stable URL, then use):

.binaryTarget(
  name: "DashSDKFFI",
  url: "https://your.cdn.example/DashSDKFFI.xcframework.zip",
  checksum: "d6bb6916e6229453ece62fc38d63d3f58bcabcf90b3ce135856b4bb0d7697100"
)

Xcode manual integration:

  • Download 'DashSDKFFI.xcframework' artifact from the run link above.
  • Drag it into your app target (Frameworks, Libraries & Embedded Content) and set Embed & Sign.
  • If using the Swift wrapper package, point its binaryTarget to the xcframework location or add the package and place the xcframework at the expected path.

@QuantumExplorer QuantumExplorer merged commit bc21822 into v3.1-dev Apr 16, 2026
69 of 70 checks passed
@QuantumExplorer QuantumExplorer deleted the chore/using-platform-ffi-header branch April 16, 2026 19:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants