Skip to content

Commit 1e39180

Browse files
committed
Refactors the signatures structures of the SDK
1 parent 58a926b commit 1e39180

File tree

9 files changed

+1804
-860
lines changed

9 files changed

+1804
-860
lines changed

crates/apps_lib/src/cli.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7840,6 +7840,7 @@ pub mod args {
78407840
.chain_id
78417841
.or_else(|| Some(ctx.config.ledger.chain_id.clone())),
78427842
wrapper_fee_payer: self.wrapper_fee_payer.map(|x| ctx.get(&x)),
7843+
wrap_it: self.wrap_it,
78437844
memo: self.memo,
78447845
use_device: self.use_device,
78457846
device_transport: self.device_transport,
@@ -7986,6 +7987,8 @@ pub mod args {
79867987
let password = None;
79877988
let memo = MEMO_OPT.parse(matches).map(String::into_bytes);
79887989
let wrapper_fee_payer = FEE_PAYER_OPT.parse(matches);
7990+
// Wrap the transaction unless we want to dump the raw
7991+
let wrap_it = !dump_tx;
79897992
let output_folder = OUTPUT_FOLDER_PATH.parse(matches);
79907993
let use_device = USE_DEVICE.parse(matches);
79917994
let no_expiration = NO_EXPIRATION.parse(matches);
@@ -8017,6 +8020,7 @@ pub mod args {
80178020
password,
80188021
chain_id,
80198022
wrapper_fee_payer,
8023+
wrap_it,
80208024
output_folder,
80218025
memo,
80228026
use_device,

crates/apps_lib/src/client/tx.rs

Lines changed: 81 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use namada_sdk::ibc::convert_masp_tx_to_ibc_memo;
2626
use namada_sdk::io::{Io, display_line, edisplay_line};
2727
use namada_sdk::key::*;
2828
use namada_sdk::rpc::{InnerTxResult, TxBroadcastData, TxResponse};
29+
use namada_sdk::signing::SigningData;
2930
use namada_sdk::state::EPOCH_SWITCH_BLOCKS_DELAY;
3031
use namada_sdk::tx::data::compute_inner_tx_hash;
3132
use namada_sdk::tx::{CompressedAuthorization, Section, Signer, Tx};
@@ -62,31 +63,32 @@ const MAX_HW_CONVERT: usize = 15;
6263
// introduced.
6364
const MAX_HW_OUTPUT: usize = 15;
6465

65-
/// Wrapper around `signing::aux_signing_data` that stores the optional
66-
/// disposable address to the wallet
67-
pub async fn aux_signing_data(
68-
context: &impl Namada,
69-
args: &args::Tx,
70-
owner: Option<Address>,
71-
default_signer: Option<Address>,
72-
disposable_signing_key: bool,
73-
signatures: Vec<Vec<u8>>,
74-
wrapper_signature: Option<Vec<u8>>,
75-
) -> Result<signing::SigningTxData, error::Error> {
76-
let signing_data = signing::aux_signing_data(
77-
context,
78-
args,
79-
owner,
80-
default_signer,
81-
vec![],
82-
disposable_signing_key,
83-
signatures,
84-
wrapper_signature,
85-
)
86-
.await?;
87-
88-
Ok(signing_data)
89-
}
66+
// FIXME: remove if unused, or review the docs
67+
// /// Wrapper around `signing::aux_signing_data` that stores the optional
68+
// /// disposable address to the wallet
69+
// pub async fn aux_signing_data(
70+
// context: &impl Namada,
71+
// args: &args::Tx,
72+
// owner: Option<Address>,
73+
// default_signer: Option<Address>,
74+
// disposable_signing_key: bool,
75+
// signatures: Vec<Vec<u8>>,
76+
// wrapper_signature: Option<Vec<u8>>,
77+
// ) -> Result<signing::SigningTxData, error::Error> {
78+
// let signing_data = signing::aux_signing_data(
79+
// context,
80+
// args,
81+
// owner,
82+
// default_signer,
83+
// vec![],
84+
// disposable_signing_key,
85+
// signatures,
86+
// wrapper_signature,
87+
// )
88+
// .await?;
89+
90+
// Ok(signing_data)
91+
// }
9092

9193
pub async fn with_hardware_wallet<U, T>(
9294
mut tx: Tx,
@@ -188,7 +190,7 @@ pub async fn sign<N: Namada>(
188190
context: &N,
189191
tx: &mut Tx,
190192
args: &args::Tx,
191-
signing_data: SigningTxData,
193+
signing_data: SigningData,
192194
) -> Result<(), error::Error> {
193195
// Setup a reusable context for signing transactions using the Ledger
194196
if args.use_device {
@@ -219,7 +221,7 @@ pub async fn submit_reveal_aux(
219221
context: &impl Namada,
220222
args: &args::Tx,
221223
address: &Address,
222-
) -> Result<Option<(Tx, SigningTxData)>, error::Error> {
224+
) -> Result<Option<(Tx, SigningData)>, error::Error> {
223225
if args.dump_tx || args.dump_wrapper_tx {
224226
return Ok(None);
225227
}
@@ -250,11 +252,15 @@ async fn batch_opt_reveal_pk_and_submit<N: Namada>(
250252
namada: &N,
251253
args: &args::Tx,
252254
owners: &[&Address],
253-
mut tx_data: (Tx, SigningTxData),
255+
mut tx_data: (Tx, SigningData),
254256
) -> Result<ProcessTxResponse, error::Error>
255257
where
256258
<N::Client as namada_sdk::io::Client>::Error: std::fmt::Display,
257259
{
260+
if !matches!(tx_data.1, SigningData::Wrapper(_)) {
261+
panic!("Expected wrapper signing data to submit the transaction");
262+
}
263+
258264
let mut batched_tx_data = vec![];
259265

260266
for owner in owners {
@@ -270,7 +276,7 @@ where
270276
if args.use_device {
271277
// Sign each transaction separately
272278
for (tx, sig_data) in &mut batched_tx_data {
273-
sign(namada, tx, args, sig_data.clone()).await?;
279+
sign(namada, tx, args, sig_data.to_owned()).await?;
274280
}
275281
sign(namada, &mut tx_data.0, args, tx_data.1).await?;
276282
// Then submit each transaction separately
@@ -327,6 +333,7 @@ where
327333
return tx::dump_tx(namada.io(), &args.tx, tx);
328334
}
329335
if args.tx.dump_wrapper_tx {
336+
// FIXME: here we attach the inner signatures when dumping the wrapper
330337
// Attach the provided inner signatures to the tx (if any)
331338
let signatures = args
332339
.signatures
@@ -1246,10 +1253,12 @@ pub async fn submit_shielded_transfer(
12461253
)
12471254
.await?;
12481255
let (mut tx, signing_data) =
1249-
args.clone().build(namada, &mut bparams, false).await?;
1250-
let disposable_fee_payer = match signing_data.fee_payer {
1251-
either::Either::Left((_, disposable_fee_payer)) => disposable_fee_payer,
1252-
either::Either::Right(_) => unreachable!(),
1256+
args.clone().build(namada, &mut bparams).await?;
1257+
let disposable_fee_payer = match signing_data {
1258+
SigningData::Inner(_) => false,
1259+
SigningData::Wrapper(ref signing_wrapper_data) => {
1260+
signing_wrapper_data.disposable_fee_payer()
1261+
}
12531262
};
12541263
if !disposable_fee_payer {
12551264
display_line!(
@@ -1261,7 +1270,15 @@ pub async fn submit_shielded_transfer(
12611270
fees via the MASP with a disposable gas payer.",
12621271
);
12631272
}
1264-
masp_sign(&mut tx, &args.tx, &signing_data, shielded_hw_keys).await?;
1273+
masp_sign(
1274+
&mut tx,
1275+
&args.tx,
1276+
signing_data
1277+
.signing_tx_data()
1278+
.expect("Missing expected signing data"),
1279+
shielded_hw_keys,
1280+
)
1281+
.await?;
12651282

12661283
let masp_section = tx
12671284
.sections
@@ -1409,10 +1426,12 @@ pub async fn submit_unshielding_transfer(
14091426
)
14101427
.await?;
14111428
let (mut tx, signing_data) =
1412-
args.clone().build(namada, &mut bparams, false).await?;
1413-
let disposable_fee_payer = match signing_data.fee_payer {
1414-
either::Either::Left((_, disposable_fee_payer)) => disposable_fee_payer,
1415-
either::Either::Right(_) => unreachable!(),
1429+
args.clone().build(namada, &mut bparams).await?;
1430+
let disposable_fee_payer = match signing_data {
1431+
SigningData::Inner(_) => false,
1432+
SigningData::Wrapper(ref signing_wrapper_data) => {
1433+
signing_wrapper_data.disposable_fee_payer()
1434+
}
14161435
};
14171436
if !disposable_fee_payer {
14181437
display_line!(
@@ -1424,7 +1443,15 @@ pub async fn submit_unshielding_transfer(
14241443
gas fees via the MASP with a disposable gas payer.",
14251444
);
14261445
}
1427-
masp_sign(&mut tx, &args.tx, &signing_data, shielded_hw_keys).await?;
1446+
masp_sign(
1447+
&mut tx,
1448+
&args.tx,
1449+
signing_data
1450+
.signing_tx_data()
1451+
.expect("Missing signing data"),
1452+
shielded_hw_keys,
1453+
)
1454+
.await?;
14281455

14291456
let masp_section = tx
14301457
.sections
@@ -1493,12 +1520,14 @@ where
14931520
// If transaction building fails for any reason, then abort the process
14941521
// blaming MASP build parameter generation if that had also failed.
14951522
let (mut tx, signing_data, _) = args
1496-
.build(namada, &mut bparams, false)
1523+
.build(namada, &mut bparams)
14971524
.await
14981525
.map_err(|e| bparams_err.unwrap_or(e))?;
1499-
let disposable_fee_payer = match signing_data.fee_payer {
1500-
either::Either::Left((_, disposable_fee_payer)) => disposable_fee_payer,
1501-
either::Either::Right(_) => unreachable!(),
1526+
let disposable_fee_payer = match signing_data {
1527+
SigningData::Inner(_) => false,
1528+
SigningData::Wrapper(ref signing_wrapper_data) => {
1529+
signing_wrapper_data.disposable_fee_payer()
1530+
}
15021531
};
15031532
if args.source.spending_key().is_some() && !disposable_fee_payer {
15041533
display_line!(
@@ -1513,7 +1542,15 @@ where
15131542
// Any effects of a MASP build parameter generation failure would have
15141543
// manifested during transaction building. So we discount that as a root
15151544
// cause from now on.
1516-
masp_sign(&mut tx, &args.tx, &signing_data, shielded_hw_keys).await?;
1545+
masp_sign(
1546+
&mut tx,
1547+
&args.tx,
1548+
signing_data
1549+
.signing_tx_data()
1550+
.expect("Missing expected signing data"),
1551+
shielded_hw_keys,
1552+
)
1553+
.await?;
15171554

15181555
let opt_masp_section =
15191556
tx.sections.iter().find_map(|section| section.masp_tx());

crates/apps_lib/src/config/genesis/transactions.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use namada_sdk::dec::Dec;
2020
use namada_sdk::key::common::PublicKey;
2121
use namada_sdk::key::{RefTo, SerializeWithBorsh, SigScheme, common, ed25519};
2222
use namada_sdk::proof_of_stake::types::ValidatorMetaData;
23-
use namada_sdk::signing::{SigningTxData, sign_tx};
23+
use namada_sdk::signing::{SigningTxData, SigningWrapperData, sign_tx};
2424
use namada_sdk::string_encoding::StringEncoded;
2525
use namada_sdk::time::DateTimeUtc;
2626
use namada_sdk::token;
@@ -90,6 +90,7 @@ fn get_tx_args(use_device: bool) -> TxArgs {
9090
wallet_alias_force: false,
9191
fee_amount: None,
9292
wrapper_fee_payer: None,
93+
wrap_it: false,
9394
fee_token: genesis_fee_token_address(),
9495
gas_limit: 0.into(),
9596
expiration: Default::default(),
@@ -764,15 +765,23 @@ impl<T> Signed<T> {
764765
{
765766
let (pks, threshold) = self.data.get_pks(established_accounts);
766767
let owner = self.data.get_owner().address();
767-
let signing_data = SigningTxData {
768-
owner: Some(owner),
769-
account_public_keys_map: Some(pks.iter().cloned().collect()),
770-
public_keys: pks.clone(),
771-
threshold,
772-
fee_payer: Either::Left((genesis_fee_payer_pk(), false)),
773-
shielded_hash: None,
774-
signatures: vec![],
775-
};
768+
let signing_data =
769+
namada_sdk::signing::SigningData::Wrapper(SigningWrapperData {
770+
signing_data: vec![SigningTxData {
771+
owner: Some(owner),
772+
account_public_keys_map: Some(
773+
pks.iter().cloned().collect(),
774+
),
775+
public_keys: pks.clone(),
776+
threshold,
777+
shielded_hash: None,
778+
signatures: vec![],
779+
}],
780+
fee_auth: namada_sdk::signing::FeeAuthorization::Signer {
781+
pubkey: genesis_fee_payer_pk(),
782+
disposable_fee_payer: false,
783+
},
784+
});
776785

777786
let mut tx = self.data.tx_to_sign();
778787

0 commit comments

Comments
 (0)