diff --git a/zk-token-sdk/src/instruction/transfer.rs b/zk-token-sdk/src/instruction/transfer.rs index 7825211e0..9538b43d3 100644 --- a/zk-token-sdk/src/instruction/transfer.rs +++ b/zk-token-sdk/src/instruction/transfer.rs @@ -35,8 +35,8 @@ const TRANSFER_AMOUNT_HI_BIT_LENGTH: usize = 32; #[cfg(not(target_arch = "bpf"))] lazy_static::lazy_static! { - pub static ref COMMITMENT_MAX: PedersenCommitment = Pedersen::encode(1_u64 << - TRANSFER_AMOUNT_LO_NEGATED_BIT_LENGTH); + pub static ref COMMITMENT_MAX: PedersenCommitment = Pedersen::encode((1_u64 << + TRANSFER_AMOUNT_LO_NEGATED_BIT_LENGTH) - 1); } #[derive(Clone)] @@ -353,7 +353,7 @@ impl TransferProof { ) } else { let transfer_amount_lo_negated = - (1 << TRANSFER_AMOUNT_LO_NEGATED_BIT_LENGTH) - transfer_amount_lo as u64; + (1 << TRANSFER_AMOUNT_LO_NEGATED_BIT_LENGTH) - 1 - transfer_amount_lo as u64; let opening_lo_negated = &PedersenOpening::default() - opening_lo; RangeProof::new( @@ -513,6 +513,24 @@ mod test { let dest_pk = ElGamalKeypair::new_rand().public; let auditor_pk = ElGamalKeypair::new_rand().public; + // create source account spendable ciphertext + let spendable_balance: u64 = 0; + let spendable_ciphertext = source_keypair.public.encrypt(spendable_balance); + + // transfer amount + let transfer_amount: u64 = 0; + + // create transfer data + let transfer_data = TransferData::new( + transfer_amount, + (spendable_balance, &spendable_ciphertext), + &source_keypair, + (&dest_pk, &auditor_pk), + ) + .unwrap(); + + assert!(transfer_data.verify().is_ok()); + // create source account spendable ciphertext let spendable_balance: u64 = 77; let spendable_ciphertext = source_keypair.public.encrypt(spendable_balance);