diff --git a/compile.all.sh b/compile.all.sh index 766d714..8b02aa8 100755 --- a/compile.all.sh +++ b/compile.all.sh @@ -1,4 +1,5 @@ #!/bin/bash +#export PKG_CONFIG_ALLOW_CROSS=1 cd rust || exit 1 make all -cd .. || exit 1 \ No newline at end of file +cd .. || exit 1 diff --git a/example/lib/test_app.dart b/example/lib/test_app.dart index 205e8bc..df1ac1c 100644 --- a/example/lib/test_app.dart +++ b/example/lib/test_app.dart @@ -77,8 +77,11 @@ class TestApp extends StatefulWidget { } static Future build(Wallet wallet) async { - final pset = await wallet.build( - sats: outAmount, outAddress: outAddress, absFee: fee); + final pset = await wallet.build_lbtc_tx( + sats: outAmount, + outAddress: outAddress, + absFee: fee, + ); return pset; } diff --git a/ios/Classes/bindings.h b/ios/Classes/bindings.h index de8e227..93d4084 100644 --- a/ios/Classes/bindings.h +++ b/ios/Classes/bindings.h @@ -30,6 +30,8 @@ void wire_new_descriptor__static_method__Api(int64_t port_, int32_t network, struct wire_uint_8_list *mnemonic); +void wire_blinding_key__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); + void wire_new_wallet__static_method__Api(int64_t port_, int32_t network, struct wire_uint_8_list *db_path, @@ -48,15 +50,30 @@ void wire_address__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id, uint32_t index); +void wire_validate_address__static_method__Api(int64_t port_, + struct wire_uint_8_list *address_string); + +void wire_address_from_script__static_method__Api(int64_t port_, + int32_t network, + struct wire_uint_8_list *script, + struct wire_uint_8_list *blinding_key); + void wire_balance__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); void wire_txs__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); -void wire_build_tx__static_method__Api(int64_t port_, - struct wire_uint_8_list *wallet_id, - uint64_t sats, - struct wire_uint_8_list *out_address, - float abs_fee); +void wire_build_lbtc_tx__static_method__Api(int64_t port_, + struct wire_uint_8_list *wallet_id, + uint64_t sats, + struct wire_uint_8_list *out_address, + float abs_fee); + +void wire_build_asset_tx__static_method__Api(int64_t port_, + struct wire_uint_8_list *wallet_id, + uint64_t sats, + struct wire_uint_8_list *out_address, + float abs_fee, + struct wire_uint_8_list *asset_id); void wire_decode_tx__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id, @@ -79,14 +96,18 @@ void free_WireSyncReturn(WireSyncReturn ptr); static int64_t dummy_method_to_enforce_bundling(void) { int64_t dummy_var = 0; dummy_var ^= ((int64_t) (void*) wire_new_descriptor__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_blinding_key__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_new_wallet__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_sync__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_wallet_descriptor__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_address_last_unused__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_address__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_validate_address__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_address_from_script__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_balance__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_txs__static_method__Api); - dummy_var ^= ((int64_t) (void*) wire_build_tx__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_build_lbtc_tx__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_build_asset_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_decode_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_sign_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_broadcast_tx__static_method__Api); diff --git a/lib/src/generated/bindings.dart b/lib/src/generated/bindings.dart index e0d6bc7..42c0091 100644 --- a/lib/src/generated/bindings.dart +++ b/lib/src/generated/bindings.dart @@ -47,6 +47,26 @@ class LwkBridgeImpl implements LwkBridge { argNames: ["network", "mnemonic"], ); + Future blindingKeyStaticMethodApi( + {required String walletId, dynamic hint}) { + var arg0 = _platform.api2wire_String(walletId); + return _platform.executeNormal(FlutterRustBridgeTask( + callFfi: (port_) => + _platform.inner.wire_blinding_key__static_method__Api(port_, arg0), + parseSuccessData: _wire2api_String, + parseErrorData: _wire2api_lwk_error, + constMeta: kBlindingKeyStaticMethodApiConstMeta, + argValues: [walletId], + hint: hint, + )); + } + + FlutterRustBridgeTaskConstMeta get kBlindingKeyStaticMethodApiConstMeta => + const FlutterRustBridgeTaskConstMeta( + debugName: "blinding_key__static_method__Api", + argNames: ["walletId"], + ); + Future newWalletStaticMethodApi( {required Network network, required String dbPath, @@ -156,6 +176,53 @@ class LwkBridgeImpl implements LwkBridge { argNames: ["walletId", "index"], ); + Future validateAddressStaticMethodApi( + {required String addressString, dynamic hint}) { + var arg0 = _platform.api2wire_String(addressString); + return _platform.executeNormal(FlutterRustBridgeTask( + callFfi: (port_) => _platform.inner + .wire_validate_address__static_method__Api(port_, arg0), + parseSuccessData: _wire2api_unit, + parseErrorData: _wire2api_lwk_error, + constMeta: kValidateAddressStaticMethodApiConstMeta, + argValues: [addressString], + hint: hint, + )); + } + + FlutterRustBridgeTaskConstMeta get kValidateAddressStaticMethodApiConstMeta => + const FlutterRustBridgeTaskConstMeta( + debugName: "validate_address__static_method__Api", + argNames: ["addressString"], + ); + + Future
addressFromScriptStaticMethodApi( + {required Network network, + required String script, + required String blindingKey, + dynamic hint}) { + var arg0 = api2wire_network(network); + var arg1 = _platform.api2wire_String(script); + var arg2 = _platform.api2wire_String(blindingKey); + return _platform.executeNormal(FlutterRustBridgeTask( + callFfi: (port_) => _platform.inner + .wire_address_from_script__static_method__Api( + port_, arg0, arg1, arg2), + parseSuccessData: _wire2api_address, + parseErrorData: _wire2api_lwk_error, + constMeta: kAddressFromScriptStaticMethodApiConstMeta, + argValues: [network, script, blindingKey], + hint: hint, + )); + } + + FlutterRustBridgeTaskConstMeta + get kAddressFromScriptStaticMethodApiConstMeta => + const FlutterRustBridgeTaskConstMeta( + debugName: "address_from_script__static_method__Api", + argNames: ["network", "script", "blindingKey"], + ); + Future> balanceStaticMethodApi( {required String walletId, dynamic hint}) { var arg0 = _platform.api2wire_String(walletId); @@ -196,7 +263,7 @@ class LwkBridgeImpl implements LwkBridge { argNames: ["walletId"], ); - Future buildTxStaticMethodApi( + Future buildLbtcTxStaticMethodApi( {required String walletId, required int sats, required String outAddress, @@ -208,21 +275,52 @@ class LwkBridgeImpl implements LwkBridge { var arg3 = api2wire_f32(absFee); return _platform.executeNormal(FlutterRustBridgeTask( callFfi: (port_) => _platform.inner - .wire_build_tx__static_method__Api(port_, arg0, arg1, arg2, arg3), + .wire_build_lbtc_tx__static_method__Api( + port_, arg0, arg1, arg2, arg3), parseSuccessData: _wire2api_String, parseErrorData: _wire2api_lwk_error, - constMeta: kBuildTxStaticMethodApiConstMeta, + constMeta: kBuildLbtcTxStaticMethodApiConstMeta, argValues: [walletId, sats, outAddress, absFee], hint: hint, )); } - FlutterRustBridgeTaskConstMeta get kBuildTxStaticMethodApiConstMeta => + FlutterRustBridgeTaskConstMeta get kBuildLbtcTxStaticMethodApiConstMeta => const FlutterRustBridgeTaskConstMeta( - debugName: "build_tx__static_method__Api", + debugName: "build_lbtc_tx__static_method__Api", argNames: ["walletId", "sats", "outAddress", "absFee"], ); + Future buildAssetTxStaticMethodApi( + {required String walletId, + required int sats, + required String outAddress, + required double absFee, + required String assetId, + dynamic hint}) { + var arg0 = _platform.api2wire_String(walletId); + var arg1 = _platform.api2wire_u64(sats); + var arg2 = _platform.api2wire_String(outAddress); + var arg3 = api2wire_f32(absFee); + var arg4 = _platform.api2wire_String(assetId); + return _platform.executeNormal(FlutterRustBridgeTask( + callFfi: (port_) => _platform.inner + .wire_build_asset_tx__static_method__Api( + port_, arg0, arg1, arg2, arg3, arg4), + parseSuccessData: _wire2api_String, + parseErrorData: _wire2api_lwk_error, + constMeta: kBuildAssetTxStaticMethodApiConstMeta, + argValues: [walletId, sats, outAddress, absFee, assetId], + hint: hint, + )); + } + + FlutterRustBridgeTaskConstMeta get kBuildAssetTxStaticMethodApiConstMeta => + const FlutterRustBridgeTaskConstMeta( + debugName: "build_asset_tx__static_method__Api", + argNames: ["walletId", "sats", "outAddress", "absFee", "assetId"], + ); + Future decodeTxStaticMethodApi( {required String walletId, required String pset, dynamic hint}) { var arg0 = _platform.api2wire_String(walletId); @@ -607,6 +705,24 @@ class LwkBridgeWire implements FlutterRustBridgeWireBase { _wire_new_descriptor__static_method__ApiPtr .asFunction)>(); + void wire_blinding_key__static_method__Api( + int port_, + ffi.Pointer wallet_id, + ) { + return _wire_blinding_key__static_method__Api( + port_, + wallet_id, + ); + } + + late final _wire_blinding_key__static_method__ApiPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Int64, ffi.Pointer)>>( + 'wire_blinding_key__static_method__Api'); + late final _wire_blinding_key__static_method__Api = + _wire_blinding_key__static_method__ApiPtr + .asFunction)>(); + void wire_new_wallet__static_method__Api( int port_, int network, @@ -711,6 +827,51 @@ class LwkBridgeWire implements FlutterRustBridgeWireBase { _wire_address__static_method__ApiPtr .asFunction, int)>(); + void wire_validate_address__static_method__Api( + int port_, + ffi.Pointer address_string, + ) { + return _wire_validate_address__static_method__Api( + port_, + address_string, + ); + } + + late final _wire_validate_address__static_method__ApiPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Int64, ffi.Pointer)>>( + 'wire_validate_address__static_method__Api'); + late final _wire_validate_address__static_method__Api = + _wire_validate_address__static_method__ApiPtr + .asFunction)>(); + + void wire_address_from_script__static_method__Api( + int port_, + int network, + ffi.Pointer script, + ffi.Pointer blinding_key, + ) { + return _wire_address_from_script__static_method__Api( + port_, + network, + script, + blinding_key, + ); + } + + late final _wire_address_from_script__static_method__ApiPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Int64, + ffi.Int32, + ffi.Pointer, + ffi.Pointer)>>( + 'wire_address_from_script__static_method__Api'); + late final _wire_address_from_script__static_method__Api = + _wire_address_from_script__static_method__ApiPtr.asFunction< + void Function(int, int, ffi.Pointer, + ffi.Pointer)>(); + void wire_balance__static_method__Api( int port_, ffi.Pointer wallet_id, @@ -746,14 +907,14 @@ class LwkBridgeWire implements FlutterRustBridgeWireBase { late final _wire_txs__static_method__Api = _wire_txs__static_method__ApiPtr .asFunction)>(); - void wire_build_tx__static_method__Api( + void wire_build_lbtc_tx__static_method__Api( int port_, ffi.Pointer wallet_id, int sats, ffi.Pointer out_address, double abs_fee, ) { - return _wire_build_tx__static_method__Api( + return _wire_build_lbtc_tx__static_method__Api( port_, wallet_id, sats, @@ -762,19 +923,57 @@ class LwkBridgeWire implements FlutterRustBridgeWireBase { ); } - late final _wire_build_tx__static_method__ApiPtr = _lookup< + late final _wire_build_lbtc_tx__static_method__ApiPtr = _lookup< ffi.NativeFunction< ffi.Void Function( ffi.Int64, ffi.Pointer, ffi.Uint64, ffi.Pointer, - ffi.Float)>>('wire_build_tx__static_method__Api'); - late final _wire_build_tx__static_method__Api = - _wire_build_tx__static_method__ApiPtr.asFunction< + ffi.Float)>>('wire_build_lbtc_tx__static_method__Api'); + late final _wire_build_lbtc_tx__static_method__Api = + _wire_build_lbtc_tx__static_method__ApiPtr.asFunction< void Function(int, ffi.Pointer, int, ffi.Pointer, double)>(); + void wire_build_asset_tx__static_method__Api( + int port_, + ffi.Pointer wallet_id, + int sats, + ffi.Pointer out_address, + double abs_fee, + ffi.Pointer asset_id, + ) { + return _wire_build_asset_tx__static_method__Api( + port_, + wallet_id, + sats, + out_address, + abs_fee, + asset_id, + ); + } + + late final _wire_build_asset_tx__static_method__ApiPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Int64, + ffi.Pointer, + ffi.Uint64, + ffi.Pointer, + ffi.Float, + ffi.Pointer)>>( + 'wire_build_asset_tx__static_method__Api'); + late final _wire_build_asset_tx__static_method__Api = + _wire_build_asset_tx__static_method__ApiPtr.asFunction< + void Function( + int, + ffi.Pointer, + int, + ffi.Pointer, + double, + ffi.Pointer)>(); + void wire_decode_tx__static_method__Api( int port_, ffi.Pointer wallet_id, diff --git a/lib/src/generated/bridge_definitions.dart b/lib/src/generated/bridge_definitions.dart index a351b86..1e00d01 100644 --- a/lib/src/generated/bridge_definitions.dart +++ b/lib/src/generated/bridge_definitions.dart @@ -14,6 +14,11 @@ abstract class LwkBridge { FlutterRustBridgeTaskConstMeta get kNewDescriptorStaticMethodApiConstMeta; + Future blindingKeyStaticMethodApi( + {required String walletId, dynamic hint}); + + FlutterRustBridgeTaskConstMeta get kBlindingKeyStaticMethodApiConstMeta; + Future newWalletStaticMethodApi( {required Network network, required String dbPath, @@ -42,6 +47,19 @@ abstract class LwkBridge { FlutterRustBridgeTaskConstMeta get kAddressStaticMethodApiConstMeta; + Future validateAddressStaticMethodApi( + {required String addressString, dynamic hint}); + + FlutterRustBridgeTaskConstMeta get kValidateAddressStaticMethodApiConstMeta; + + Future
addressFromScriptStaticMethodApi( + {required Network network, + required String script, + required String blindingKey, + dynamic hint}); + + FlutterRustBridgeTaskConstMeta get kAddressFromScriptStaticMethodApiConstMeta; + Future> balanceStaticMethodApi( {required String walletId, dynamic hint}); @@ -51,14 +69,24 @@ abstract class LwkBridge { FlutterRustBridgeTaskConstMeta get kTxsStaticMethodApiConstMeta; - Future buildTxStaticMethodApi( + Future buildLbtcTxStaticMethodApi( + {required String walletId, + required int sats, + required String outAddress, + required double absFee, + dynamic hint}); + + FlutterRustBridgeTaskConstMeta get kBuildLbtcTxStaticMethodApiConstMeta; + + Future buildAssetTxStaticMethodApi( {required String walletId, required int sats, required String outAddress, required double absFee, + required String assetId, dynamic hint}); - FlutterRustBridgeTaskConstMeta get kBuildTxStaticMethodApiConstMeta; + FlutterRustBridgeTaskConstMeta get kBuildAssetTxStaticMethodApiConstMeta; Future decodeTxStaticMethodApi( {required String walletId, required String pset, dynamic hint}); diff --git a/lib/src/root.dart b/lib/src/root.dart index 9e78a19..ac891a8 100644 --- a/lib/src/root.dart +++ b/lib/src/root.dart @@ -131,6 +131,17 @@ class Wallet { } } + Future blinding_key() async { + try { + final res = await ffi.blindingKeyStaticMethodApi( + walletId: _liquidWallet, + ); + return res; + } catch (e) { + rethrow; + } + } + Future balance() async { try { final res = await ffi.balanceStaticMethodApi(walletId: _liquidWallet); @@ -149,12 +160,13 @@ class Wallet { } } - Future build( - {required int sats, - required String outAddress, - required double absFee}) async { + Future build_lbtc_tx({ + required int sats, + required String outAddress, + required double absFee, + }) async { try { - final res = await ffi.buildTxStaticMethodApi( + final res = await ffi.buildLbtcTxStaticMethodApi( walletId: _liquidWallet, sats: sats, outAddress: outAddress, @@ -166,10 +178,32 @@ class Wallet { } } + Future build_asset_tx({ + required int sats, + required String outAddress, + required double absFee, + required String assetId, + }) async { + try { + final res = await ffi.buildAssetTxStaticMethodApi( + walletId: _liquidWallet, + sats: sats, + outAddress: outAddress, + absFee: absFee, + assetId: assetId, + ); + return res; + } catch (e) { + rethrow; + } + } + Future decode({required String pset}) async { try { final res = await ffi.decodeTxStaticMethodApi( - walletId: _liquidWallet, pset: pset); + walletId: _liquidWallet, + pset: pset, + ); return res; } catch (e) { rethrow; @@ -194,8 +228,10 @@ class Wallet { } } - Future broadcast( - {required String electrumUrl, required Uint8List txBytes}) async { + Future broadcast({ + required String electrumUrl, + required Uint8List txBytes, + }) async { try { final res = await ffi.broadcastTxStaticMethodApi( electrumUrl: electrumUrl, txBytes: txBytes); @@ -205,3 +241,33 @@ class Wallet { } } } + +Future
scriptToAddress({ + required Network network, + required String script, + String? blindingKey, +}) async { + try { + final res = await ffi.addressFromScriptStaticMethodApi( + script: script, + network: network, + blindingKey: blindingKey ?? "", + ); + return res; + } catch (e) { + rethrow; + } +} + +Future validateAddress({ + required String address, +}) async { + try { + final res = await ffi.validateAddressStaticMethodApi( + addressString: address, + ); + return res; + } catch (e) { + rethrow; + } +} diff --git a/macos/Classes/bindings.h b/macos/Classes/bindings.h index de8e227..93d4084 100644 --- a/macos/Classes/bindings.h +++ b/macos/Classes/bindings.h @@ -30,6 +30,8 @@ void wire_new_descriptor__static_method__Api(int64_t port_, int32_t network, struct wire_uint_8_list *mnemonic); +void wire_blinding_key__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); + void wire_new_wallet__static_method__Api(int64_t port_, int32_t network, struct wire_uint_8_list *db_path, @@ -48,15 +50,30 @@ void wire_address__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id, uint32_t index); +void wire_validate_address__static_method__Api(int64_t port_, + struct wire_uint_8_list *address_string); + +void wire_address_from_script__static_method__Api(int64_t port_, + int32_t network, + struct wire_uint_8_list *script, + struct wire_uint_8_list *blinding_key); + void wire_balance__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); void wire_txs__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id); -void wire_build_tx__static_method__Api(int64_t port_, - struct wire_uint_8_list *wallet_id, - uint64_t sats, - struct wire_uint_8_list *out_address, - float abs_fee); +void wire_build_lbtc_tx__static_method__Api(int64_t port_, + struct wire_uint_8_list *wallet_id, + uint64_t sats, + struct wire_uint_8_list *out_address, + float abs_fee); + +void wire_build_asset_tx__static_method__Api(int64_t port_, + struct wire_uint_8_list *wallet_id, + uint64_t sats, + struct wire_uint_8_list *out_address, + float abs_fee, + struct wire_uint_8_list *asset_id); void wire_decode_tx__static_method__Api(int64_t port_, struct wire_uint_8_list *wallet_id, @@ -79,14 +96,18 @@ void free_WireSyncReturn(WireSyncReturn ptr); static int64_t dummy_method_to_enforce_bundling(void) { int64_t dummy_var = 0; dummy_var ^= ((int64_t) (void*) wire_new_descriptor__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_blinding_key__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_new_wallet__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_sync__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_wallet_descriptor__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_address_last_unused__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_address__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_validate_address__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_address_from_script__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_balance__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_txs__static_method__Api); - dummy_var ^= ((int64_t) (void*) wire_build_tx__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_build_lbtc_tx__static_method__Api); + dummy_var ^= ((int64_t) (void*) wire_build_asset_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_decode_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_sign_tx__static_method__Api); dummy_var ^= ((int64_t) (void*) wire_broadcast_tx__static_method__Api); diff --git a/pubspec.yaml b/pubspec.yaml index 5ce1101..862fc2b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "Dart/Flutter language bindings for Liquid Wallet Kit" publish_to: 'none' -version: 0.1.0 +version: 0.1.2 environment: sdk: '>=3.2.0 <4.0.0' diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 1f20c91..ff2b6a8 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -139,9 +139,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" dependencies = [ "backtrace", ] @@ -217,9 +217,9 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd00f3c09b5f21fb357abe32d29946eb8bb7a0862bae62c0b5e4a692acbbe73c" +checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" dependencies = [ "base64 0.21.7", "bech32", @@ -283,9 +283,9 @@ checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" @@ -351,9 +351,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" [[package]] name = "cfg-if" @@ -363,16 +363,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -418,7 +418,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex 0.7.0", - "strsim 0.11.0", + "strsim 0.11.1", ] [[package]] @@ -430,7 +430,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -522,14 +522,14 @@ checksum = "51aac4c99b2e6775164b412ea33ae8441b2fde2dbf05a20bc0052a63d08c475b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "electrum-client" @@ -589,19 +589,19 @@ checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "enum_dispatch" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -683,7 +683,7 @@ dependencies = [ "serde", "serde_yaml", "strum_macros", - "syn 2.0.55", + "syn 2.0.59", "tempfile", "thiserror", "toml", @@ -708,9 +708,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", @@ -900,7 +900,7 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lwk-bridge" -version = "0.1.1" +version = "0.1.2" dependencies = [ "anyhow", "elements", @@ -1011,9 +1011,9 @@ dependencies = [ [[package]] name = "minreq" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3371dfc7b772c540da1380123674a8e20583aca99907087d990ca58cf44203" +checksum = "00a000cf8bbbfb123a9bdc66b61c2885a4bb038df4f2629884caafabeb76b0f9" dependencies = [ "log", "once_cell", @@ -1101,9 +1101,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "polyval" @@ -1125,18 +1125,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -1267,9 +1267,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" [[package]] name = "ryu" @@ -1382,7 +1382,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -1428,9 +1428,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum_macros" @@ -1464,9 +1464,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" dependencies = [ "proc-macro2", "quote", @@ -1517,7 +1517,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -1578,7 +1578,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -1672,7 +1672,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "wasm-bindgen-shared", ] @@ -1694,7 +1694,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1758,7 +1758,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1767,7 +1767,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -1787,17 +1787,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -1808,9 +1809,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -1820,9 +1821,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -1832,9 +1833,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -1844,9 +1851,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -1856,9 +1863,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -1868,9 +1875,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -1880,9 +1887,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "yaml-rust" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 051a162..7888f1b 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -2,7 +2,7 @@ name = "lwk-bridge" description = "Flutter-Rust Bridge for Liquid Wallet Kit (lwk)" authors = ["i5hi , mocodesmo "] -version = "0.1.1" +version = "0.1.2" edition = "2021" [lib] @@ -16,16 +16,19 @@ lwk_signer = { version = "0.2.0" } lwk_common = {version = "0.2.0" } thiserror = "1.0.50" elements = "0.24.0" -flutter_rust_bridge = "1.82.6" +flutter_rust_bridge = "1.82.2" anyhow = "1.0.68" lazy_static = "1.4.0" [build-dependencies] -flutter_rust_bridge_codegen = { version = "= 1.82.6" } +flutter_rust_bridge_codegen = { version = "= 1.82.6" } + +[build] +profiler = true [profile.release] strip = true opt-level = "z" lto = true codegen-units = 1 -panic = "abort" +panic = "abort" \ No newline at end of file diff --git a/rust/src/api.rs b/rust/src/api.rs index 8273f5f..71d28c6 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -1,12 +1,16 @@ +use std::str::FromStr; + pub use crate::error::LwkError; pub use crate::network::Network; use crate::types::{Address, Balances}; pub use crate::types::{PsetAmounts, Tx}; pub use crate::wallet::Wallet; +use elements::hex::FromHex; use elements::pset::serialize::Deserialize; +// use elements::{ Transaction}; +use elements::{secp256k1_zkp, Address as LwkAddress, AddressParams, Transaction, Script}; -use elements::Transaction; use elements::Txid; use lwk_wollet::{BlockchainBackend, ElectrumClient}; pub struct Api {} @@ -19,6 +23,10 @@ impl Api { Ok(Wallet::new_descriptor(network, &mnemonic)?.into()) } + pub fn blinding_key(wallet_id: String) -> anyhow::Result { + Ok(Wallet::retrieve_wallet(wallet_id).get_wollet().descriptor().key.to_string()) + } + pub fn new_wallet( network: Network, db_path: String, @@ -43,6 +51,47 @@ impl Api { Wallet::retrieve_wallet(wallet_id).address(index) } + pub fn validate_address(address_string: String) -> anyhow::Result<(), LwkError> { + LwkAddress::from_str(&address_string)?; + Ok(()) + } + + pub fn address_from_script(network: Network, script: String, blinding_key: String) -> anyhow::Result { + let blinding_key = if blinding_key == "".to_string() { + None + } else { + let pubkey = match secp256k1_zkp::PublicKey::from_str(&blinding_key){ + Ok(result)=> result, + Err(e)=>return Err(LwkError { msg: e.to_string() }), + }; + Some(pubkey) + }; + let script_pubkey = match Script::from_hex(&script) { + Ok(result)=> result, + Err(e)=> return Err(LwkError { msg: e.to_string() }), + }; + + let address = LwkAddress::from_script( + &script_pubkey, + blinding_key, + match network { + Network::Mainnet=>&AddressParams::LIQUID, + Network::Testnet=>&AddressParams::LIQUID_TESTNET + }, + ); + if address.is_none(){ + Err(LwkError { msg: "Could not convert script to address".to_string() }) + } + else{ + + Ok(Address { + standard: address.clone().unwrap().to_unconfidential().to_string(), + confidential: address.unwrap().to_string(), + index: 0 + }) + } + } + pub fn balance(wallet_id: String) -> anyhow::Result { Wallet::retrieve_wallet(wallet_id).balances() } @@ -51,13 +100,23 @@ impl Api { Wallet::retrieve_wallet(wallet_id).txs() } - pub fn build_tx( + pub fn build_lbtc_tx( wallet_id: String, sats: u64, out_address: String, abs_fee: f32, ) -> anyhow::Result { - Wallet::retrieve_wallet(wallet_id).build_tx(sats, out_address, abs_fee) + Wallet::retrieve_wallet(wallet_id).build_lbtc_tx(sats, out_address, abs_fee) + } + + pub fn build_asset_tx( + wallet_id: String, + sats: u64, + out_address: String, + abs_fee: f32, + asset_id: String + ) -> anyhow::Result { + Wallet::retrieve_wallet(wallet_id).build_asset_tx(sats, out_address, abs_fee, asset_id) } pub fn decode_tx(wallet_id: String, pset: String) -> anyhow::Result { @@ -87,8 +146,6 @@ impl Api { #[cfg(test)] mod test { - use elements::{Address, AddressParams}; - use super::*; #[test] fn test_api() { @@ -102,59 +159,37 @@ mod test { ElectrumClient::new(&lwk_wollet::ElectrumUrl::Tls(electrum_url.clone(), false)) .unwrap(); let dbpath = "/tmp/lwk".to_string(); - let wallet_id = Api::new_wallet(network, dbpath,mnemonic.clone()).unwrap(); - + let desc = Api::new_descriptor(network,mnemonic.clone()).unwrap(); + let wallet_id = Api::new_wallet(network, dbpath, desc.clone()).unwrap(); Api::sync(wallet_id.clone(), electrum_url.clone()).unwrap(); - // let wollet: Wollet = Wollet::new(network.into(), Some(&dbpath), &desc).unwrap(); let address = Api::address_last_unused(wallet_id.clone()).unwrap(); println!("ADDRESS: {:#?}", address); let pre_balance: Balances = Api::balance(wallet_id.clone()).unwrap(); println!("BALANCES: {:#?}", pre_balance); - let wallet = Wallet::retrieve_wallet(wallet_id.clone()); - let wollet = wallet.get_wollet(); - let txs_test = wollet.transactions().unwrap(); - println!("TXs:"); + let txs_test = Api::txs(wallet_id.clone()).unwrap(); + println!("Total Txs: {}", txs_test.len()); for tx in txs_test { - for output in tx.outputs { - if output.is_some() { - let script_pubkey = output.clone().unwrap().script_pubkey; - let amount = output.clone().unwrap().unblinded.value; - let b_pubkey = None; - let address = Address::from_script( - &script_pubkey, - b_pubkey, - &AddressParams::LIQUID_TESTNET, - ) - .unwrap(); - println!("amount:{:?},address:{:?}", amount, address); - } - } + println!("type: {:?}", tx.kind); + // for output in tx.outputs { + // // let amount = output.clone().unblinded.value; + // // let address = Api::address_from_script(Network::Testnet, output.clone().script_pubkey,"".to_string()).unwrap(); + // // println!("amount:{:?},address:{:?}", amount, address.standard); + // } } // build tx - let sats = 10000; + let sats = 11349; let out_address="tlq1qqt4hjkl6sug5ld89sdaekt7ew04va8w7c63adw07l33vcx86vpj5th3w7rkdnckmfpraufnnrfcep4thqt6024phuav99djeu".to_string(); let fee_rate = 300.0; - let pset = Api::build_tx(wallet_id.clone(), sats, out_address, fee_rate).unwrap(); + let pset = Api::build_lbtc_tx(wallet_id.clone(), sats, out_address, fee_rate).unwrap(); let decoded = Api::decode_tx(wallet_id.clone(), pset.clone()).unwrap(); - println!("DECODED TX: {:#?}", decoded); + // println!("DECODED TX: {:#?}", decoded); //sign tx - let tx = Api::sign_tx(wallet_id.clone(), network, pset, mnemonic).unwrap(); - println!("RAW TX: {:#?}", tx); + // let tx = Api::sign_tx(wallet_id.clone(), network, pset, mnemonic).unwrap(); + // println!("RAW TX: {:#?}", tx); //broadcast tx - let txid = Api::broadcast_tx(electrum_url.clone(), tx).unwrap(); - println!("SEND: TXID: {:#?}", txid); - Api::sync(wallet_id.clone(), electrum_url.clone()).unwrap(); - let txs = Api::txs(wallet_id.clone()).unwrap(); - for tx in txs { - if tx.txid == txid { - // let fees = tx.fee; - // let post_balance: Balances = Api::balance(wallet_id.clone()).unwrap(); - // assert_eq!( - // (post_balance.lbtc), - // (pre_balance.lbtc - (sats as i64 + fees as i64)) - // ); - } - } + // let txid = Api::broadcast_tx(electrum_url.clone(), tx).unwrap(); + // println!("SEND: TXID: {:#?}", txid); + } } diff --git a/rust/src/bridge_generated.io.rs b/rust/src/bridge_generated.io.rs index e696d0c..ca83c76 100644 --- a/rust/src/bridge_generated.io.rs +++ b/rust/src/bridge_generated.io.rs @@ -10,6 +10,14 @@ pub extern "C" fn wire_new_descriptor__static_method__Api( wire_new_descriptor__static_method__Api_impl(port_, network, mnemonic) } +#[no_mangle] +pub extern "C" fn wire_blinding_key__static_method__Api( + port_: i64, + wallet_id: *mut wire_uint_8_list, +) { + wire_blinding_key__static_method__Api_impl(port_, wallet_id) +} + #[no_mangle] pub extern "C" fn wire_new_wallet__static_method__Api( port_: i64, @@ -54,6 +62,24 @@ pub extern "C" fn wire_address__static_method__Api( wire_address__static_method__Api_impl(port_, wallet_id, index) } +#[no_mangle] +pub extern "C" fn wire_validate_address__static_method__Api( + port_: i64, + address_string: *mut wire_uint_8_list, +) { + wire_validate_address__static_method__Api_impl(port_, address_string) +} + +#[no_mangle] +pub extern "C" fn wire_address_from_script__static_method__Api( + port_: i64, + network: i32, + script: *mut wire_uint_8_list, + blinding_key: *mut wire_uint_8_list, +) { + wire_address_from_script__static_method__Api_impl(port_, network, script, blinding_key) +} + #[no_mangle] pub extern "C" fn wire_balance__static_method__Api(port_: i64, wallet_id: *mut wire_uint_8_list) { wire_balance__static_method__Api_impl(port_, wallet_id) @@ -65,14 +91,33 @@ pub extern "C" fn wire_txs__static_method__Api(port_: i64, wallet_id: *mut wire_ } #[no_mangle] -pub extern "C" fn wire_build_tx__static_method__Api( +pub extern "C" fn wire_build_lbtc_tx__static_method__Api( + port_: i64, + wallet_id: *mut wire_uint_8_list, + sats: u64, + out_address: *mut wire_uint_8_list, + abs_fee: f32, +) { + wire_build_lbtc_tx__static_method__Api_impl(port_, wallet_id, sats, out_address, abs_fee) +} + +#[no_mangle] +pub extern "C" fn wire_build_asset_tx__static_method__Api( port_: i64, wallet_id: *mut wire_uint_8_list, sats: u64, out_address: *mut wire_uint_8_list, abs_fee: f32, + asset_id: *mut wire_uint_8_list, ) { - wire_build_tx__static_method__Api_impl(port_, wallet_id, sats, out_address, abs_fee) + wire_build_asset_tx__static_method__Api_impl( + port_, + wallet_id, + sats, + out_address, + abs_fee, + asset_id, + ) } #[no_mangle] diff --git a/rust/src/bridge_generated.rs b/rust/src/bridge_generated.rs index a02422a..e3aa3e5 100644 --- a/rust/src/bridge_generated.rs +++ b/rust/src/bridge_generated.rs @@ -50,6 +50,22 @@ fn wire_new_descriptor__static_method__Api_impl( }, ) } +fn wire_blinding_key__static_method__Api_impl( + port_: MessagePort, + wallet_id: impl Wire2Api + UnwindSafe, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, String, _>( + WrapInfo { + debug_name: "blinding_key__static_method__Api", + port: Some(port_), + mode: FfiCallMode::Normal, + }, + move || { + let api_wallet_id = wallet_id.wire2api(); + move |task_callback| Api::blinding_key(api_wallet_id) + }, + ) +} fn wire_new_wallet__static_method__Api_impl( port_: MessagePort, network: impl Wire2Api + UnwindSafe, @@ -138,6 +154,42 @@ fn wire_address__static_method__Api_impl( }, ) } +fn wire_validate_address__static_method__Api_impl( + port_: MessagePort, + address_string: impl Wire2Api + UnwindSafe, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, (), _>( + WrapInfo { + debug_name: "validate_address__static_method__Api", + port: Some(port_), + mode: FfiCallMode::Normal, + }, + move || { + let api_address_string = address_string.wire2api(); + move |task_callback| Api::validate_address(api_address_string) + }, + ) +} +fn wire_address_from_script__static_method__Api_impl( + port_: MessagePort, + network: impl Wire2Api + UnwindSafe, + script: impl Wire2Api + UnwindSafe, + blinding_key: impl Wire2Api + UnwindSafe, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, Address, _>( + WrapInfo { + debug_name: "address_from_script__static_method__Api", + port: Some(port_), + mode: FfiCallMode::Normal, + }, + move || { + let api_network = network.wire2api(); + let api_script = script.wire2api(); + let api_blinding_key = blinding_key.wire2api(); + move |task_callback| Api::address_from_script(api_network, api_script, api_blinding_key) + }, + ) +} fn wire_balance__static_method__Api_impl( port_: MessagePort, wallet_id: impl Wire2Api + UnwindSafe, @@ -170,16 +222,41 @@ fn wire_txs__static_method__Api_impl( }, ) } -fn wire_build_tx__static_method__Api_impl( +fn wire_build_lbtc_tx__static_method__Api_impl( + port_: MessagePort, + wallet_id: impl Wire2Api + UnwindSafe, + sats: impl Wire2Api + UnwindSafe, + out_address: impl Wire2Api + UnwindSafe, + abs_fee: impl Wire2Api + UnwindSafe, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, String, _>( + WrapInfo { + debug_name: "build_lbtc_tx__static_method__Api", + port: Some(port_), + mode: FfiCallMode::Normal, + }, + move || { + let api_wallet_id = wallet_id.wire2api(); + let api_sats = sats.wire2api(); + let api_out_address = out_address.wire2api(); + let api_abs_fee = abs_fee.wire2api(); + move |task_callback| { + Api::build_lbtc_tx(api_wallet_id, api_sats, api_out_address, api_abs_fee) + } + }, + ) +} +fn wire_build_asset_tx__static_method__Api_impl( port_: MessagePort, wallet_id: impl Wire2Api + UnwindSafe, sats: impl Wire2Api + UnwindSafe, out_address: impl Wire2Api + UnwindSafe, abs_fee: impl Wire2Api + UnwindSafe, + asset_id: impl Wire2Api + UnwindSafe, ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, String, _>( WrapInfo { - debug_name: "build_tx__static_method__Api", + debug_name: "build_asset_tx__static_method__Api", port: Some(port_), mode: FfiCallMode::Normal, }, @@ -188,8 +265,15 @@ fn wire_build_tx__static_method__Api_impl( let api_sats = sats.wire2api(); let api_out_address = out_address.wire2api(); let api_abs_fee = abs_fee.wire2api(); + let api_asset_id = asset_id.wire2api(); move |task_callback| { - Api::build_tx(api_wallet_id, api_sats, api_out_address, api_abs_fee) + Api::build_asset_tx( + api_wallet_id, + api_sats, + api_out_address, + api_abs_fee, + api_asset_id, + ) } }, ) diff --git a/rust/src/types.rs b/rust/src/types.rs index 99a2485..a12c452 100644 --- a/rust/src/types.rs +++ b/rust/src/types.rs @@ -1,4 +1,5 @@ -use elements::{ AssetId, TxOutSecrets as LwkTxOutSecrets, OutPoint as LwkOutPoint}; +use elements::hex::ToHex; +use elements::AssetId; use lwk_common::PsetBalance; use lwk_wollet::{AddressResult, WalletTx}; use std::collections::HashMap; @@ -20,6 +21,7 @@ impl From for Balances { } use std::convert::TryFrom; +use std::time::{SystemTime, UNIX_EPOCH}; impl From for Balances { fn from(asset_id_map: AssetIdMapUInt) -> Self { @@ -64,6 +66,7 @@ impl From for Address { } } + #[derive(Clone, Debug, PartialEq)] pub struct OutPoint { pub txid: String, @@ -106,7 +109,7 @@ impl From for Tx { if output.is_some() { // safe to unwrap let script_pubkey = output.clone().unwrap().script_pubkey; outputs.push(TxOut { - script_pubkey:script_pubkey.to_string(), + script_pubkey:script_pubkey.to_hex(), height: output.clone().unwrap().height, unblinded: TxOutSecrets { value: output.clone().unwrap().unblinded.value, @@ -141,6 +144,9 @@ impl From for Tx { }) } } + let now = SystemTime::now(); + let since_the_epoch = now.duration_since(UNIX_EPOCH) + .expect("Time went backwards"); Tx { kind: wallet_tx.type_, balances: Balances::from(AssetIdMapInt(wallet_tx @@ -149,7 +155,7 @@ impl From for Tx { outputs: outputs, inputs: inputs, fee: wallet_tx.fee, - timestamp: wallet_tx.timestamp.unwrap(), + timestamp: wallet_tx.timestamp.unwrap_or(since_the_epoch.as_secs() as u32), } } } @@ -168,13 +174,3 @@ impl From for PsetAmounts { } } - -#[cfg(test)] -mod test { - - #[test] - fn test_types() { - - - } -} diff --git a/rust/src/wallet.rs b/rust/src/wallet.rs index f877c10..6333cd1 100644 --- a/rust/src/wallet.rs +++ b/rust/src/wallet.rs @@ -6,6 +6,7 @@ use lwk_signer::SwSigner; use lwk_wollet::AddressResult; use lwk_wollet::ElectrumClient; use lwk_wollet::ElementsNetwork; +use lwk_wollet::EncryptedFsPersister; use lwk_wollet::Update; use std::collections::HashMap; @@ -17,7 +18,7 @@ use crate::types::{Balances, Tx}; use crate::types::Address; use crate::{error::LwkError, network::Network}; use lwk_wollet::BlockchainBackend; -use lwk_wollet::{EncryptedFsPersister, Wollet, WolletDescriptor}; +use lwk_wollet::{ Wollet, WolletDescriptor}; use std::str::FromStr; //const TLBTC_ASSET_ID: &str = "144c654344aa716d6f3abcc1ca90e5641e4e2a7f633bc09fe3baf64585819a49"; use lazy_static::lazy_static; @@ -71,7 +72,7 @@ impl Wallet { let wollet = Wollet::new( network.into(), EncryptedFsPersister::new(dbpath, network.into(), &descriptor)?, - &desc_str, + &descriptor.clone().to_string(), )?; let wallet = Wallet { inner: Mutex::new(wollet), @@ -127,7 +128,7 @@ impl Wallet { Ok(txs) } - pub fn build_tx( + pub fn build_lbtc_tx( &self, sats: u64, out_address: String, @@ -139,6 +140,19 @@ impl Wallet { Ok(pset.to_string()) } + pub fn build_asset_tx( + &self, + sats: u64, + out_address: String, + abs_fee: f32, + asset: String, + ) -> anyhow::Result { + let pset: PartiallySignedTransaction = + self.get_wollet() + .send_asset(sats, &out_address, &asset, Some(abs_fee))?; + Ok(pset.to_string()) + } + pub fn decode_tx(&self, pset: String) -> anyhow::Result { let mut pset = PartiallySignedTransaction::from_str(&pset)?; let pset_details = self.get_wollet().get_details(&mut pset)?; diff --git a/test/lwk_root_test.dart b/test/lwk_root_test.dart index 373e75b..15a715c 100644 --- a/test/lwk_root_test.dart +++ b/test/lwk_root_test.dart @@ -35,7 +35,7 @@ void main() { for (final tx in txs) { print('${tx.txid}:${tx.balances} ${tx.timestamp}'); } - final pset = await wallet.build( + final pset = await wallet.build_lbtc_tx( sats: outAmount, outAddress: outAddress, absFee: absFee); final decodedPset = await wallet.decode(pset: pset); print("Amount: ${decodedPset.balances} , Fee: ${decodedPset.fee}"); diff --git a/test/lwk_static_test.dart b/test/lwk_static_test.dart index 9d74003..e601678 100644 --- a/test/lwk_static_test.dart +++ b/test/lwk_static_test.dart @@ -41,7 +41,7 @@ void main() { "tlq1qqt4hjkl6sug5ld89sdaekt7ew04va8w7c63adw07l33vcx86vpj5th3w7rkdnckmfpraufnnrfcep4thqt6024phuav99djeu"; const outAmount = 1000; const fee = 300.0; - final pset = await ffi.buildTxStaticMethodApi( + final pset = await ffi.buildLbtcTxStaticMethodApi( walletId: walletId, sats: outAmount, outAddress: outAddress,