[zk-token-sdk] Fix transfer with fee edge case error (#34314)
This commit is contained in:
parent
cf0c52c207
commit
d21e7edd2b
|
@ -41,6 +41,8 @@ use {
|
||||||
const MAX_FEE_BASIS_POINTS: u64 = 10_000;
|
const MAX_FEE_BASIS_POINTS: u64 = 10_000;
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
const ONE_IN_BASIS_POINTS: u128 = MAX_FEE_BASIS_POINTS as u128;
|
const ONE_IN_BASIS_POINTS: u128 = MAX_FEE_BASIS_POINTS as u128;
|
||||||
|
#[cfg(not(target_os = "solana"))]
|
||||||
|
const MAX_DELTA_RANGE: u64 = MAX_FEE_BASIS_POINTS - 1;
|
||||||
|
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
const TRANSFER_SOURCE_AMOUNT_BITS: usize = 64;
|
const TRANSFER_SOURCE_AMOUNT_BITS: usize = 64;
|
||||||
|
@ -51,7 +53,7 @@ const TRANSFER_AMOUNT_LO_NEGATED_BITS: usize = 16;
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
const TRANSFER_AMOUNT_HI_BITS: usize = 32;
|
const TRANSFER_AMOUNT_HI_BITS: usize = 32;
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
const TRANSFER_DELTA_BITS: usize = 48;
|
const TRANSFER_DELTA_BITS: usize = 16;
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
const FEE_AMOUNT_LO_BITS: usize = 16;
|
const FEE_AMOUNT_LO_BITS: usize = 16;
|
||||||
#[cfg(not(target_os = "solana"))]
|
#[cfg(not(target_os = "solana"))]
|
||||||
|
@ -62,6 +64,7 @@ lazy_static::lazy_static! {
|
||||||
pub static ref COMMITMENT_MAX: PedersenCommitment = Pedersen::encode((1_u64 <<
|
pub static ref COMMITMENT_MAX: PedersenCommitment = Pedersen::encode((1_u64 <<
|
||||||
TRANSFER_AMOUNT_LO_NEGATED_BITS) - 1);
|
TRANSFER_AMOUNT_LO_NEGATED_BITS) - 1);
|
||||||
pub static ref COMMITMENT_MAX_FEE_BASIS_POINTS: PedersenCommitment = Pedersen::encode(MAX_FEE_BASIS_POINTS);
|
pub static ref COMMITMENT_MAX_FEE_BASIS_POINTS: PedersenCommitment = Pedersen::encode(MAX_FEE_BASIS_POINTS);
|
||||||
|
pub static ref COMMITMENT_MAX_DELTA_RANGE: PedersenCommitment = Pedersen::encode(MAX_DELTA_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The instruction data that is needed for the `ProofInstruction::TransferWithFee` instruction.
|
/// The instruction data that is needed for the `ProofInstruction::TransferWithFee` instruction.
|
||||||
|
@ -557,24 +560,41 @@ impl TransferWithFeeProof {
|
||||||
|
|
||||||
// generate the range proof
|
// generate the range proof
|
||||||
let opening_claimed_negated = &PedersenOpening::default() - &opening_claimed;
|
let opening_claimed_negated = &PedersenOpening::default() - &opening_claimed;
|
||||||
|
|
||||||
|
let combined_amount = combine_lo_hi_u64(
|
||||||
|
transfer_amount_lo,
|
||||||
|
transfer_amount_hi,
|
||||||
|
TRANSFER_AMOUNT_LO_BITS,
|
||||||
|
);
|
||||||
|
let amount_sub_fee = combined_amount
|
||||||
|
.checked_sub(combined_fee_amount)
|
||||||
|
.ok_or(ProofGenerationError::FeeCalculation)?;
|
||||||
|
let amount_sub_fee_opening = combined_opening - combined_fee_opening;
|
||||||
|
|
||||||
|
let delta_negated = MAX_DELTA_RANGE
|
||||||
|
.checked_sub(delta_fee)
|
||||||
|
.ok_or(ProofGenerationError::FeeCalculation)?;
|
||||||
|
|
||||||
let range_proof = RangeProof::new(
|
let range_proof = RangeProof::new(
|
||||||
vec![
|
vec![
|
||||||
source_new_balance,
|
source_new_balance,
|
||||||
transfer_amount_lo,
|
transfer_amount_lo,
|
||||||
transfer_amount_hi,
|
transfer_amount_hi,
|
||||||
delta_fee,
|
delta_fee,
|
||||||
MAX_FEE_BASIS_POINTS - delta_fee,
|
delta_negated,
|
||||||
fee_amount_lo,
|
fee_amount_lo,
|
||||||
fee_amount_hi,
|
fee_amount_hi,
|
||||||
|
amount_sub_fee,
|
||||||
],
|
],
|
||||||
vec![
|
vec![
|
||||||
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
||||||
TRANSFER_AMOUNT_LO_BITS, // 16
|
TRANSFER_AMOUNT_LO_BITS, // 16
|
||||||
TRANSFER_AMOUNT_HI_BITS, // 32
|
TRANSFER_AMOUNT_HI_BITS, // 32
|
||||||
TRANSFER_DELTA_BITS, // 48
|
TRANSFER_DELTA_BITS, // 16
|
||||||
TRANSFER_DELTA_BITS, // 48
|
TRANSFER_DELTA_BITS, // 16
|
||||||
FEE_AMOUNT_LO_BITS, // 16
|
FEE_AMOUNT_LO_BITS, // 16
|
||||||
FEE_AMOUNT_HI_BITS, // 32
|
FEE_AMOUNT_HI_BITS, // 32
|
||||||
|
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
||||||
],
|
],
|
||||||
vec![
|
vec![
|
||||||
&opening_source,
|
&opening_source,
|
||||||
|
@ -584,6 +604,7 @@ impl TransferWithFeeProof {
|
||||||
&opening_claimed_negated,
|
&opening_claimed_negated,
|
||||||
opening_fee_lo,
|
opening_fee_lo,
|
||||||
opening_fee_hi,
|
opening_fee_hi,
|
||||||
|
&amount_sub_fee_opening,
|
||||||
],
|
],
|
||||||
transcript,
|
transcript,
|
||||||
)?;
|
)?;
|
||||||
|
@ -708,7 +729,8 @@ impl TransferWithFeeProof {
|
||||||
|
|
||||||
// verify range proof
|
// verify range proof
|
||||||
let new_source_commitment = self.new_source_commitment.try_into()?;
|
let new_source_commitment = self.new_source_commitment.try_into()?;
|
||||||
let claimed_commitment_negated = &(*COMMITMENT_MAX_FEE_BASIS_POINTS) - &claimed_commitment;
|
let claimed_commitment_negated = &(*COMMITMENT_MAX_DELTA_RANGE) - &claimed_commitment;
|
||||||
|
let amount_sub_fee_commitment = combined_commitment - combined_fee_commitment;
|
||||||
|
|
||||||
range_proof.verify(
|
range_proof.verify(
|
||||||
vec![
|
vec![
|
||||||
|
@ -719,15 +741,17 @@ impl TransferWithFeeProof {
|
||||||
&claimed_commitment_negated,
|
&claimed_commitment_negated,
|
||||||
fee_ciphertext_lo.get_commitment(),
|
fee_ciphertext_lo.get_commitment(),
|
||||||
fee_ciphertext_hi.get_commitment(),
|
fee_ciphertext_hi.get_commitment(),
|
||||||
|
&amount_sub_fee_commitment,
|
||||||
],
|
],
|
||||||
vec![
|
vec![
|
||||||
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
||||||
TRANSFER_AMOUNT_LO_BITS, // 16
|
TRANSFER_AMOUNT_LO_BITS, // 16
|
||||||
TRANSFER_AMOUNT_HI_BITS, // 32
|
TRANSFER_AMOUNT_HI_BITS, // 32
|
||||||
TRANSFER_DELTA_BITS, // 48
|
TRANSFER_DELTA_BITS, // 16
|
||||||
TRANSFER_DELTA_BITS, // 48
|
TRANSFER_DELTA_BITS, // 16
|
||||||
FEE_AMOUNT_LO_BITS, // 16
|
FEE_AMOUNT_LO_BITS, // 16
|
||||||
FEE_AMOUNT_HI_BITS, // 32
|
FEE_AMOUNT_HI_BITS, // 32
|
||||||
|
TRANSFER_SOURCE_AMOUNT_BITS, // 64
|
||||||
],
|
],
|
||||||
transcript,
|
transcript,
|
||||||
)?;
|
)?;
|
||||||
|
|
Loading…
Reference in New Issue