diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/Address/AddressSyncService.swift b/packages/swift-sdk/Sources/SwiftDashSDK/Address/AddressSyncService.swift index 21e3d0b2cbc..c28e0801c6f 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/Address/AddressSyncService.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/Address/AddressSyncService.swift @@ -119,7 +119,7 @@ extension SDK { if var cfg = ffiConfig { return withUnsafePointer(to: &cfg) { cfgPtr in dash_sdk_sync_addresses_batch_with_result( - UnsafePointer(sdkPtr.ptr), + sdkPtr.ptr, keysBase, indicesBase, count, keySizeU32, gapLimit, kbKeysPtr, kbIndPtr, kbNonPtr, kbAmtPtr, kbCount, cfgPtr, syncHeight, syncTimestamp, recentBlock @@ -127,7 +127,7 @@ extension SDK { } } else { return dash_sdk_sync_addresses_batch_with_result( - UnsafePointer(sdkPtr.ptr), + sdkPtr.ptr, keysBase, indicesBase, count, keySizeU32, gapLimit, kbKeysPtr, kbIndPtr, kbNonPtr, kbAmtPtr, kbCount, nil, syncHeight, syncTimestamp, recentBlock @@ -182,6 +182,6 @@ extension SDK { // MARK: - Private Sendable Wrapper private final class AddressSyncSendableSdkPtr: @unchecked Sendable { - let ptr: UnsafeMutablePointer - init(_ p: UnsafeMutablePointer) { self.ptr = p } + let ptr: OpaquePointer + init(_ p: OpaquePointer) { self.ptr = p } } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/Address/Addresses.swift b/packages/swift-sdk/Sources/SwiftDashSDK/Address/Addresses.swift index c804d24fec4..2016e469775 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/Address/Addresses.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/Address/Addresses.swift @@ -1293,7 +1293,7 @@ public class Addresses: @unchecked Sendable { throw SDKError.internalError("Failed to parse identity") } - let identityHandle = identityHandlePtr.assumingMemoryBound(to: IdentityHandle.self) + let identityHandle = OpaquePointer(identityHandlePtr) defer { dash_sdk_identity_destroy(identityHandle) } // Prepare FFI inputs @@ -1332,7 +1332,7 @@ public class Addresses: @unchecked Sendable { let result = ffiInputs.withUnsafeMutableBufferPointer { inputsBuffer -> DashSDKResult in dash_sdk_identity_top_up_from_addresses( handle, - UnsafePointer(identityHandle), + identityHandle, inputsBuffer.baseAddress, UInt(inputs.count), nil // put_settings @@ -1433,7 +1433,7 @@ public class Addresses: @unchecked Sendable { throw SDKError.internalError("Failed to parse identity") } - let identityHandle = identityHandlePtr.assumingMemoryBound(to: IdentityHandle.self) + let identityHandle = OpaquePointer(identityHandlePtr) defer { dash_sdk_identity_destroy(identityHandle) } // Create signer from private key @@ -1456,7 +1456,7 @@ public class Addresses: @unchecked Sendable { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } // Prepare FFI outputs @@ -1483,11 +1483,11 @@ public class Addresses: @unchecked Sendable { let result = ffiOutputs.withUnsafeMutableBufferPointer { outputsBuffer -> DashSDKResult in dash_sdk_identity_transfer_credits_to_addresses( handle, - UnsafePointer(identityHandle), + identityHandle, outputsBuffer.baseAddress, UInt(outputs.count), publicKeyId, - signer.assumingMemoryBound(to: SignerHandle.self), + OpaquePointer(signer), nil // put_settings ) } @@ -1587,7 +1587,7 @@ public class Addresses: @unchecked Sendable { throw SDKError.internalError("Failed to parse identity") } - let identityHandle = identityHandlePtr.assumingMemoryBound(to: IdentityHandle.self) + let identityHandle = OpaquePointer(identityHandlePtr) // Note: We don't destroy this handle here because it will be replaced by the created identity // Create signer from private key @@ -1611,7 +1611,7 @@ public class Addresses: @unchecked Sendable { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } // Prepare FFI inputs @@ -1669,11 +1669,11 @@ public class Addresses: @unchecked Sendable { let result = ffiInputs.withUnsafeMutableBufferPointer { inputsBuffer -> DashSDKResult in dash_sdk_identity_create_from_addresses( handle, - UnsafePointer(identityHandle), + identityHandle, inputsBuffer.baseAddress, UInt(inputs.count), ffiOutput, - signer.assumingMemoryBound(to: SignerHandle.self), + OpaquePointer(signer), nil // put_settings ) } @@ -1728,10 +1728,6 @@ public class Addresses: @unchecked Sendable { // Free the result (but keep the identity handle - caller must free it) dash_sdk_identity_create_from_addresses_result_free(resultPtr) - // Convert UnsafeMutablePointer to OpaquePointer - // OpaquePointer initializer returns optional, so we force unwrap since we know it's valid - let createdIdentityHandle = OpaquePointer(UnsafeRawPointer(identityHandlePtr))! - - return (createdIdentityHandle, PlatformAddressInfosResult(infos: infos)) + return (identityHandlePtr, PlatformAddressInfosResult(infos: infos)) } } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/KeychainSigner.swift b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/KeychainSigner.swift index a7a6d34ed4c..3d0e56f7c4a 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/KeychainSigner.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/KeychainSigner.swift @@ -88,13 +88,13 @@ public final class KeychainSigner: Signer, @unchecked Sendable { /// FFI signer handle. Pass to any `*_with_signer` entry point; /// the underlying pointer is the C-imported - /// `UnsafeMutablePointer` from `platform-wallet-ffi.h` + /// `OpaquePointer` from `platform-wallet-ffi.h` /// (and equivalently `rs-sdk-ffi.h`). Owned by this object — /// freed in `deinit` via `dash_sdk_signer_destroy`. Caller must /// keep the `KeychainSigner` alive for the duration of any FFI /// call that captured this pointer (see the keepalive contract /// above). - public var handle: UnsafeMutablePointer { + public var handle: OpaquePointer { handlePtr } @@ -182,7 +182,7 @@ public final class KeychainSigner: Signer, @unchecked Sendable { /// Raw pointer to the FFI signer handle. Boxed by Rust and freed /// in `deinit`. - private var handlePtr: UnsafeMutablePointer! + private var handlePtr: OpaquePointer! // MARK: Init @@ -603,7 +603,7 @@ public final class KeychainSigner: Signer, @unchecked Sendable { guard let rawSigner = signerResult.data else { return .failure(.ffiSignerCreationFailed(message: "null handle")) } - let signerHandle = rawSigner.assumingMemoryBound(to: SignerHandle.self) + let signerHandle = OpaquePointer(rawSigner) defer { dash_sdk_signer_destroy(signerHandle) } let signResult = data.withUnsafeBytes { dataBuf -> DashSDKResult in diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/PlatformQueryExtensions.swift b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/PlatformQueryExtensions.swift index 69dcfdd9f20..ed9fc605e19 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/PlatformQueryExtensions.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/PlatformQueryExtensions.swift @@ -368,7 +368,7 @@ extension SDK { defer { // Clean up contract handle when done - let contractPtr = contractHandle.assumingMemoryBound(to: DataContractHandle.self) + let contractPtr = OpaquePointer(contractHandle) dash_sdk_data_contract_destroy(contractPtr) } @@ -383,7 +383,7 @@ extension SDK { if let orderByClause = orderByClauseCString { return orderByClause.withUnsafeBufferPointer { orderByPtr in var searchParams = DashSDKDocumentSearchParams() - searchParams.data_contract_handle = UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)) + searchParams.data_contract_handle = OpaquePointer(contractHandle) searchParams.document_type = documentTypePtr.baseAddress searchParams.where_json = wherePtr.baseAddress searchParams.order_by_json = orderByPtr.baseAddress @@ -403,7 +403,7 @@ extension SDK { } } else { var searchParams = DashSDKDocumentSearchParams() - searchParams.data_contract_handle = UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)) + searchParams.data_contract_handle = OpaquePointer(contractHandle) searchParams.document_type = documentTypePtr.baseAddress searchParams.where_json = wherePtr.baseAddress searchParams.order_by_json = nil @@ -424,7 +424,7 @@ extension SDK { } } else { var searchParams = DashSDKDocumentSearchParams() - searchParams.data_contract_handle = UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)) + searchParams.data_contract_handle = OpaquePointer(contractHandle) searchParams.document_type = documentTypePtr.baseAddress searchParams.where_json = nil searchParams.order_by_json = nil @@ -459,12 +459,12 @@ extension SDK { defer { // Clean up contract handle when done - let contractPtr = contractHandle.assumingMemoryBound(to: DataContractHandle.self) + let contractPtr = OpaquePointer(contractHandle) dash_sdk_data_contract_destroy(contractPtr) } // Now fetch the document - let documentResult = dash_sdk_document_fetch(handle, contractHandle.assumingMemoryBound(to: DataContractHandle.self), documentType, documentId) + let documentResult = dash_sdk_document_fetch(handle, OpaquePointer(contractHandle), documentType, documentId) if let error = documentResult.error { let errorMessage = error.pointee.message != nil ? String(cString: error.pointee.message!) : "Unknown error" @@ -478,11 +478,11 @@ extension SDK { defer { // Clean up document handle - dash_sdk_document_destroy(handle, documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_destroy(handle, OpaquePointer(documentHandle)) } // Get document info to convert to JSON - let info = dash_sdk_document_get_info(documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + let info = dash_sdk_document_get_info(OpaquePointer(documentHandle)) defer { if let info = info { dash_sdk_document_info_free(info) diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/StateTransitionExtensions.swift b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/StateTransitionExtensions.swift index be0232a1c34..901494d6be5 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/FFI/StateTransitionExtensions.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/FFI/StateTransitionExtensions.swift @@ -1,17 +1,6 @@ import Foundation import DashSDKFFI -// MARK: - OpaquePointer -> typed FFI helpers -@inline(__always) private func idConst(_ p: OpaquePointer) -> UnsafePointer { UnsafePointer(p) } -@inline(__always) private func idMut(_ p: OpaquePointer) -> UnsafeMutablePointer { UnsafeMutablePointer(p) } -@inline(__always) private func signerConst(_ p: OpaquePointer) -> UnsafePointer { UnsafePointer(p) } -@inline(__always) private func signerMut(_ p: OpaquePointer) -> UnsafeMutablePointer { UnsafeMutablePointer(p) } -@inline(__always) private func idPubKeyConst(_ p: OpaquePointer) -> UnsafePointer { UnsafePointer(p) } -@inline(__always) private func dataContractConst(_ p: OpaquePointer) -> UnsafePointer { UnsafePointer(p) } -@inline(__always) private func dataContractMut(_ p: OpaquePointer) -> UnsafeMutablePointer { UnsafeMutablePointer(p) } -@inline(__always) private func documentConst(_ p: OpaquePointer) -> UnsafePointer { UnsafePointer(p) } -@inline(__always) private func documentMut(_ p: OpaquePointer) -> UnsafeMutablePointer { UnsafeMutablePointer(p) } - // MARK: - Sendable wrappers private final class SendableOpaque: @unchecked Sendable { let p: OpaquePointer; init(_ p: OpaquePointer) { self.p = p } } @@ -51,7 +40,7 @@ private func selectSigningKey(from identity: DPPIdentity, operation: String) -> } /// Helper to create a public key handle from an IdentityPublicKey -private func createPublicKeyHandle(from key: IdentityPublicKey, operation: String) -> UnsafeMutablePointer? { +private func createPublicKeyHandle(from key: IdentityPublicKey, operation: String) -> OpaquePointer? { let keyData = key.data let keyType = key.keyType.ffiValue let purpose = key.purpose.ffiValue @@ -84,7 +73,7 @@ private func createPublicKeyHandle(from key: IdentityPublicKey, operation: Strin } print("✅ [\(operation)] Public key handle created from local data") - return keyHandle.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + return OpaquePointer(keyHandle) } // MARK: - State Transition Extensions @@ -227,8 +216,8 @@ extension SDK { if result.data_type.rawValue == 3, // ResultIdentityHandle let identityHandle = result.data { // Get identity info from the handle - let idPtr = identityHandle.assumingMemoryBound(to: IdentityHandle.self) - let infoPtr = dash_sdk_identity_get_info(UnsafePointer(idPtr)) + let idPtr = OpaquePointer(identityHandle) + let infoPtr = dash_sdk_identity_get_info(idPtr) if let info = infoPtr { // Convert the C struct to a Swift dictionary @@ -294,7 +283,7 @@ extension SDK { privateKey.withUnsafeBytes { keyBytes in dash_sdk_identity_topup_with_instant_lock( handle, - idConst(idBox.p), + idBox.p, instantLockBytes.bindMemory(to: UInt8.self).baseAddress!, UInt(instantLock.count), txBytes.bindMemory(to: UInt8.self).baseAddress!, @@ -312,8 +301,8 @@ extension SDK { if result.data_type.rawValue == 3, // ResultIdentityHandle let toppedUpIdentityHandle = result.data { // Get identity info from the handle to retrieve the new balance - let idPtr = toppedUpIdentityHandle.assumingMemoryBound(to: IdentityHandle.self) - let infoPtr = dash_sdk_identity_get_info(UnsafePointer(idPtr)) + let idPtr = OpaquePointer(toppedUpIdentityHandle) + let infoPtr = dash_sdk_identity_get_info(idPtr) if let info = infoPtr { let balance = info.pointee.balance @@ -363,11 +352,11 @@ extension SDK { let result = toIdentityId.withCString { toIdCStr in dash_sdk_identity_transfer_credits( handle, - idConst(fromBox.p), + fromBox.p, toIdCStr, amount, publicKeyId, - signerConst(signerBox.p), + signerBox.p, nil // Default put settings ) } @@ -416,12 +405,12 @@ extension SDK { let result = toAddress.withCString { addressCStr in dash_sdk_identity_withdraw( handle, - idConst(idBox.p), + idBox.p, addressCStr, amount, coreFeePerByte, publicKeyId, - signerConst(signerBox.p), + signerBox.p, nil // Default put settings ) } @@ -587,7 +576,7 @@ extension SDK { docTypeCStr, entropyPtr, keyHandle, - signerConst(signerBox.p), + signerBox.p, tokenPaymentInfo, putSettings, stateTransitionOptions @@ -682,7 +671,7 @@ extension SDK { } defer { - let dcPtr = contractHandle.assumingMemoryBound(to: DataContractHandle.self) + let dcPtr = OpaquePointer(contractHandle) dash_sdk_data_contract_destroy(dcPtr) } @@ -691,7 +680,7 @@ extension SDK { documentId.withCString { docIdCStr in dash_sdk_document_fetch( handle, - UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)), + OpaquePointer(contractHandle), docTypeCStr, docIdCStr ) @@ -717,7 +706,7 @@ extension SDK { } defer { - dash_sdk_document_free(documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_free(OpaquePointer(documentHandle)) } print("✅ [DOCUMENT REPLACE] Document fetched successfully") @@ -726,7 +715,7 @@ extension SDK { // Use pre-serialized JSON to avoid capturing non-Sendable value types let propertiesJson = propertiesJsonPre _ = propertiesJson.withCString { propsCStr in - dash_sdk_document_set_properties(documentHandle.assumingMemoryBound(to: DocumentHandle.self), propsCStr) + dash_sdk_document_set_properties(OpaquePointer(documentHandle), propsCStr) } // 3. Get appropriate key for signing @@ -756,11 +745,11 @@ extension SDK { documentType.withCString { docTypeCStr in dash_sdk_document_replace_on_platform_and_wait( handle, - UnsafePointer(documentHandle.assumingMemoryBound(to: DocumentHandle.self)), + OpaquePointer(documentHandle), contractIdCStr, docTypeCStr, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token payment info nil, // put settings nil // state transition options @@ -779,7 +768,7 @@ extension SDK { } else if replaceResult.data_type == DashSDKFFI.ResultDocumentHandle, let resultHandle = replaceResult.data { // Document was successfully replaced - dash_sdk_document_free(resultHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_free(OpaquePointer(resultHandle)) let totalTime = Date().timeIntervalSince(startTime) print("✅ [DOCUMENT REPLACE] Document replaced successfully") @@ -851,7 +840,7 @@ extension SDK { contractIdCString, documentTypeCString, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token_payment_info nil, // put_settings nil // state_transition_creation_options @@ -945,7 +934,7 @@ extension SDK { } defer { - let dcPtr2 = contractHandle.assumingMemoryBound(to: DataContractHandle.self) + let dcPtr2 = OpaquePointer(contractHandle) dash_sdk_data_contract_destroy(dcPtr2) } @@ -958,7 +947,7 @@ extension SDK { // Now fetch the document using the contract handle let fetchResult = dash_sdk_document_fetch( handle, - UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)), + OpaquePointer(contractHandle), documentTypeCString, documentIdCString ) @@ -976,7 +965,7 @@ extension SDK { } defer { - dash_sdk_document_destroy(handle, documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_destroy(handle, OpaquePointer(documentHandle)) } print("✅ [DOCUMENT TRANSFER] Document fetched successfully") @@ -988,12 +977,12 @@ extension SDK { print("🔄 [DOCUMENT TRANSFER] Creating state transition...") let transitionResult = dash_sdk_document_transfer_to_identity( handle, - UnsafePointer(documentHandle.assumingMemoryBound(to: DocumentHandle.self)), + OpaquePointer(documentHandle), toIdentityCString, contractIdCString, documentTypeCString, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token_payment_info nil, // put_settings nil // state_transition_creation_options @@ -1012,12 +1001,12 @@ extension SDK { print("🔄 [DOCUMENT TRANSFER] Broadcasting and waiting for confirmation...") let result = dash_sdk_document_transfer_to_identity_and_wait( handle, - UnsafePointer(documentHandle.assumingMemoryBound(to: DocumentHandle.self)), + OpaquePointer(documentHandle), toIdentityCString, contractIdCString, documentTypeCString, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token_payment_info nil, // put_settings nil // state_transition_creation_options @@ -1108,7 +1097,7 @@ extension SDK { } defer { - let dcPtr3 = contractHandle.assumingMemoryBound(to: DataContractHandle.self) + let dcPtr3 = OpaquePointer(contractHandle) dash_sdk_data_contract_destroy(dcPtr3) } @@ -1118,7 +1107,7 @@ extension SDK { documentId.withCString { docIdCStr in dash_sdk_document_fetch( handle, - UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)), + OpaquePointer(contractHandle), docTypeCStr, docIdCStr ) @@ -1140,7 +1129,7 @@ extension SDK { } defer { - dash_sdk_document_destroy(handle, documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_destroy(handle, OpaquePointer(documentHandle)) } print("✅ [DOCUMENT UPDATE PRICE] Document fetched successfully") @@ -1167,12 +1156,12 @@ extension SDK { documentType.withCString { documentTypeCStr in dash_sdk_document_update_price_of_document_and_wait( handle, - UnsafePointer(documentHandle.assumingMemoryBound(to: DocumentHandle.self)), + OpaquePointer(documentHandle), contractIdCStr, documentTypeCStr, newPrice, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token_payment_info nil, // put_settings nil // state_transition_creation_options @@ -1265,7 +1254,7 @@ extension SDK { } defer { - dash_sdk_data_contract_destroy(contractHandle.assumingMemoryBound(to: DataContractHandle.self)) + dash_sdk_data_contract_destroy(OpaquePointer(contractHandle)) } print("📝 [DOCUMENT PURCHASE] Contract fetched in \(Date().timeIntervalSince(contractFetchStartTime)) seconds") @@ -1274,7 +1263,7 @@ extension SDK { print("📝 [DOCUMENT PURCHASE] Step 2: Fetching document...") let documentFetchStart = Date() - let documentResult = dash_sdk_document_fetch(handle, UnsafePointer(contractHandle.assumingMemoryBound(to: DataContractHandle.self)), documentTypeCString, documentIdCString) + let documentResult = dash_sdk_document_fetch(handle, OpaquePointer(contractHandle), documentTypeCString, documentIdCString) if let error = documentResult.error { let errorMessage = error.pointee.message != nil ? String(cString: error.pointee.message!) : "Unknown error" @@ -1289,7 +1278,7 @@ extension SDK { } defer { - dash_sdk_document_destroy(handle, documentHandle.assumingMemoryBound(to: DocumentHandle.self)) + dash_sdk_document_destroy(handle, OpaquePointer(documentHandle)) } print("📝 [DOCUMENT PURCHASE] Document fetched in \(Date().timeIntervalSince(documentFetchStart)) seconds") @@ -1301,13 +1290,13 @@ extension SDK { let result = dash_sdk_document_purchase_and_wait( handle, - UnsafePointer(documentHandle.assumingMemoryBound(to: DocumentHandle.self)), + OpaquePointer(documentHandle), contractIdCString, documentTypeCString, price, purchaserIdCString, keyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // token_payment_info - null for now nil, // put_settings - null for now nil // state_transition_creation_options - null for now @@ -1331,7 +1320,7 @@ extension SDK { // The result should contain the purchased document if let documentData = result.data { // We received the purchased document back - let purchasedDocHandle = documentData.assumingMemoryBound(to: DocumentHandle.self) + let purchasedDocHandle = OpaquePointer(documentData) // Get info about the purchased document (extract Sendable primitives) var purchasedId: String? = nil @@ -1433,7 +1422,7 @@ extension SDK { defer { print("🟦 TOKEN MINT: Cleaning up identity handle") // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -1469,7 +1458,7 @@ extension SDK { // Get the public key handle for the minting key print("🟦 TOKEN MINT: Getting public key handle for key ID: \(keyId)") let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(keyId) ) @@ -1483,7 +1472,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) print("✅ TOKEN MINT: Successfully got public key handle") defer { print("🟦 TOKEN MINT: Cleaning up public key handle") @@ -1525,7 +1514,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1543,7 +1532,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1601,7 +1590,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -1626,7 +1615,7 @@ extension SDK { // Get the public key handle for the freezing key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(freezingKey.id) ) @@ -1639,7 +1628,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -1666,7 +1655,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1679,7 +1668,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1733,7 +1722,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -1758,7 +1747,7 @@ extension SDK { // Get the public key handle for the unfreezing key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(unfreezingKey.id) ) @@ -1771,7 +1760,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -1798,7 +1787,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1811,7 +1800,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1865,7 +1854,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -1880,7 +1869,7 @@ extension SDK { // Get the public key handle for the burning key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(burningKey.id) ) @@ -1893,7 +1882,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -1919,7 +1908,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1932,7 +1921,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -1985,7 +1974,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -2010,7 +1999,7 @@ extension SDK { // Get the public key handle for the destroy key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(destroyKey.id) ) @@ -2023,7 +2012,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -2050,7 +2039,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2063,7 +2052,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2117,7 +2106,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -2125,7 +2114,7 @@ extension SDK { // Get the public key handle for the claiming key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(keyId) ) @@ -2138,7 +2127,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -2176,7 +2165,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2189,7 +2178,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2243,7 +2232,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -2261,7 +2250,7 @@ extension SDK { // Get the public key handle for the transfer key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(keyId) ) @@ -2274,7 +2263,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -2304,7 +2293,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2317,7 +2306,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2372,7 +2361,7 @@ extension SDK { defer { // Clean up the identity handle when done - dash_sdk_identity_destroy(idMut(ownerIdentityHandle)) + dash_sdk_identity_destroy(ownerIdentityHandle) } // Get the owner ID from the identity @@ -2380,7 +2369,7 @@ extension SDK { // Get the public key handle for the pricing key let keyHandleResult = dash_sdk_identity_get_public_key_by_id( - idConst(ownerIdentityHandle), + ownerIdentityHandle, UInt8(keyId) ) @@ -2393,7 +2382,7 @@ extension SDK { return } - let publicKeyHandle = keyHandleData.assumingMemoryBound(to: IdentityPublicKeyHandle.self) + let publicKeyHandle = OpaquePointer(keyHandleData) defer { // Clean up the public key handle when done dash_sdk_identity_public_key_destroy(publicKeyHandle) @@ -2445,7 +2434,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2458,7 +2447,7 @@ extension SDK { ownerIdBytes.bindMemory(to: UInt8.self).baseAddress!, ¶ms, publicKeyHandle, - signerConst(signerBox.p), + signerBox.p, nil, // Default put settings nil // Default state transition options ) @@ -2504,7 +2493,7 @@ extension SDK { let identityHandle = try identityToHandle(identity) defer { // Clean up the handle when done - dash_sdk_identity_destroy(idMut(identityHandle)) + dash_sdk_identity_destroy(identityHandle) } // Call the lower-level method @@ -2529,7 +2518,7 @@ extension SDK { let identityHandle = try identityToHandle(identity) defer { // Clean up the handle when done - dash_sdk_identity_destroy(idMut(identityHandle)) + dash_sdk_identity_destroy(identityHandle) } // Call the lower-level method @@ -2554,7 +2543,7 @@ extension SDK { let identityHandle = try identityToHandle(identity) defer { // Clean up the handle when done - dash_sdk_identity_destroy(idMut(identityHandle)) + dash_sdk_identity_destroy(identityHandle) } // Call the lower-level method diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Account.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Account.swift index 1062584d3ce..8b6b2ff803a 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Account.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Account.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for a wallet account public class Account { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer private weak var wallet: Wallet? - internal init(handle: UnsafeMutablePointer, wallet: Wallet) { + internal init(handle: OpaquePointer, wallet: Wallet) { self.handle = handle self.wallet = wallet } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AccountCollection.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AccountCollection.swift index e71fc2c527d..e668e9d017e 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AccountCollection.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AccountCollection.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for a collection of accounts public class AccountCollection { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer private weak var wallet: Wallet? - internal init(handle: UnsafeMutablePointer, wallet: Wallet) { + internal init(handle: OpaquePointer, wallet: Wallet) { self.handle = handle self.wallet = wallet } @@ -22,7 +22,7 @@ public class AccountCollection { guard let rawPointer = account_collection_get_provider_operator_keys(handle) else { return nil } - let accountHandle = rawPointer.assumingMemoryBound(to: FFIBLSAccount.self) + let accountHandle = OpaquePointer(rawPointer) return BLSAccount(handle: accountHandle, wallet: wallet) } @@ -33,7 +33,7 @@ public class AccountCollection { guard let rawPointer = account_collection_get_provider_platform_keys(handle) else { return nil } - let accountHandle = rawPointer.assumingMemoryBound(to: FFIEdDSAAccount.self) + let accountHandle = OpaquePointer(rawPointer) return EdDSAAccount(handle: accountHandle, wallet: wallet) } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AddressPool.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AddressPool.swift index b2ca4e88223..23378ea6dc6 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AddressPool.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/AddressPool.swift @@ -3,9 +3,9 @@ import DashSDKFFI /// Swift wrapper for an address pool from a managed account public class AddressPool { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer - internal init(handle: UnsafeMutablePointer) { + internal init(handle: OpaquePointer) { self.handle = handle } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/BLSAccount.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/BLSAccount.swift index f5d4713f7eb..5c01fd1cb28 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/BLSAccount.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/BLSAccount.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for a BLS account (used for provider keys) public class BLSAccount { - internal let handle: UnsafeMutablePointer + internal let handle: OpaquePointer private weak var wallet: Wallet? - internal init(handle: UnsafeMutablePointer, wallet: Wallet?) { + internal init(handle: OpaquePointer, wallet: Wallet?) { self.handle = handle self.wallet = wallet } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/EdDSAAccount.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/EdDSAAccount.swift index e612a7cfc4c..af05cbd4f27 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/EdDSAAccount.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/EdDSAAccount.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for an EdDSA account (used for platform P2P keys) public class EdDSAAccount { - internal let handle: UnsafeMutablePointer + internal let handle: OpaquePointer private weak var wallet: Wallet? - internal init(handle: UnsafeMutablePointer, wallet: Wallet?) { + internal init(handle: OpaquePointer, wallet: Wallet?) { self.handle = handle self.wallet = wallet } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyDerivation.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyDerivation.swift index 0060d20b5cf..1bd8a2b18b0 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyDerivation.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyDerivation.swift @@ -262,9 +262,9 @@ public class KeyDerivation { /// Extended private key handle public class ExtendedPrivateKey { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer - internal init(handle: UnsafeMutablePointer) { + internal init(handle: OpaquePointer) { self.handle = handle } @@ -307,9 +307,9 @@ public class ExtendedPrivateKey { /// Extended public key handle public class ExtendedPublicKey { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer - internal init(handle: UnsafeMutablePointer) { + internal init(handle: OpaquePointer) { self.handle = handle } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyManager.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyManager.swift index 2ee761ad1ff..b2727b0df09 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyManager.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/KeyManager.swift @@ -327,8 +327,7 @@ public final class KeyManager: Sendable { /// Destroy a signer handle /// - Parameter signer: The signer handle to destroy public func destroySigner(_ signer: OpaquePointer) { - let signerPtr = UnsafeMutablePointer(signer) - dash_sdk_signer_destroy(signerPtr) + dash_sdk_signer_destroy(signer) } // MARK: - Key Validation diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccount.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccount.swift index af2a7dd54db..b6d984b807b 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccount.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccount.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for a managed account with address pool management public class ManagedAccount { - internal let handle: UnsafeMutablePointer + internal let handle: OpaquePointer private let manager: WalletManager - internal init(handle: UnsafeMutablePointer, manager: WalletManager) { + internal init(handle: OpaquePointer, manager: WalletManager) { self.handle = handle self.manager = manager } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccountCollection.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccountCollection.swift index cfe33bc67d6..bbf26f52a36 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccountCollection.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedAccountCollection.swift @@ -3,10 +3,10 @@ import DashSDKFFI /// Swift wrapper for a collection of managed accounts public class ManagedAccountCollection { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer private let manager: WalletManager - internal init(handle: UnsafeMutablePointer, manager: WalletManager) { + internal init(handle: OpaquePointer, manager: WalletManager) { self.handle = handle self.manager = manager } @@ -211,7 +211,7 @@ public class ManagedAccountCollection { guard let rawPointer = managed_account_collection_get_provider_operator_keys(handle) else { return nil } - let accountHandle = rawPointer.assumingMemoryBound(to: FFIManagedCoreAccount.self) + let accountHandle = OpaquePointer(rawPointer) return ManagedAccount(handle: accountHandle, manager: manager) } @@ -225,7 +225,7 @@ public class ManagedAccountCollection { guard let rawPointer = managed_account_collection_get_provider_platform_keys(handle) else { return nil } - let accountHandle = rawPointer.assumingMemoryBound(to: FFIManagedCoreAccount.self) + let accountHandle = OpaquePointer(rawPointer) return ManagedAccount(handle: accountHandle, manager: manager) } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedPlatformAccount.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedPlatformAccount.swift index 171ca72b6d0..0159e87bb98 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedPlatformAccount.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/ManagedPlatformAccount.swift @@ -4,9 +4,6 @@ // Swift wrapper for a managed platform payment account (DIP-17). // Platform payment accounts are identified by (account_index, key_class) // and hold credit/duff balances with their own address pool. -// -// FFIManagedPlatformAccount is an opaque C type with a minimal body so Swift -// can use typed pointers (UnsafeMutablePointer). import Foundation import DashSDKFFI @@ -33,9 +30,9 @@ public struct PlatformPaymentAccountKey: Sendable, Equatable { /// Provides access to credit/duff balances, address counts, and the /// account's address pool. The underlying FFI handle is freed on deinit. public class ManagedPlatformAccount { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer - internal init(handle: UnsafeMutablePointer) { + internal init(handle: OpaquePointer) { self.handle = handle } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Wallet.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Wallet.swift index ee3b224afd8..9bcf6b5c204 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Wallet.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/Wallet.swift @@ -3,7 +3,7 @@ import DashSDKFFI /// Swift wrapper for a Dash wallet with HD key derivation public class Wallet { - internal let handle: UnsafeMutablePointer + internal let handle: OpaquePointer private let ownsHandle: Bool // MARK: - Static Methods @@ -33,7 +33,7 @@ public class Wallet { accountOptions: AccountCreationOption = .default) throws { var error = FFIError() - let walletPtr: UnsafeMutablePointer? + let walletPtr: OpaquePointer? if case .specificAccounts = accountOptions { // Use the with_options variant for specific accounts @@ -84,7 +84,7 @@ public class Wallet { self.ownsHandle = true var error = FFIError() - let walletPtr: UnsafeMutablePointer? = seed.withUnsafeBytes { seedBytes in + let walletPtr: OpaquePointer? = seed.withUnsafeBytes { seedBytes in let seedPtr = seedBytes.bindMemory(to: UInt8.self).baseAddress if case .specificAccounts = accountOptions { @@ -161,7 +161,7 @@ public class Wallet { public static func createRandom(network: Network = .mainnet, accountOptions: AccountCreationOption = .default) throws -> Wallet { var error = FFIError() - let walletPtr: UnsafeMutablePointer? + let walletPtr: OpaquePointer? if case .specificAccounts = accountOptions { var options = accountOptions.toFFIOptions() @@ -186,7 +186,7 @@ public class Wallet { } /// Private initializer for internal use (takes ownership) - private init(handle: UnsafeMutablePointer, network: Network) { + private init(handle: OpaquePointer, network: Network) { self.handle = handle self.ownsHandle = true } @@ -510,11 +510,11 @@ public class Wallet { return AccountCollection(handle: collectionHandle, wallet: self) } - internal var ffiHandle: UnsafeMutablePointer { handle } + internal var ffiHandle: OpaquePointer { handle } // Non-owning initializer for wallets obtained from WalletManager public init(nonOwningHandle handle: UnsafeRawPointer) { - self.handle = UnsafeMutablePointer(mutating: handle.bindMemory(to: FFIWallet.self, capacity: 1)) + self.handle = OpaquePointer(handle) self.ownsHandle = false } diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/WalletManager.swift b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/WalletManager.swift index 7f188f28343..f3f0662b992 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/WalletManager.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/KeyWallet/WalletManager.swift @@ -3,7 +3,7 @@ import DashSDKFFI /// Swift wrapper for wallet manager that manages multiple wallets public class WalletManager { - private let handle: UnsafeMutablePointer + private let handle: OpaquePointer internal let network: Network private let ownsHandle: Bool @@ -27,7 +27,7 @@ public class WalletManager { /// Create a wallet manager wrapper from an existing handle (does not own the handle) /// - Parameter handle: The FFI wallet manager handle - internal init(handle: UnsafeMutablePointer) throws { + internal init(handle: OpaquePointer) throws { var error = FFIError() let network = wallet_manager_network(handle, &error) @@ -578,7 +578,7 @@ public class WalletManager { } } - internal var ffiHandle: UnsafeMutablePointer { handle } + internal var ffiHandle: OpaquePointer { handle } // MARK: - Serialization diff --git a/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift b/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift index 5f292a1303a..1cb67c18a7b 100644 --- a/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift +++ b/packages/swift-sdk/Sources/SwiftDashSDK/SDK.swift @@ -49,7 +49,7 @@ extension Data { /// Swift wrapper for the Dash Platform SDK public final class SDK: @unchecked Sendable { - public private(set) var handle: UnsafeMutablePointer? + public private(set) var handle: OpaquePointer? /// The network this SDK instance is connected to public private(set) var network: Network = .testnet @@ -378,7 +378,7 @@ public final class SDK: @unchecked Sendable { } // Store the handle and network - handle = result.data?.assumingMemoryBound(to: SDKHandle.self) + handle = OpaquePointer(result.data) self.network = network } diff --git a/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/Views/TransitionDetailView.swift b/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/Views/TransitionDetailView.swift index e4f04e405bf..8e30cc4a369 100644 --- a/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/Views/TransitionDetailView.swift +++ b/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/Views/TransitionDetailView.swift @@ -835,7 +835,7 @@ struct TransitionDetailView: View { from: dppIdentity, toIdentityId: normalizedToIdentityId, amount: amount, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -889,7 +889,7 @@ struct TransitionDetailView: View { amount: amount, toAddress: toAddress, coreFeePerByte: coreFeePerByte, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -986,7 +986,7 @@ struct TransitionDetailView: View { documentType: documentType, ownerIdentity: dppIdentity, properties: properties, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -1030,7 +1030,7 @@ struct TransitionDetailView: View { documentType: documentType, documentId: documentId, ownerIdentity: dppIdentity, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive across the await — see KeychainSigner lifetime contract @@ -1086,7 +1086,7 @@ struct TransitionDetailView: View { documentId: documentId, fromIdentity: fromIdentity, toIdentityId: recipientId, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -1141,7 +1141,7 @@ struct TransitionDetailView: View { documentId: documentId, newPrice: newPrice, ownerIdentity: ownerDPPIdentity, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -1199,7 +1199,7 @@ struct TransitionDetailView: View { documentId: documentId, purchaserIdentity: fromIdentity, price: price, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -1292,7 +1292,7 @@ struct TransitionDetailView: View { documentId: documentId, ownerIdentity: dppIdentity, properties: properties, - signer: OpaquePointer(signer.handle) + signer: signer.handle ) _ = signer // keepalive @@ -1389,7 +1389,7 @@ struct TransitionDetailView: View { amount: amount, ownerIdentity: dppIdentity, keyId: mintingKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive @@ -1477,7 +1477,7 @@ struct TransitionDetailView: View { amount: amount, ownerIdentity: dppIdentity, keyId: burningKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive @@ -1530,7 +1530,7 @@ struct TransitionDetailView: View { targetIdentityId: targetIdentityId, ownerIdentity: dppIdentity, keyId: freezingKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive @@ -1578,7 +1578,7 @@ struct TransitionDetailView: View { targetIdentityId: targetIdentityId, ownerIdentity: dppIdentity, keyId: unfreezingKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: formInputs["note"] ) _ = signer // keepalive @@ -1626,7 +1626,7 @@ struct TransitionDetailView: View { frozenIdentityId: frozenIdentityId, ownerIdentity: dppIdentity, keyId: destroyKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: formInputs["note"] ) _ = signer // keepalive @@ -1676,7 +1676,7 @@ struct TransitionDetailView: View { distributionType: distributionType, ownerIdentity: dppIdentity, keyId: claimingKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive @@ -1748,7 +1748,7 @@ struct TransitionDetailView: View { amount: amount, ownerIdentity: dppIdentity, keyId: transferKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive @@ -1802,7 +1802,7 @@ struct TransitionDetailView: View { priceData: priceData, ownerIdentity: dppIdentity, keyId: pricingKey.id, - signer: OpaquePointer(signer.handle), + signer: signer.handle, note: note ) _ = signer // keepalive diff --git a/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/WalletManagerStore.swift b/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/WalletManagerStore.swift index c78259ce3ea..4d647f9ed96 100644 --- a/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/WalletManagerStore.swift +++ b/packages/swift-sdk/SwiftExampleApp/SwiftExampleApp/WalletManagerStore.swift @@ -64,7 +64,7 @@ final class WalletManagerStore: ObservableObject { /// otherwise the cached manager keeps using its own Sdk clone /// with stale DAPI / quorum endpoints, and proof verification /// fails forever ("no available addresses to use"). - private var managerSdkHandles: [Network: UnsafeMutablePointer] = [:] + private var managerSdkHandles: [Network: OpaquePointer] = [:] /// SwiftData container shared across every manager. Each /// manager's persistence handler narrows its `loadWalletList` diff --git a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SDKMethodTests.swift b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SDKMethodTests.swift index 7378ab6a757..b27d39a4259 100644 --- a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SDKMethodTests.swift +++ b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SDKMethodTests.swift @@ -73,7 +73,7 @@ final class SDKMethodTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } nonisolated(unsafe) let signerPtr = OpaquePointer(signer) diff --git a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SimpleTransitionTests.swift b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SimpleTransitionTests.swift index 96da90117c6..994e3d906cc 100644 --- a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SimpleTransitionTests.swift +++ b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/SimpleTransitionTests.swift @@ -75,7 +75,7 @@ final class SimpleTransitionTests: XCTestCase { } defer { - dash_sdk_identity_destroy(identityHandle.assumingMemoryBound(to: IdentityHandle.self)) + dash_sdk_identity_destroy(OpaquePointer(identityHandle)) } // Use key ID 3 (transfer key) directly @@ -97,7 +97,7 @@ final class SimpleTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } // `OpaquePointer` lost its retroactive `Sendable` conformance diff --git a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/StateTransitionTests.swift b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/StateTransitionTests.swift index 5edf9743591..5b42edfdab0 100644 --- a/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/StateTransitionTests.swift +++ b/packages/swift-sdk/SwiftExampleApp/SwiftExampleAppTests/StateTransitionTests.swift @@ -116,7 +116,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_identity_destroy(identityHandle.assumingMemoryBound(to: IdentityHandle.self)) + dash_sdk_identity_destroy(OpaquePointer(identityHandle)) } // Use key ID 3 (transfer key) directly @@ -137,7 +137,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } // `OpaquePointer` lost its retroactive `Sendable` conformance @@ -286,7 +286,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } print(" Calling transferCredits...") @@ -380,7 +380,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } nonisolated(unsafe) let signerPtr = OpaquePointer(signer) @@ -475,7 +475,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } print("✅ Signer created successfully") @@ -492,7 +492,7 @@ final class StateTransitionTests: XCTestCase { // Try to sign the data let signResult = testData.withUnsafeBytes { dataBytes in dash_sdk_signer_sign( - signer.assumingMemoryBound(to: SignerHandle.self), + OpaquePointer(signer), dataBytes.bindMemory(to: UInt8.self).baseAddress!, UInt(testData.count) ) @@ -546,7 +546,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_signer_destroy(signer.assumingMemoryBound(to: SignerHandle.self)) + dash_sdk_signer_destroy(OpaquePointer(signer)) } print("✅ Signer created") @@ -568,7 +568,7 @@ final class StateTransitionTests: XCTestCase { } defer { - dash_sdk_identity_destroy(identityHandle.assumingMemoryBound(to: IdentityHandle.self)) + dash_sdk_identity_destroy(OpaquePointer(identityHandle)) } print("✅ Identity handle fetched") @@ -586,11 +586,11 @@ final class StateTransitionTests: XCTestCase { let result = recipientId.withCString { toIdCStr in dash_sdk_identity_transfer_credits( sdk.handle, - identityHandle.assumingMemoryBound(to: IdentityHandle.self), + OpaquePointer(identityHandle), toIdCStr, amount, 0, // Auto-select key - signer.assumingMemoryBound(to: SignerHandle.self), + OpaquePointer(signer), nil // Default put settings ) } diff --git a/packages/swift-sdk/build_ios.sh b/packages/swift-sdk/build_ios.sh index a41a432ced1..6c58a1a5d2a 100755 --- a/packages/swift-sdk/build_ios.sh +++ b/packages/swift-sdk/build_ios.sh @@ -173,20 +173,6 @@ module DashSDKFFI { } EOF log_info " → module.modulemap + umbrella header injected in $HEADERS_DIR" - - # Give opaque struct forward declarations a body so Swift can use UnsafeMutablePointer. - # Skip types that already have a full definition in another header to avoid redefinition. - local defined - defined=$(grep -oh 'typedef struct [A-Za-z_][A-Za-z_0-9]* {' "$HEADERS_DIR"/*/*.h 2>/dev/null \ - | sed 's/typedef struct \([^ ]*\) {/\1/' | sort -u | paste -sd'|' - || true) - for h in "$HEADERS_DIR"/*/*.h; do - if [ -n "$defined" ]; then - perl -i -pe "s/^typedef struct (\w+) \1;\$/ - my \$n=\$1; \$n=~m{^($defined)\$} ? \$_ : \"typedef struct \$n { uint8_t _opaque; } \$n;\n\"/e" "$h" - else - perl -i -pe 's/^typedef struct (\w+) \1;$/typedef struct $1 { uint8_t _opaque; } $1;/' "$h" - fi - done } # Shielded (Orchard / ZK) support is compiled in by default. The