Skip to content

Commit 6219c0f

Browse files
authored
fix: ledger build (#686)
1 parent 70de7d0 commit 6219c0f

File tree

16 files changed

+164
-128
lines changed

16 files changed

+164
-128
lines changed

lib/pages/tx.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:showcaseview/showcaseview.dart';
1212
import 'package:zkool/main.dart';
1313
import 'package:zkool/pages/raptor.dart';
1414
import 'package:zkool/src/rust/api/account.dart';
15+
import 'package:zkool/src/rust/api/ledger.dart';
1516
import 'package:zkool/src/rust/api/mempool.dart';
1617
import 'package:zkool/src/rust/api/pay.dart';
1718
import 'package:zkool/src/rust/pay.dart';
@@ -142,7 +143,7 @@ class TxPageState extends ConsumerState<TxPage> {
142143
if (!txPlan.canBroadcast) {
143144
if (account!.hw != 0) {
144145
final comp = Completer();
145-
signLedgerTransaction(pczt: widget.pczt, c: c).listen((e) {
146+
signLedgerTransaction(package: widget.pczt, c: c).listen((e) {
146147
switch (e) {
147148
case SigningEvent_Progress p:
148149
showSnackbar(p.field0);

lib/src/rust/api/ledger.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// This file is automatically generated, so please do not edit it.
2+
// @generated by `flutter_rust_bridge`@ 2.11.1.
3+
4+
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
5+
6+
import '../frb_generated.dart';
7+
import '../lib.dart';
8+
import 'coin.dart';
9+
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
10+
import 'pay.dart';
11+
12+
// These functions are ignored because they are not marked as `pub`: `get_hw_fvk`, `get_hw_next_diversifier_address`, `get_hw_sapling_address`, `get_hw_transparent_address`, `show_sapling_address`, `show_transparent_address`
13+
14+
Stream<SigningEvent> signLedgerTransaction(
15+
{required PcztPackage package, required Coin c}) =>
16+
RustLib.instance.api
17+
.crateApiLedgerSignLedgerTransaction(package: package, c: c);

lib/src/rust/api/pay.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ Future<PcztPackage> signTransaction(
2727
{required PcztPackage pczt, required Coin c}) =>
2828
RustLib.instance.api.crateApiPaySignTransaction(pczt: pczt, c: c);
2929

30-
Stream<SigningEvent> signLedgerTransaction(
31-
{required PcztPackage pczt, required Coin c}) =>
32-
RustLib.instance.api.crateApiPaySignLedgerTransaction(pczt: pczt, c: c);
33-
3430
Future<Uint8List> extractTransaction({required PcztPackage package}) =>
3531
RustLib.instance.api.crateApiPayExtractTransaction(package: package);
3632

lib/src/rust/frb_generated.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'api/db.dart';
99
import 'api/frost.dart';
1010
import 'api/init.dart';
1111
import 'api/key.dart';
12+
import 'api/ledger.dart';
1213
import 'api/mempool.dart';
1314
import 'api/network.dart';
1415
import 'api/pay.dart';
@@ -86,7 +87,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
8687
String get codegenVersion => '2.11.1';
8788

8889
@override
89-
int get rustContentHash => -630031502;
90+
int get rustContentHash => -1609636081;
9091

9192
static const kDefaultExternalLibraryLoaderConfig =
9293
ExternalLibraryLoaderConfig(
@@ -382,8 +383,8 @@ abstract class RustLibApi extends BaseApi {
382383

383384
Future<String> crateApiAccountShowLedgerTransparentAddress({required Coin c});
384385

385-
Stream<SigningEvent> crateApiPaySignLedgerTransaction(
386-
{required PcztPackage pczt, required Coin c});
386+
Stream<SigningEvent> crateApiLedgerSignLedgerTransaction(
387+
{required PcztPackage package, required Coin c});
387388

388389
Future<PcztPackage> crateApiPaySignTransaction(
389390
{required PcztPackage pczt, required Coin c});
@@ -3523,16 +3524,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
35233524
);
35243525

35253526
@override
3526-
Stream<SigningEvent> crateApiPaySignLedgerTransaction(
3527-
{required PcztPackage pczt, required Coin c}) {
3527+
Stream<SigningEvent> crateApiLedgerSignLedgerTransaction(
3528+
{required PcztPackage package, required Coin c}) {
35283529
final sink = RustStreamSink<SigningEvent>();
35293530
unawaited(
35303531
handler.executeNormal(
35313532
NormalTask(
35323533
callFfi: (port_) {
35333534
final serializer = SseSerializer(generalizedFrbRustBinding);
35343535
sse_encode_StreamSink_signing_event_Sse(sink, serializer);
3535-
sse_encode_box_autoadd_pczt_package(pczt, serializer);
3536+
sse_encode_box_autoadd_pczt_package(package, serializer);
35363537
sse_encode_box_autoadd_coin(c, serializer);
35373538
pdeCallFfi(generalizedFrbRustBinding, serializer,
35383539
funcId: 111, port: port_);
@@ -3541,19 +3542,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
35413542
decodeSuccessData: sse_decode_unit,
35423543
decodeErrorData: sse_decode_AnyhowException,
35433544
),
3544-
constMeta: kCrateApiPaySignLedgerTransactionConstMeta,
3545-
argValues: [sink, pczt, c],
3545+
constMeta: kCrateApiLedgerSignLedgerTransactionConstMeta,
3546+
argValues: [sink, package, c],
35463547
apiImpl: this,
35473548
),
35483549
),
35493550
);
35503551
return sink.stream;
35513552
}
35523553

3553-
TaskConstMeta get kCrateApiPaySignLedgerTransactionConstMeta =>
3554+
TaskConstMeta get kCrateApiLedgerSignLedgerTransactionConstMeta =>
35543555
const TaskConstMeta(
35553556
debugName: "sign_ledger_transaction",
3556-
argNames: ["sink", "pczt", "c"],
3557+
argNames: ["sink", "package", "c"],
35573558
);
35583559

35593560
@override

lib/src/rust/frb_generated.io.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'api/db.dart';
99
import 'api/frost.dart';
1010
import 'api/init.dart';
1111
import 'api/key.dart';
12+
import 'api/ledger.dart';
1213
import 'api/mempool.dart';
1314
import 'api/network.dart';
1415
import 'api/pay.dart';

lib/src/rust/frb_generated.web.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'api/db.dart';
1212
import 'api/frost.dart';
1313
import 'api/init.dart';
1414
import 'api/key.dart';
15+
import 'api/ledger.dart';
1516
import 'api/mempool.dart';
1617
import 'api/network.dart';
1718
import 'api/pay.dart';

lib/store.g.dart

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/src/account.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use std::str::FromStr as _;
22

3-
use crate::ledger::fvk::get_hw_sapling_address;
43
use crate::{
5-
api::ledger::get_hw_fvk,
4+
api::ledger::{get_hw_sapling_address, get_hw_transparent_address, get_hw_fvk, get_hw_next_diversifier_address},
65
bip38,
76
api::coin::Network,
87
db::{
@@ -31,11 +30,6 @@ use secp256k1::{PublicKey, SecretKey};
3130
use zcash_keys::keys::{sapling::ExtendedSpendingKey, UnifiedFullViewingKey, UnifiedSpendingKey};
3231
use zcash_transparent::address::TransparentAddress;
3332

34-
#[cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))]
35-
use crate::ledger::fvk::{get_hw_next_diversifier_address, get_hw_transparent_address};
36-
#[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))]
37-
use crate::no_ledger::{get_hw_next_diversifier_address, get_hw_transparent_address};
38-
3933
use anyhow::{anyhow, Result};
4034
use bincode::config::legacy;
4135
use bip32::{ExtendedPrivateKey, ExtendedPublicKey, PrivateKey};

rust/src/api/account.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,11 @@ use zcash_protocol::consensus::Parameters as ZkParams;
2121

2222
use crate::{
2323
account::derive_transparent_address,
24-
api::coin::Coin,
24+
api::{coin::Coin, ledger::{show_sapling_address, show_transparent_address}},
2525
db::get_account_dindex,
2626
io::{decrypt, encrypt},
2727
};
2828

29-
#[cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))]
30-
use crate::ledger::fvk::{
31-
show_sapling_address,
32-
show_transparent_address,
33-
};
34-
#[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))]
35-
use crate::no_ledger::{
36-
show_sapling_address,
37-
show_transparent_address,
38-
};
39-
4029
#[frb]
4130
pub async fn get_account_pools(account: u32, c: &Coin) -> Result<u8> {
4231
let mut connection = c.get_connection().await?;

rust/src/api/ledger.rs

Lines changed: 101 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,119 @@
11
use anyhow::Result;
22
use sapling_crypto::keys::FullViewingKey;
3+
use zcash_transparent::address::TransparentAddress;
4+
use sqlx::SqliteConnection;
35

4-
use crate::{api::coin::Network, db::LEDGER_CODE};
6+
use crate::{api::{coin::{Coin, Network}, pay::{PcztPackage, SigningEvent}}, frb_generated::StreamSink};
57

68
cfg_if::cfg_if! {
79
if #[cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))] {
810
pub(crate) async fn get_hw_fvk(_network: &Network, ledger_code: u32, aindex: u32) -> Result<FullViewingKey> {
9-
assert_eq!(ledger_code, LEDGER_CODE);
11+
assert_eq!(ledger_code, crate::db::LEDGER_CODE);
1012
let ledger = crate::ledger::connect_ledger().await?;
1113
let fvk = crate::ledger::fvk::get_fvk(&ledger, aindex).await?;
1214
Ok(fvk)
1315
}
16+
17+
pub(crate) async fn get_hw_sapling_address(
18+
network: &Network,
19+
aindex: u32,
20+
) -> Result<String> {
21+
let ledger = crate::ledger::connect_ledger().await?;
22+
let address = crate::ledger::fvk::get_hw_sapling_address(&ledger, network, aindex).await?;
23+
Ok(address)
24+
}
25+
26+
pub(crate) async fn get_hw_transparent_address(
27+
network: &Network,
28+
aindex: u32,
29+
scope: u32,
30+
dindex: u32,
31+
) -> Result<(Vec<u8>, TransparentAddress)> {
32+
let ledger = crate::ledger::connect_ledger().await?;
33+
let (pk, address) = crate::ledger::fvk::get_hw_transparent_address(&ledger, network, aindex, scope, dindex).await?;
34+
Ok((pk, address))
35+
}
36+
37+
pub(crate) async fn get_hw_next_diversifier_address(
38+
network: &Network,
39+
aindex: u32,
40+
dindex: u32,
41+
) -> Result<(u32, String)> {
42+
let ledger = crate::ledger::connect_ledger().await?;
43+
let (dindex, address) = crate::ledger::fvk::get_hw_next_diversifier_address(&ledger, network, aindex, dindex).await?;
44+
Ok((dindex, address))
45+
}
46+
47+
pub(crate) async fn show_sapling_address(network: &Network, connection: &mut SqliteConnection, account: u32) -> Result<String> {
48+
let address = crate::ledger::fvk::show_sapling_address(network, connection, account).await?;
49+
Ok(address)
50+
}
51+
52+
pub(crate) async fn show_transparent_address(network: &Network, connection: &mut SqliteConnection, account: u32) -> Result<String> {
53+
let address = crate::ledger::fvk::show_transparent_address(network, connection, account).await?;
54+
Ok(address)
55+
}
56+
57+
pub async fn sign_ledger_transaction(
58+
sink: StreamSink<SigningEvent>,
59+
package: PcztPackage,
60+
c: &Coin,
61+
) -> Result<()> {
62+
let connection = c.get_connection().await?;
63+
crate::ledger::builder::sign_ledger_transaction(c.network(), sink, connection, c.account, package).await?;
64+
Ok(())
65+
}
1466
}
1567
else {
16-
pub(crate) async fn get_hw_fvk(_network: &Network, ledger_code: u32, aindex: u32) -> Result<FullViewingKey> {
17-
crate::no_ledger!()
68+
#[macro_export]
69+
macro_rules! no_ledger {
70+
() => {
71+
Err(anyhow::anyhow!("Ledger not supported on this platform"))
72+
}
73+
}
74+
75+
pub(crate) async fn get_hw_fvk(_network: &Network, _ledger_code: u32, _aindex: u32) -> Result<FullViewingKey> {
76+
no_ledger!()
77+
}
78+
79+
pub(crate) async fn get_hw_sapling_address(
80+
_network: &Network,
81+
_aindex: u32,
82+
) -> Result<String> {
83+
no_ledger!()
84+
}
85+
86+
pub(crate) async fn get_hw_transparent_address(
87+
_network: &Network,
88+
_aindex: u32,
89+
_scope: u32,
90+
_dindex: u32,
91+
) -> Result<(Vec<u8>, TransparentAddress)> {
92+
no_ledger!()
93+
}
94+
95+
pub(crate) async fn get_hw_next_diversifier_address(
96+
_network: &Network,
97+
_aindex: u32,
98+
_dindex: u32,
99+
) -> Result<(u32, String)> {
100+
no_ledger!()
101+
}
102+
103+
pub(crate) async fn show_sapling_address(_network: &Network, _connection: &mut SqliteConnection, _account: u32) -> Result<String> {
104+
no_ledger!()
105+
}
106+
107+
pub(crate) async fn show_transparent_address(_network: &Network, _connection: &mut SqliteConnection, _account: u32) -> Result<String> {
108+
no_ledger!()
18109
}
19110

20-
pub async fn show_ledger_sapling_address() -> Result<String> {
21-
Err(anyhow::anyhow!("Ledger is not supported on mobile devices"))
111+
pub async fn sign_ledger_transaction(
112+
_sink: StreamSink<SigningEvent>,
113+
_package: PcztPackage,
114+
_c: &Coin,
115+
) -> Result<()> {
116+
no_ledger!()
22117
}
23118
}
24119
}

0 commit comments

Comments
 (0)