Update bdk-ffi to 0.3.1

This commit is contained in:
Steve Myers 2022-03-02 15:17:53 -08:00
parent f2b857a609
commit 2cd5fa6934
No known key found for this signature in database
GPG Key ID: 8105A46B22C2D051
2 changed files with 93 additions and 183 deletions

View File

@ -19,13 +19,13 @@ fileprivate extension RustBuffer {
}
static func from(_ ptr: UnsafeBufferPointer<UInt8>) -> RustBuffer {
try! rustCall { ffi_bdk_2e4d_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) }
try! rustCall { ffi_bdk_d04b_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) }
}
// Frees the buffer in place.
// The buffer must not be used after this is called.
func deallocate() {
try! rustCall { ffi_bdk_2e4d_rustbuffer_free(self, $0) }
try! rustCall { ffi_bdk_d04b_rustbuffer_free(self, $0) }
}
}
@ -576,7 +576,7 @@ extension DatabaseConfig: Equatable, Hashable {}
public enum Transaction {
case unconfirmed(details: TransactionDetails )
case confirmed(details: TransactionDetails, confirmation: Confirmation )
case confirmed(details: TransactionDetails, confirmation: BlockTime )
}
extension Transaction: ViaFfiUsingByteBuffer, ViaFfi {
@ -589,7 +589,7 @@ extension Transaction: ViaFfiUsingByteBuffer, ViaFfi {
)
case 2: return .confirmed(
details: try TransactionDetails.read(from: buf),
confirmation: try Confirmation.read(from: buf)
confirmation: try BlockTime.read(from: buf)
)
default: throw UniffiInternalError.unexpectedEnumCase
}
@ -669,7 +669,7 @@ extension BlockchainConfig: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum MnemonicType {
public enum WordCount {
case words12
case words15
@ -678,8 +678,8 @@ public enum MnemonicType {
case words24
}
extension MnemonicType: ViaFfiUsingByteBuffer, ViaFfi {
fileprivate static func read(from buf: Reader) throws -> MnemonicType {
extension WordCount: ViaFfiUsingByteBuffer, ViaFfi {
fileprivate static func read(from buf: Reader) throws -> WordCount {
let variant: Int32 = try buf.readInt()
switch variant {
@ -720,168 +720,49 @@ extension MnemonicType: ViaFfiUsingByteBuffer, ViaFfi {
}
extension MnemonicType: Equatable, Hashable {}
extension WordCount: Equatable, Hashable {}
public func generateExtendedKey(network: Network, mnemonicType: MnemonicType, password: String? ) throws -> ExtendedKeyInfo {
public func generateExtendedKey( network: Network, wordCount: WordCount, password: String? ) throws -> ExtendedKeyInfo {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_generate_extended_key(network.lower(), mnemonicType.lower(), FfiConverterOptionString.lower(password) , $0)
bdk_d04b_generate_extended_key(network.lower(), wordCount.lower(), FfiConverterOptionString.lower(password) , $0)
}
return try ExtendedKeyInfo.lift(_retval)
}
public func restoreExtendedKey(network: Network, mnemonic: String, password: String? ) throws -> ExtendedKeyInfo {
public func restoreExtendedKey( network: Network, mnemonic: String, password: String? ) throws -> ExtendedKeyInfo {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_restore_extended_key(network.lower(), mnemonic.lower(), FfiConverterOptionString.lower(password) , $0)
bdk_d04b_restore_extended_key(network.lower(), mnemonic.lower(), FfiConverterOptionString.lower(password) , $0)
}
return try ExtendedKeyInfo.lift(_retval)
}
public protocol OfflineWalletProtocol {
public protocol WalletProtocol {
func getNewAddress() -> String
func getLastUnusedAddress() -> String
func getBalance() throws -> UInt64
func sign(psbt: PartiallySignedBitcoinTransaction ) throws
func getTransactions() throws -> [Transaction]
}
public class OfflineWallet: OfflineWalletProtocol {
fileprivate let pointer: UnsafeMutableRawPointer
// TODO: We'd like this to be `private` but for Swifty reasons,
// we can't implement `ViaFfi` without making this `required` and we can't
// make it `required` without making it `public`.
required init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) {
self.pointer = pointer
}
public convenience init(descriptor: String, network: Network, databaseConfig: DatabaseConfig ) throws {
self.init(unsafeFromRawPointer: try
rustCallWithError(BdkError.self) {
bdk_2e4d_OfflineWallet_new(descriptor.lower(), network.lower(), databaseConfig.lower() , $0)
})
}
deinit {
try! rustCall { ffi_bdk_2e4d_OfflineWallet_object_free(pointer, $0) }
}
public func getNewAddress() -> String {
let _retval = try!
rustCall() {
bdk_2e4d_OfflineWallet_get_new_address(self.pointer, $0
)
}
return try! String.lift(_retval)
}
public func getLastUnusedAddress() -> String {
let _retval = try!
rustCall() {
bdk_2e4d_OfflineWallet_get_last_unused_address(self.pointer, $0
)
}
return try! String.lift(_retval)
}
public func getBalance() throws -> UInt64 {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_OfflineWallet_get_balance(self.pointer, $0
)
}
return try UInt64.lift(_retval)
}
public func sign(psbt: PartiallySignedBitcoinTransaction ) throws {
try
rustCallWithError(BdkError.self) {
bdk_2e4d_OfflineWallet_sign(self.pointer, psbt.lower() , $0
)
}
}
public func getTransactions() throws -> [Transaction] {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_OfflineWallet_get_transactions(self.pointer, $0
)
}
return try FfiConverterSequenceEnumTransaction.lift(_retval)
}
}
fileprivate extension OfflineWallet {
fileprivate typealias FfiType = UnsafeMutableRawPointer
fileprivate static func read(from buf: Reader) throws -> Self {
let v: UInt64 = try buf.readInt()
// The Rust code won't compile if a pointer won't fit in a UInt64.
// We have to go via `UInt` because that's the thing that's the size of a pointer.
let ptr = UnsafeMutableRawPointer(bitPattern: UInt(truncatingIfNeeded: v))
if (ptr == nil) {
throw UniffiInternalError.unexpectedNullPointer
}
return try self.lift(ptr!)
}
fileprivate func write(into buf: Writer) {
// This fiddling is because `Int` is the thing that's the same size as a pointer.
// The Rust code won't compile if a pointer won't fit in a `UInt64`.
buf.writeInt(UInt64(bitPattern: Int64(Int(bitPattern: self.lower()))))
}
fileprivate static func lift(_ pointer: UnsafeMutableRawPointer) throws -> Self {
return Self(unsafeFromRawPointer: pointer)
}
fileprivate func lower() -> UnsafeMutableRawPointer {
return self.pointer
}
}
// Ideally this would be `fileprivate`, but Swift says:
// """
// 'private' modifier cannot be used with extensions that declare protocol conformances
// """
extension OfflineWallet : ViaFfi, Serializable {}
public protocol OnlineWalletProtocol {
func getNewAddress() -> String
func getLastUnusedAddress() -> String
func getBalance() throws -> UInt64
func sign(psbt: PartiallySignedBitcoinTransaction ) throws
func sign( psbt: PartiallySignedBitcoinTransaction ) throws
func getTransactions() throws -> [Transaction]
func getNetwork() -> Network
func sync(progressUpdate: BdkProgress, maxAddressParam: UInt32? ) throws
func broadcast(psbt: PartiallySignedBitcoinTransaction ) throws -> Transaction
func sync( progressUpdate: BdkProgress, maxAddressParam: UInt32? ) throws
func broadcast( psbt: PartiallySignedBitcoinTransaction ) throws -> Transaction
}
public class OnlineWallet: OnlineWalletProtocol {
public class Wallet: WalletProtocol {
fileprivate let pointer: UnsafeMutableRawPointer
// TODO: We'd like this to be `private` but for Swifty reasons,
@ -890,18 +771,18 @@ public class OnlineWallet: OnlineWalletProtocol {
required init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) {
self.pointer = pointer
}
public convenience init(descriptor: String, changeDescriptor: String?, network: Network, databaseConfig: DatabaseConfig, blockchainConfig: BlockchainConfig ) throws {
public convenience init( descriptor: String, changeDescriptor: String?, network: Network, databaseConfig: DatabaseConfig, blockchainConfig: BlockchainConfig ) throws {
self.init(unsafeFromRawPointer: try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_new(descriptor.lower(), FfiConverterOptionString.lower(changeDescriptor), network.lower(), databaseConfig.lower(), blockchainConfig.lower() , $0)
bdk_d04b_Wallet_new(descriptor.lower(), FfiConverterOptionString.lower(changeDescriptor), network.lower(), databaseConfig.lower(), blockchainConfig.lower() , $0)
})
}
deinit {
try! rustCall { ffi_bdk_2e4d_OnlineWallet_object_free(pointer, $0) }
try! rustCall { ffi_bdk_d04b_Wallet_object_free(pointer, $0) }
}
@ -911,7 +792,7 @@ public class OnlineWallet: OnlineWalletProtocol {
let _retval = try!
rustCall() {
bdk_2e4d_OnlineWallet_get_new_address(self.pointer, $0
bdk_d04b_Wallet_get_new_address(self.pointer, $0
)
}
return try! String.lift(_retval)
@ -920,7 +801,7 @@ public class OnlineWallet: OnlineWalletProtocol {
let _retval = try!
rustCall() {
bdk_2e4d_OnlineWallet_get_last_unused_address(self.pointer, $0
bdk_d04b_Wallet_get_last_unused_address(self.pointer, $0
)
}
return try! String.lift(_retval)
@ -929,16 +810,16 @@ public class OnlineWallet: OnlineWalletProtocol {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_get_balance(self.pointer, $0
bdk_d04b_Wallet_get_balance(self.pointer, $0
)
}
return try UInt64.lift(_retval)
}
public func sign(psbt: PartiallySignedBitcoinTransaction ) throws {
public func sign( psbt: PartiallySignedBitcoinTransaction ) throws {
try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_sign(self.pointer, psbt.lower() , $0
bdk_d04b_Wallet_sign(self.pointer, psbt.lower() , $0
)
}
}
@ -946,7 +827,7 @@ public class OnlineWallet: OnlineWalletProtocol {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_get_transactions(self.pointer, $0
bdk_d04b_Wallet_get_transactions(self.pointer, $0
)
}
return try FfiConverterSequenceEnumTransaction.lift(_retval)
@ -955,24 +836,24 @@ public class OnlineWallet: OnlineWalletProtocol {
let _retval = try!
rustCall() {
bdk_2e4d_OnlineWallet_get_network(self.pointer, $0
bdk_d04b_Wallet_get_network(self.pointer, $0
)
}
return try! Network.lift(_retval)
}
public func sync(progressUpdate: BdkProgress, maxAddressParam: UInt32? ) throws {
public func sync( progressUpdate: BdkProgress, maxAddressParam: UInt32? ) throws {
try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_sync(self.pointer, ffiConverterCallbackInterfaceBdkProgress.lower(progressUpdate), FfiConverterOptionUInt32.lower(maxAddressParam) , $0
bdk_d04b_Wallet_sync(self.pointer, ffiConverterCallbackInterfaceBdkProgress.lower(progressUpdate), FfiConverterOptionUInt32.lower(maxAddressParam) , $0
)
}
}
public func broadcast(psbt: PartiallySignedBitcoinTransaction ) throws -> Transaction {
public func broadcast( psbt: PartiallySignedBitcoinTransaction ) throws -> Transaction {
let _retval = try
rustCallWithError(BdkError.self) {
bdk_2e4d_OnlineWallet_broadcast(self.pointer, psbt.lower() , $0
bdk_d04b_Wallet_broadcast(self.pointer, psbt.lower() , $0
)
}
return try Transaction.lift(_retval)
@ -981,10 +862,10 @@ public class OnlineWallet: OnlineWalletProtocol {
}
fileprivate extension OnlineWallet {
fileprivate typealias FfiType = UnsafeMutableRawPointer
fileprivate extension Wallet {
typealias FfiType = UnsafeMutableRawPointer
fileprivate static func read(from buf: Reader) throws -> Self {
static func read(from buf: Reader) throws -> Self {
let v: UInt64 = try buf.readInt()
// The Rust code won't compile if a pointer won't fit in a UInt64.
// We have to go via `UInt` because that's the thing that's the size of a pointer.
@ -995,17 +876,17 @@ fileprivate extension OnlineWallet {
return try self.lift(ptr!)
}
fileprivate func write(into buf: Writer) {
func write(into buf: Writer) {
// This fiddling is because `Int` is the thing that's the same size as a pointer.
// The Rust code won't compile if a pointer won't fit in a `UInt64`.
buf.writeInt(UInt64(bitPattern: Int64(Int(bitPattern: self.lower()))))
}
fileprivate static func lift(_ pointer: UnsafeMutableRawPointer) throws -> Self {
static func lift(_ pointer: UnsafeMutableRawPointer) throws -> Self {
return Self(unsafeFromRawPointer: pointer)
}
fileprivate func lower() -> UnsafeMutableRawPointer {
func lower() -> UnsafeMutableRawPointer {
return self.pointer
}
}
@ -1014,10 +895,11 @@ fileprivate extension OnlineWallet {
// """
// 'private' modifier cannot be used with extensions that declare protocol conformances
// """
extension OnlineWallet : ViaFfi, Serializable {}
extension Wallet : ViaFfi, Serializable {}
public protocol PartiallySignedBitcoinTransactionProtocol {
func serialize() -> String
}
@ -1030,31 +912,50 @@ public class PartiallySignedBitcoinTransaction: PartiallySignedBitcoinTransactio
required init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) {
self.pointer = pointer
}
public convenience init(wallet: OnlineWallet, recipient: String, amount: UInt64, feeRate: Float? ) throws {
public convenience init( wallet: Wallet, recipient: String, amount: UInt64, feeRate: Float? ) throws {
self.init(unsafeFromRawPointer: try
rustCallWithError(BdkError.self) {
bdk_2e4d_PartiallySignedBitcoinTransaction_new(wallet.lower(), recipient.lower(), amount.lower(), FfiConverterOptionFloat.lower(feeRate) , $0)
bdk_d04b_PartiallySignedBitcoinTransaction_new(wallet.lower(), recipient.lower(), amount.lower(), FfiConverterOptionFloat.lower(feeRate) , $0)
})
}
deinit {
try! rustCall { ffi_bdk_2e4d_PartiallySignedBitcoinTransaction_object_free(pointer, $0) }
try! rustCall { ffi_bdk_d04b_PartiallySignedBitcoinTransaction_object_free(pointer, $0) }
}
public static func deserialize( psbtBase64: String ) throws -> PartiallySignedBitcoinTransaction {
return PartiallySignedBitcoinTransaction(unsafeFromRawPointer: try
rustCallWithError(BdkError.self) {
bdk_d04b_PartiallySignedBitcoinTransaction_deserialize(psbtBase64.lower() , $0)
})
}
public func serialize() -> String {
let _retval = try!
rustCall() {
bdk_d04b_PartiallySignedBitcoinTransaction_serialize(self.pointer, $0
)
}
return try! String.lift(_retval)
}
}
fileprivate extension PartiallySignedBitcoinTransaction {
fileprivate typealias FfiType = UnsafeMutableRawPointer
typealias FfiType = UnsafeMutableRawPointer
fileprivate static func read(from buf: Reader) throws -> Self {
static func read(from buf: Reader) throws -> Self {
let v: UInt64 = try buf.readInt()
// The Rust code won't compile if a pointer won't fit in a UInt64.
// We have to go via `UInt` because that's the thing that's the size of a pointer.
@ -1065,17 +966,17 @@ fileprivate extension PartiallySignedBitcoinTransaction {
return try self.lift(ptr!)
}
fileprivate func write(into buf: Writer) {
func write(into buf: Writer) {
// This fiddling is because `Int` is the thing that's the same size as a pointer.
// The Rust code won't compile if a pointer won't fit in a `UInt64`.
buf.writeInt(UInt64(bitPattern: Int64(Int(bitPattern: self.lower()))))
}
fileprivate static func lift(_ pointer: UnsafeMutableRawPointer) throws -> Self {
static func lift(_ pointer: UnsafeMutableRawPointer) throws -> Self {
return Self(unsafeFromRawPointer: pointer)
}
fileprivate func lower() -> UnsafeMutableRawPointer {
func lower() -> UnsafeMutableRawPointer {
return self.pointer
}
}
@ -1196,7 +1097,7 @@ fileprivate extension TransactionDetails {
extension TransactionDetails: ViaFfiUsingByteBuffer, ViaFfi {}
public struct Confirmation {
public struct BlockTime {
public var height: UInt32
public var timestamp: UInt64
@ -1209,8 +1110,8 @@ public struct Confirmation {
}
extension Confirmation: Equatable, Hashable {
public static func ==(lhs: Confirmation, rhs: Confirmation) -> Bool {
extension BlockTime: Equatable, Hashable {
public static func ==(lhs: BlockTime, rhs: BlockTime) -> Bool {
if lhs.height != rhs.height {
return false
}
@ -1227,9 +1128,9 @@ extension Confirmation: Equatable, Hashable {
}
fileprivate extension Confirmation {
static func read(from buf: Reader) throws -> Confirmation {
return try Confirmation(
fileprivate extension BlockTime {
static func read(from buf: Reader) throws -> BlockTime {
return try BlockTime(
height: UInt32.read(from: buf),
timestamp: UInt64.read(from: buf)
)
@ -1241,7 +1142,7 @@ fileprivate extension Confirmation {
}
}
extension Confirmation: ViaFfiUsingByteBuffer, ViaFfi {}
extension BlockTime: ViaFfiUsingByteBuffer, ViaFfi {}
public struct ElectrumConfig {
public var url: String
@ -1868,13 +1769,13 @@ extension BdkError: Error { }
// Declaration and FfiConverters for BdkProgress Callback Interface
public protocol BdkProgress : AnyObject {
func update(progress: Float, message: String? )
func update( progress: Float, message: String? )
}
// The ForeignCallback that is passed to Rust.
fileprivate let foreignCallbackCallbackInterfaceBdkProgress : ForeignCallback =
{ (handle: Handle, method: Int32, args: RustBuffer) -> RustBuffer in
{ (handle: Handle, method: Int32, args: RustBuffer, out_buf: UnsafeMutablePointer<RustBuffer>) -> Int32 in
func invokeUpdate(_ swiftCallbackInterface: BdkProgress, _ args: RustBuffer) throws -> RustBuffer {
defer { args.deallocate() }
@ -1894,20 +1795,30 @@ fileprivate let foreignCallbackCallbackInterfaceBdkProgress : ForeignCallback =
switch method {
case IDX_CALLBACK_FREE:
ffiConverterCallbackInterfaceBdkProgress.drop(handle: handle)
return RustBuffer()
case 1: return try! invokeUpdate(cb, args)
// No return value.
// See docs of ForeignCallback in `uniffi/src/ffi/foreigncallbacks.rs`
return 0
case 1:
let buffer = try! invokeUpdate(cb, args)
out_buf.pointee = buffer
// Value written to out buffer.
// See docs of ForeignCallback in `uniffi/src/ffi/foreigncallbacks.rs`
return 1
// This should never happen, because an out of bounds method index won't
// ever be used. Once we can catch errors, we should return an InternalError.
// https://github.com/mozilla/uniffi-rs/issues/351
default: return RustBuffer()
default:
// An unexpected error happened.
// See docs of ForeignCallback in `uniffi/src/ffi/foreigncallbacks.rs`
return -1
}
}
// The ffiConverter which transforms the Callbacks in to Handles to pass to Rust.
private let ffiConverterCallbackInterfaceBdkProgress: FfiConverterCallbackInterface<BdkProgress> = {
try! rustCall { (err: UnsafeMutablePointer<RustCallStatus>) in
ffi_bdk_2e4d_BdkProgress_init_callback(foreignCallbackCallbackInterfaceBdkProgress, err)
ffi_bdk_d04b_BdkProgress_init_callback(foreignCallbackCallbackInterfaceBdkProgress, err)
}
return FfiConverterCallbackInterface<BdkProgress>()
}()
@ -1983,10 +1894,9 @@ extension String: ViaFfi {
buf.writeBytes(self.utf8)
}
}
// Helper code for OfflineWallet class is found in ObjectTemplate.swift
// Helper code for OnlineWallet class is found in ObjectTemplate.swift
// Helper code for PartiallySignedBitcoinTransaction class is found in ObjectTemplate.swift
// Helper code for Confirmation record is found in RecordTemplate.swift
// Helper code for Wallet class is found in ObjectTemplate.swift
// Helper code for BlockTime record is found in RecordTemplate.swift
// Helper code for ElectrumConfig record is found in RecordTemplate.swift
// Helper code for EsploraConfig record is found in RecordTemplate.swift
// Helper code for ExtendedKeyInfo record is found in RecordTemplate.swift
@ -1994,9 +1904,9 @@ extension String: ViaFfi {
// Helper code for TransactionDetails record is found in RecordTemplate.swift
// Helper code for BlockchainConfig enum is found in EnumTemplate.swift
// Helper code for DatabaseConfig enum is found in EnumTemplate.swift
// Helper code for MnemonicType enum is found in EnumTemplate.swift
// Helper code for Network enum is found in EnumTemplate.swift
// Helper code for Transaction enum is found in EnumTemplate.swift
// Helper code for WordCount enum is found in EnumTemplate.swift
// Helper code for BdkError error is found in ErrorTemplate.swift
fileprivate enum FfiConverterOptionUInt8: FfiConverterUsingByteBuffer {

@ -1 +1 @@
Subproject commit 6fe9bddcfab97d061668da35cde2d12197014c7a
Subproject commit 89d58db02a7b04eba9e18c9c84213845ed01d2dc