Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Send proposed transactions #27

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions zingolib/src/lightclient/propose.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,8 @@ impl LightClient {
)
.map_err(DoProposeError::Proposal)?;

let mut latest_proposal_lock = self.latest_proposal.write().await;
*latest_proposal_lock = Some(crate::data::proposal::ZingoProposal::Transfer(
proposal.clone(),
));
self.update_latest_proposal(ZingoProposal::Transfer(proposal.clone()))
.await;
Ok(proposal)
}

Expand Down Expand Up @@ -246,9 +244,8 @@ impl LightClient {
)
.map_err(DoProposeError::ShieldProposal)?;

*self.latest_proposal.write().await = Some(crate::data::proposal::ZingoProposal::Shield(
proposed_shield.clone(),
));
self.update_latest_proposal(ZingoProposal::Shield(proposed_shield.clone()))
.await;
Ok(proposed_shield)
}
/// A helper method that standardizes latest_proposal update
Expand Down
122 changes: 65 additions & 57 deletions zingolib/src/lightclient/send.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
//! TODO: Add Mod Description Here!
use std::ops::DerefMut;

use nonempty::NonEmpty;

use sapling_crypto::prover::OutputProver;
use sapling_crypto::prover::SpendProver;

use zcash_keys::keys::UnifiedSpendingKey;

use zcash_client_backend::{proposal::Proposal, zip321::TransactionRequest};
use zcash_primitives::{consensus::BlockHeight, transaction::TxId};
use zcash_proofs::prover::LocalTxProver;
Expand All @@ -33,38 +27,57 @@
})
}

async fn iterate_proposal_send_scan<NoteRef>(
async fn update_tmamt_and_return_step_result<N>(
&self,
proposal: &Proposal<zcash_primitives::transaction::fees::zip317::FeeRule, N>,
step: zcash_client_backend::proposal::Step<N>,
step_results: &Vec<(
&zcash_client_backend::proposal::Step<N>,
zcash_primitives::transaction::builder::BuildResult,
)>,
) -> Result<zcash_primitives::transaction::builder::BuildResult, DoSendProposedError> {
let fee_rule = proposal.fee_rule();
let min_target_height = proposal.min_target_height();
let unified_spend_key = zcash_keys::keys::UnifiedSpendingKey::try_from(
self.wallet.wallet_capability().as_ref(),
)
.map_err(DoSendProposedError::UnifiedSpendKey)?;
let (sapling_output, sapling_spend) = self
.read_sapling_params()
.map_err(DoSendProposedError::SaplingParams)?;
let sapling_prover = LocalTxProver::from_bytes(&sapling_spend, &sapling_output);
zcash_client_backend::data_api::wallet::calculate_proposed_transaction(
std::ops::DerefMut::deref_mut(
&mut self
.wallet
.transaction_context
.transaction_metadata_set
.write()
.await,
),
&self.wallet.transaction_context.config.chain,
&sapling_prover,
&sapling_prover,
&unified_spend_key,
zcash_client_backend::wallet::OvkPolicy::Sender,
fee_rule,
min_target_height,
&step_results,
&step,
)
.map_err(DoSendProposedError::Calculation)
}
async fn iterate_proposal_send_scan<NoteRef: Sized + Clone>(
&self,
proposal: &Proposal<zcash_primitives::transaction::fees::zip317::FeeRule, NoteRef>,
sapling_prover: &(impl SpendProver + OutputProver),
unified_spend_key: &UnifiedSpendingKey,
submission_height: BlockHeight,
) -> Result<NonEmpty<TxId>, DoSendProposedError> {
let mut step_results = Vec::with_capacity(proposal.steps().len());
let mut txids = Vec::with_capacity(proposal.steps().len());
for step in proposal.steps() {
let step_result = {
let mut tmamt = self
.wallet
.transaction_context
.transaction_metadata_set
.write()
.await;

zcash_client_backend::data_api::wallet::calculate_proposed_transaction(
tmamt.deref_mut(),
&self.wallet.transaction_context.config.chain,
sapling_prover,
sapling_prover,
unified_spend_key,
zcash_client_backend::wallet::OvkPolicy::Sender,
proposal.fee_rule(),
proposal.min_target_height(),
&step_results,
step,
)
.map_err(DoSendProposedError::Calculation)?
};
let step_result = self
.update_tmamt_and_return_step_result(proposal, step.clone(), &step_results)
.await?;

let txid = self
.wallet
Expand Down Expand Up @@ -108,32 +121,14 @@
.await
.map_err(DoSendProposedError::SubmissionHeight)?;

let (sapling_output, sapling_spend) = self
.read_sapling_params()
.map_err(DoSendProposedError::SaplingParams)?;
let sapling_prover = LocalTxProver::from_bytes(&sapling_spend, &sapling_output);
let unified_spend_key =
UnifiedSpendingKey::try_from(self.wallet.wallet_capability().as_ref())
.map_err(DoSendProposedError::UnifiedSpendKey)?;

match proposal {
crate::lightclient::ZingoProposal::Transfer(transfer_proposal) => {
self.iterate_proposal_send_scan(
transfer_proposal,
&sapling_prover,
&unified_spend_key,
submission_height,
)
.await
self.iterate_proposal_send_scan(transfer_proposal, submission_height)
.await
}
crate::lightclient::ZingoProposal::Shield(shield_proposal) => {
self.iterate_proposal_send_scan(
shield_proposal,
&sapling_prover,
&unified_spend_key,
submission_height,
)
.await
self.iterate_proposal_send_scan(shield_proposal, submission_height)
.await
}
}
} else {
Expand Down Expand Up @@ -163,22 +158,35 @@
use zingo_testvectors::seeds::HOSPITAL_MUSEUM_SEED;
use zingoconfig::ZingoConfigBuilder;

use crate::{lightclient::LightClient, test_framework::mocks::ProposalBuilder};
use crate::{
lightclient::LightClient,
test_framework::mocks::{ProposalBuilder, StepBuilder},
};

#[tokio::test]
async fn update_tmamt_and_return_step_result() {
dbg!("Begin test fn 1");
let config = ZingoConfigBuilder::default().create();
dbg!("Begin test fn 2");
let client = LightClient::create_unconnected(
&config,
crate::wallet::WalletBase::MnemonicPhrase(HOSPITAL_MUSEUM_SEED.to_string()),
0,
)
.await
.expect("A client!");
dbg!("Begin test fn 3");
let proposal = ProposalBuilder::new().build();
let step = zcash_client_backend::proposal::Step::from_parts();
dbg!("Begin test fn 4");
let step = StepBuilder::new().build();
dbg!("Begin test fn 5");
let step_results: Vec<(
&zcash_client_backend::proposal::Step<zcash_client_backend::wallet::NoteId>,
zcash_primitives::transaction::builder::BuildResult,
)> = vec![];
dbg!("Here?");
let step_result = client

Check failure on line 188 in zingolib/src/lightclient/send.rs

View workflow job for this annotation

GitHub Actions / test / Build test artifacts

unused variable: `step_result`
.update_tmamt_and_return_step_result(&proposal, step, step_results)
.update_tmamt_and_return_step_result(&proposal, step, &step_results)
.await;
}
}
Expand Down Expand Up @@ -216,6 +224,6 @@
pub enum DoQuickSendProposedError {
#[error("propose {0}")]
Propose(crate::lightclient::propose::DoProposeError),
#[error("No proposal. Call do_propose first.")]
#[error("Can't QuickSend! No proposal. Call do_propose first.")]
Send(DoSendProposedError),
}
3 changes: 3 additions & 0 deletions zingolib/src/test_framework/mocks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,9 @@ pub mod proposal {
/// `build` will panic if any fields of the builder are `None` or if the build failed
/// due to invalid values.
pub fn build(self) -> Proposal<FeeRule, NoteId> {
dbg!("Inside Proposal Builder new");
let step = self.steps.unwrap().first().clone();
dbg!("Ooopppsss!");
Proposal::single_step(
step.transaction_request().clone(),
step.payment_pools().clone(),
Expand Down Expand Up @@ -401,6 +403,7 @@ pub mod proposal {
/// due to invalid values.
#[allow(dead_code)]
pub fn build(self) -> Step<NoteId> {
dbg!("building!");
Step::from_parts(
&[],
self.transaction_request.unwrap(),
Expand Down
Loading