From 2b868867e3489ba7bb2aac09aa658573c2e2a23c Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Sun, 15 Dec 2024 22:32:45 -0500 Subject: [PATCH 1/8] pcli: hack a truncated address together --- crates/bin/pcli/src/command/tx.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/crates/bin/pcli/src/command/tx.rs b/crates/bin/pcli/src/command/tx.rs index 063ffc36b3..8efe231b6c 100644 --- a/crates/bin/pcli/src/command/tx.rs +++ b/crates/bin/pcli/src/command/tx.rs @@ -30,7 +30,10 @@ use penumbra_asset::{asset, asset::Metadata, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_dex::{lp::position, swap_claim::SwapClaimPlan}; use penumbra_fee::FeeTier; use penumbra_governance::{proposal::ProposalToml, proposal_state::State as ProposalState, Vote}; -use penumbra_keys::{keys::AddressIndex, Address}; +use penumbra_keys::{ + keys::{AddressIndex, Diversifier}, + Address, +}; use penumbra_num::Amount; use penumbra_proto::{ core::component::{ @@ -1023,10 +1026,22 @@ impl TxCmd { } => { let destination_chain_address = to; - let (ephemeral_return_address, _) = app - .config - .full_viewing_key - .ephemeral_address(OsRng, AddressIndex::from(*source)); + let ephemeral_return_address = if *use_transparent_address { + let ivk = app.config.full_viewing_key.incoming(); + + // Handcraft a transparent address for the return address + // `Address` does not expose this API for a reason, so thread carefully + let dzero = Diversifier([0u8; 16]); + let g_dzero = dzero.diversified_generator(); + let pk_dzero = ivk.diversified_public(&g_dzero); + let ck_id = ::decaf377_fmd::ClueKey([0u8; 32]); + Address::from_components(dzero, pk_dzero, ck_id).expect("valid address") + } else { + app.config + .full_viewing_key + .ephemeral_address(OsRng, AddressIndex::from(*source)) + .0 + }; let timeout_height = match timeout_height { Some(h) => h.clone(), From 3f927e4facddaf8bc37bf8c4a55b6e4475c5e02c Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Sun, 15 Dec 2024 22:33:20 -0500 Subject: [PATCH 2/8] pcli: add `decaf377-fmd` to pcli --- Cargo.lock | 1 + crates/bin/pcli/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index a7debaa761..d6e1817445 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4239,6 +4239,7 @@ dependencies = [ "colored_json", "comfy-table", "decaf377", + "decaf377-fmd", "decaf377-rdsa", "dialoguer", "directories", diff --git a/crates/bin/pcli/Cargo.toml b/crates/bin/pcli/Cargo.toml index 7c123ddff9..4c2076aff5 100644 --- a/crates/bin/pcli/Cargo.toml +++ b/crates/bin/pcli/Cargo.toml @@ -102,6 +102,7 @@ termion = {workspace = true} tracing = {workspace = true} tracing-subscriber = {workspace = true, features = ["env-filter", "ansi"]} url = {workspace = true, features = ["serde"]} +decaf377-fmd.workspace = true [dev-dependencies] assert_cmd = {workspace = true} From 373a641d1a02b3a19f2fd2700378474a8b05be82 Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Sun, 15 Dec 2024 22:34:17 -0500 Subject: [PATCH 3/8] shielded-pool(ics20): truncated address conversion in packet data --- .../component/shielded-pool/src/ics20_withdrawal.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs index 922d99275f..174e504d9f 100644 --- a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs +++ b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs @@ -167,11 +167,18 @@ impl TryFrom for Ics20Withdrawal { impl From for pb::FungibleTokenPacketData { fn from(w: Ics20Withdrawal) -> Self { - let return_address = match w.use_compat_address { - true => w.return_address.compat_encoding(), - false => w.return_address.to_string(), + let ordinary_return_address = w.return_address.to_string(); + + let return_address = if w.use_transparent_address { + w.return_address + .encode_as_transparent_address() + .unwrap_or_else(|| ordinary_return_address) + } else { + ordinary_return_address }; + tracing::warn!(?return_address, w.use_transparent_address, "return address"); + pb::FungibleTokenPacketData { amount: w.value().amount.to_string(), denom: w.denom.to_string(), From 7e248c3735b958fb1a89710c3df3f262fdbf8faa Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Sun, 15 Dec 2024 22:41:35 -0500 Subject: [PATCH 4/8] penumbra: remove noisy tracing statement --- crates/core/component/shielded-pool/src/ics20_withdrawal.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs index 174e504d9f..ed95901dac 100644 --- a/crates/core/component/shielded-pool/src/ics20_withdrawal.rs +++ b/crates/core/component/shielded-pool/src/ics20_withdrawal.rs @@ -177,8 +177,6 @@ impl From for pb::FungibleTokenPacketData { ordinary_return_address }; - tracing::warn!(?return_address, w.use_transparent_address, "return address"); - pb::FungibleTokenPacketData { amount: w.value().amount.to_string(), denom: w.denom.to_string(), From 56bdaf486dfc6c57613cdd2904a4bff4d4fdb271 Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Mon, 16 Dec 2024 08:16:04 -0500 Subject: [PATCH 5/8] pcli(tx): rely on transparent address constructor --- Cargo.lock | 1 - crates/bin/pcli/Cargo.toml | 1 - crates/bin/pcli/src/command/tx.rs | 12 ++++-------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6e1817445..a7debaa761 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4239,7 +4239,6 @@ dependencies = [ "colored_json", "comfy-table", "decaf377", - "decaf377-fmd", "decaf377-rdsa", "dialoguer", "directories", diff --git a/crates/bin/pcli/Cargo.toml b/crates/bin/pcli/Cargo.toml index 4c2076aff5..7c123ddff9 100644 --- a/crates/bin/pcli/Cargo.toml +++ b/crates/bin/pcli/Cargo.toml @@ -102,7 +102,6 @@ termion = {workspace = true} tracing = {workspace = true} tracing-subscriber = {workspace = true, features = ["env-filter", "ansi"]} url = {workspace = true, features = ["serde"]} -decaf377-fmd.workspace = true [dev-dependencies] assert_cmd = {workspace = true} diff --git a/crates/bin/pcli/src/command/tx.rs b/crates/bin/pcli/src/command/tx.rs index 8efe231b6c..cb27f82312 100644 --- a/crates/bin/pcli/src/command/tx.rs +++ b/crates/bin/pcli/src/command/tx.rs @@ -31,7 +31,7 @@ use penumbra_dex::{lp::position, swap_claim::SwapClaimPlan}; use penumbra_fee::FeeTier; use penumbra_governance::{proposal::ProposalToml, proposal_state::State as ProposalState, Vote}; use penumbra_keys::{ - keys::{AddressIndex, Diversifier}, + keys::{AddressIndex}, Address, }; use penumbra_num::Amount; @@ -1029,13 +1029,9 @@ impl TxCmd { let ephemeral_return_address = if *use_transparent_address { let ivk = app.config.full_viewing_key.incoming(); - // Handcraft a transparent address for the return address - // `Address` does not expose this API for a reason, so thread carefully - let dzero = Diversifier([0u8; 16]); - let g_dzero = dzero.diversified_generator(); - let pk_dzero = ivk.diversified_public(&g_dzero); - let ck_id = ::decaf377_fmd::ClueKey([0u8; 32]); - Address::from_components(dzero, pk_dzero, ck_id).expect("valid address") + ivk.transparent_address() + .parse::
() + .expect("we round-trip from a valid transparent address") } else { app.config .full_viewing_key From 651bf8d371f65e4deb65e774524200b133e99b92 Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Mon, 16 Dec 2024 08:43:08 -0500 Subject: [PATCH 6/8] penumbra: run `cargo fmt` --- crates/bin/pcli/src/command/tx.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/bin/pcli/src/command/tx.rs b/crates/bin/pcli/src/command/tx.rs index cb27f82312..3b5a943941 100644 --- a/crates/bin/pcli/src/command/tx.rs +++ b/crates/bin/pcli/src/command/tx.rs @@ -30,10 +30,7 @@ use penumbra_asset::{asset, asset::Metadata, Value, STAKING_TOKEN_ASSET_ID}; use penumbra_dex::{lp::position, swap_claim::SwapClaimPlan}; use penumbra_fee::FeeTier; use penumbra_governance::{proposal::ProposalToml, proposal_state::State as ProposalState, Vote}; -use penumbra_keys::{ - keys::{AddressIndex}, - Address, -}; +use penumbra_keys::{keys::AddressIndex, Address}; use penumbra_num::Amount; use penumbra_proto::{ core::component::{ From 565334b36e0de3287508c0499c65f48b3f763460 Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Mon, 16 Dec 2024 09:01:09 -0500 Subject: [PATCH 7/8] transaction: fix `test` build target error --- crates/core/transaction/src/view.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/core/transaction/src/view.rs b/crates/core/transaction/src/view.rs index 14cbe2c915..8167c9bdbb 100644 --- a/crates/core/transaction/src/view.rs +++ b/crates/core/transaction/src/view.rs @@ -522,6 +522,7 @@ mod test { balance_commitment: dummy_commitment(), nullifier: Nullifier(Fq::default()), rk: dummy_pk(), + encrypted_backref: EncryptedBackref::dummy(), }, auth_sig: dummy_sig(), proof: dummy_proof_spend(), From a195664deee54d8b8e1351237907ed1c379b6bcf Mon Sep 17 00:00:00 2001 From: Erwan Or Date: Mon, 16 Dec 2024 09:19:17 -0500 Subject: [PATCH 8/8] transaction: add missing import --- crates/core/transaction/src/view.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/core/transaction/src/view.rs b/crates/core/transaction/src/view.rs index 8167c9bdbb..e4cd0f800c 100644 --- a/crates/core/transaction/src/view.rs +++ b/crates/core/transaction/src/view.rs @@ -517,6 +517,8 @@ mod test { #[cfg(test)] fn dummy_spend() -> spend::Spend { + use penumbra_shielded_pool::EncryptedBackref; + spend::Spend { body: spend::Body { balance_commitment: dummy_commitment(),