@@ -54,6 +54,7 @@ class TransferCircuit : public BaseTransactionCircuit
54
54
DualVariableGadget payer_to;
55
55
DualVariableGadget payee_toAccountID;
56
56
DualVariableGadget maxFee;
57
+ DualVariableGadget putAddressesInDA;
57
58
58
59
// Check if the inputs are valid
59
60
EqualGadget isTransferTx;
@@ -93,6 +94,7 @@ class TransferCircuit : public BaseTransactionCircuit
93
94
94
95
// DA optimization
95
96
OrGadget da_NeedsToAddress;
97
+ OrGadget da_NeedsFromAddress;
96
98
ArrayTernaryGadget da_To;
97
99
ArrayTernaryGadget da_From;
98
100
@@ -136,6 +138,7 @@ class TransferCircuit : public BaseTransactionCircuit
136
138
payer_to(pb, NUM_BITS_ADDRESS, FMT(prefix, " .payer_to" )),
137
139
payee_toAccountID(pb, NUM_BITS_ACCOUNT, FMT(prefix, " .payee_toAccountID" )),
138
140
maxFee(pb, NUM_BITS_AMOUNT, FMT(prefix, " .maxFee" )),
141
+ putAddressesInDA(pb, 1 , FMT(prefix, " .putAddressesInDA" )),
139
142
140
143
// Check if the inputs are valid
141
144
isTransferTx( //
@@ -256,17 +259,21 @@ class TransferCircuit : public BaseTransactionCircuit
256
259
// DA optimization
257
260
da_NeedsToAddress(
258
261
pb,
259
- {toAccountValid.isNewAccount (), isConditional.result ()},
262
+ {toAccountValid.isNewAccount (), isConditional.result (), putAddressesInDA. packed },
260
263
FMT (prefix, " .da_NeedsToAddress" )),
261
264
da_To(
262
265
pb,
263
266
da_NeedsToAddress.result(),
264
267
to.bits,
265
268
VariableArrayT(NUM_BITS_ADDRESS, state.constants._0),
266
269
FMT(prefix, " .da_To" )),
270
+ da_NeedsFromAddress(
271
+ pb,
272
+ {isConditional.result (), putAddressesInDA.packed },
273
+ FMT (prefix, " .da_NeedsFromAddress" )),
267
274
da_From(
268
275
pb,
269
- isConditional .result(),
276
+ da_NeedsFromAddress .result(),
270
277
from.bits,
271
278
VariableArrayT(NUM_BITS_ADDRESS, state.constants._0),
272
279
FMT(prefix, " .da_From" )),
@@ -361,6 +368,7 @@ class TransferCircuit : public BaseTransactionCircuit
361
368
payer_to.generate_r1cs_witness (pb, transfer.payerTo );
362
369
payee_toAccountID.generate_r1cs_witness (pb, transfer.payeeToAccountID );
363
370
maxFee.generate_r1cs_witness (pb, transfer.maxFee );
371
+ putAddressesInDA.generate_r1cs_witness (pb, transfer.putAddressesInDA );
364
372
365
373
// Check if the inputs are valid
366
374
isTransferTx.generate_r1cs_witness ();
@@ -401,6 +409,7 @@ class TransferCircuit : public BaseTransactionCircuit
401
409
// DA optimization
402
410
da_NeedsToAddress.generate_r1cs_witness ();
403
411
da_To.generate_r1cs_witness ();
412
+ da_NeedsFromAddress.generate_r1cs_witness ();
404
413
da_From.generate_r1cs_witness ();
405
414
406
415
// Fee as float
@@ -438,6 +447,7 @@ class TransferCircuit : public BaseTransactionCircuit
438
447
payer_to.generate_r1cs_constraints (true );
439
448
payee_toAccountID.generate_r1cs_constraints (true );
440
449
maxFee.generate_r1cs_constraints (true );
450
+ putAddressesInDA.generate_r1cs_constraints (true );
441
451
442
452
// Check if the inputs are valid
443
453
isTransferTx.generate_r1cs_constraints ();
@@ -478,6 +488,7 @@ class TransferCircuit : public BaseTransactionCircuit
478
488
// DA optimization
479
489
da_NeedsToAddress.generate_r1cs_constraints ();
480
490
da_To.generate_r1cs_constraints ();
491
+ da_NeedsFromAddress.generate_r1cs_constraints ();
481
492
da_From.generate_r1cs_constraints ();
482
493
483
494
// Fee as float
0 commit comments