@@ -35,13 +35,20 @@ class OrderGadget : public GadgetT
3535 DualVariableGadget feeBips;
3636 DualVariableGadget amm;
3737
38+ DualVariableGadget feeBipsMultiplierFlag;
39+ DualVariableGadget feeBipsData;
40+
3841 NotGadget notAmm;
3942
4043 // Checks
4144 RequireLeqGadget feeBips_leq_maxFeeBips;
4245 RequireNotEqualGadget tokenS_neq_tokenB;
4346 RequireNotZeroGadget amountS_notZero;
4447 RequireNotZeroGadget amountB_notZero;
48+ // Fee checks
49+ TernaryGadget feeMultiplier;
50+ UnsafeMulGadget decodedFeeBips;
51+ RequireEqualGadget feeBipsEqualsDecodedFeeBips;
4552
4653 // Signature
4754 Poseidon_11 hash;
@@ -68,6 +75,9 @@ class OrderGadget : public GadgetT
6875 feeBips(pb, NUM_BITS_BIPS, FMT(prefix, " .feeBips" )),
6976 amm(pb, 1 , FMT(prefix, " .amm" )),
7077
78+ feeBipsMultiplierFlag(pb, 1 , FMT(prefix, " .feeBipsMultiplierFlag" )),
79+ feeBipsData(pb, NUM_BITS_BIPS_DA, FMT(prefix, " .feeBipsData" )),
80+
7181 notAmm(pb, amm.packed, FMT(prefix, " .notAmm" )),
7282
7383 // Checks
@@ -80,6 +90,19 @@ class OrderGadget : public GadgetT
8090 tokenS_neq_tokenB(pb, tokenS.packed, tokenB.packed, FMT(prefix, " .tokenS != tokenB" )),
8191 amountS_notZero(pb, amountS.packed, FMT(prefix, " .amountS != 0" )),
8292 amountB_notZero(pb, amountB.packed, FMT(prefix, " .amountB != 0" )),
93+ // Fee checks
94+ feeMultiplier(
95+ pb,
96+ feeBipsMultiplierFlag.packed,
97+ constants.feeMultiplier,
98+ constants._1,
99+ FMT (prefix, " .feeMultiplier" )),
100+ decodedFeeBips(pb, feeBipsData.packed, feeMultiplier.result(), FMT(prefix, " .decodedFeeBips" )),
101+ feeBipsEqualsDecodedFeeBips(
102+ pb,
103+ feeBips.packed,
104+ decodedFeeBips.result(),
105+ FMT(prefix, " .feeBipsEqualsDecodedFeeBips" )),
83106
84107 // Signature
85108 hash(
@@ -117,13 +140,30 @@ class OrderGadget : public GadgetT
117140 feeBips.generate_r1cs_witness (pb, order.feeBips );
118141 amm.generate_r1cs_witness (pb, order.amm );
119142
143+ // Use the fee multiplier if necessary
144+ if (toBigInt (order.feeBips ) >= 64 /* 2**NUM_BITS_BIPS_DA*/ )
145+ {
146+ feeBipsMultiplierFlag.generate_r1cs_witness (pb, ethsnarks::FieldT (1 ));
147+ feeBipsData.generate_r1cs_witness (
148+ pb, ethsnarks::FieldT ((toBigInt (order.feeBips ) / FEE_MULTIPLIER).to_int ()));
149+ }
150+ else
151+ {
152+ feeBipsMultiplierFlag.generate_r1cs_witness (pb, ethsnarks::FieldT (0 ));
153+ feeBipsData.generate_r1cs_witness (pb, order.feeBips );
154+ }
155+
120156 notAmm.generate_r1cs_witness ();
121157
122158 // Checks
123159 feeBips_leq_maxFeeBips.generate_r1cs_witness ();
124160 tokenS_neq_tokenB.generate_r1cs_witness ();
125161 amountS_notZero.generate_r1cs_witness ();
126162 amountB_notZero.generate_r1cs_witness ();
163+ // Fee checks
164+ feeMultiplier.generate_r1cs_witness ();
165+ decodedFeeBips.generate_r1cs_witness ();
166+ feeBipsEqualsDecodedFeeBips.generate_r1cs_witness ();
127167
128168 // Signature
129169 hash.generate_r1cs_witness ();
@@ -145,13 +185,20 @@ class OrderGadget : public GadgetT
145185 feeBips.generate_r1cs_constraints (true );
146186 amm.generate_r1cs_constraints (true );
147187
188+ feeBipsMultiplierFlag.generate_r1cs_constraints (true );
189+ feeBipsData.generate_r1cs_constraints (true );
190+
148191 notAmm.generate_r1cs_constraints ();
149192
150193 // Checks
151194 feeBips_leq_maxFeeBips.generate_r1cs_constraints ();
152195 tokenS_neq_tokenB.generate_r1cs_constraints ();
153196 amountS_notZero.generate_r1cs_constraints ();
154197 amountB_notZero.generate_r1cs_constraints ();
198+ // Fee checks
199+ feeMultiplier.generate_r1cs_constraints ();
200+ decodedFeeBips.generate_r1cs_constraints ();
201+ feeBipsEqualsDecodedFeeBips.generate_r1cs_constraints ();
155202
156203 // Signature
157204 hash.generate_r1cs_constraints ();
0 commit comments