Skip to content

Commit 02f8aed

Browse files
authored
Merge pull request #29 from Loopring/flexible-order-matching
Flexible/Less complex order matching
2 parents 0e747b2 + e37add2 commit 02f8aed

File tree

6 files changed

+213
-446
lines changed

6 files changed

+213
-446
lines changed

Circuits/RingSettlementCircuit.h

Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -124,22 +124,12 @@ class RingSettlementGadget : public GadgetT
124124
const VariableT tradingHistoryRootA_O;
125125
const VariableT tradingHistoryRootB_O;
126126

127-
// Match orders
128-
OrderMatchingGadget orderMatching;
129-
130-
// Fill amounts
131-
TernaryGadget uFillS_A;
132-
TernaryGadget uFillS_B;
127+
// Order fills
133128
FloatGadget fillS_A;
134129
FloatGadget fillS_B;
135-
RequireAccuracyGadget requireAccuracyFillS_A;
136-
RequireAccuracyGadget requireAccuracyFillS_B;
137130

138-
// Filled amounts
139-
TernaryGadget filledA;
140-
TernaryGadget filledB;
141-
AddGadget filledAfterA;
142-
AddGadget filledAfterB;
131+
// Match orders
132+
OrderMatchingGadget orderMatching;
143133

144134
// Calculate fees
145135
FeeCalculatorGadget feeCalculatorA;
@@ -212,22 +202,12 @@ class RingSettlementGadget : public GadgetT
212202
tradingHistoryRootA_O(make_variable(pb, FMT(prefix, ".tradingHistoryRootA_O"))),
213203
tradingHistoryRootB_O(make_variable(pb, FMT(prefix, ".tradingHistoryRootB_O"))),
214204

215-
// Match orders
216-
orderMatching(pb, constants, timestamp, orderA, orderB, FMT(prefix, ".orderMatching")),
217-
218-
// Fill amounts
219-
uFillS_A(pb, orderMatching.isValid(), orderMatching.getFillA_S(), constants.zero, FMT(prefix, ".uFillS_A")),
220-
uFillS_B(pb, orderMatching.isValid(), orderMatching.getFillB_S(), constants.zero, FMT(prefix, ".uFillS_B")),
205+
// Order fills
221206
fillS_A(pb, constants, Float24Encoding, FMT(prefix, ".fillS_A")),
222207
fillS_B(pb, constants, Float24Encoding, FMT(prefix, ".fillS_B")),
223-
requireAccuracyFillS_A(pb, fillS_A.value(), uFillS_A.result(), Float24Accuracy, NUM_BITS_AMOUNT, FMT(prefix, ".requireAccuracyFillS_A")),
224-
requireAccuracyFillS_B(pb, fillS_B.value(), uFillS_B.result(), Float24Accuracy, NUM_BITS_AMOUNT, FMT(prefix, ".requireAccuracyFillS_B")),
225208

226-
// Filled amounts
227-
filledA(pb, orderA.buy.packed, fillS_B.value(), fillS_A.value(), FMT(prefix, ".filledA")),
228-
filledB(pb, orderB.buy.packed, fillS_A.value(), fillS_B.value(), FMT(prefix, ".filledB")),
229-
filledAfterA(pb, orderA.tradeHistory.getFilled(), filledA.result(), NUM_BITS_AMOUNT, FMT(prefix, ".filledAfterA")),
230-
filledAfterB(pb, orderB.tradeHistory.getFilled(), filledB.result(), NUM_BITS_AMOUNT, FMT(prefix, ".filledAfterB")),
209+
// Match orders
210+
orderMatching(pb, constants, timestamp, orderA, orderB, fillS_A.value(), fillS_B.value(), FMT(prefix, ".orderMatching")),
231211

232212
// Calculate fees
233213
feeCalculatorA(pb, constants, fillS_B.value(), protocolTakerFeeBips, orderA.feeBips.packed, orderA.rebateBips.packed, FMT(prefix, ".feeCalculatorA")),
@@ -250,7 +230,7 @@ class RingSettlementGadget : public GadgetT
250230
// Update UserA
251231
updateTradeHistory_A(pb, orderA.balanceSBefore.tradingHistory, subArray(orderA.orderID.bits, 0, NUM_BITS_TRADING_HISTORY),
252232
{orderA.tradeHistoryBefore.filled, orderA.tradeHistoryBefore.cancelled, orderA.tradeHistoryBefore.orderID},
253-
{filledAfterA.result(), orderA.tradeHistory.getCancelledToStore(), orderA.tradeHistory.getOrderIDToStore()},
233+
{orderMatching.getFilledAfter_A(), orderA.tradeHistory.getCancelledToStore(), orderA.tradeHistory.getOrderIDToStore()},
254234
FMT(prefix, ".updateTradeHistory_A")),
255235
updateBalanceS_A(pb, orderA.accountBefore.balancesRoot, orderA.tokenS.bits,
256236
{balanceS_A.front(), orderA.balanceSBefore.tradingHistory},
@@ -268,7 +248,7 @@ class RingSettlementGadget : public GadgetT
268248
// Update UserB
269249
updateTradeHistory_B(pb, orderB.balanceSBefore.tradingHistory, subArray(orderB.orderID.bits, 0, NUM_BITS_TRADING_HISTORY),
270250
{orderB.tradeHistoryBefore.filled, orderB.tradeHistoryBefore.cancelled, orderB.tradeHistoryBefore.orderID},
271-
{filledAfterB.result(), orderB.tradeHistory.getCancelledToStore(), orderB.tradeHistory.getOrderIDToStore()},
251+
{orderMatching.getFilledAfter_B(), orderB.tradeHistory.getCancelledToStore(), orderB.tradeHistory.getOrderIDToStore()},
272252
FMT(prefix, ".updateTradeHistory_B")),
273253
updateBalanceS_B(pb, orderB.accountBefore.balancesRoot, orderB.tokenS.bits,
274254
{balanceS_B.front(), orderB.balanceSBefore.tradingHistory},
@@ -329,23 +309,13 @@ class RingSettlementGadget : public GadgetT
329309
pb.val(tradingHistoryRootA_O) = ringSettlement.balanceUpdateA_O.before.tradingHistoryRoot;
330310
pb.val(tradingHistoryRootB_O) = ringSettlement.balanceUpdateB_O.before.tradingHistoryRoot;
331311

312+
// Order fills
313+
fillS_A.generate_r1cs_witness(ringSettlement.ring.fillS_A);
314+
fillS_B.generate_r1cs_witness(ringSettlement.ring.fillS_B);
315+
332316
// Match orders
333317
orderMatching.generate_r1cs_witness();
334318

335-
// Fill amounts
336-
uFillS_A.generate_r1cs_witness();
337-
uFillS_B.generate_r1cs_witness();
338-
fillS_A.generate_r1cs_witness(toFloat(pb.val(uFillS_A.result()), Float24Encoding));
339-
fillS_B.generate_r1cs_witness(toFloat(pb.val(uFillS_B.result()), Float24Encoding));
340-
requireAccuracyFillS_A.generate_r1cs_witness();
341-
requireAccuracyFillS_B.generate_r1cs_witness();
342-
343-
// Filled amounts
344-
filledA.generate_r1cs_witness();
345-
filledB.generate_r1cs_witness();
346-
filledAfterA.generate_r1cs_witness();
347-
filledAfterB.generate_r1cs_witness();
348-
349319
// Calculate fees
350320
feeCalculatorA.generate_r1cs_witness();
351321
feeCalculatorB.generate_r1cs_witness();
@@ -392,22 +362,12 @@ class RingSettlementGadget : public GadgetT
392362
orderA.generate_r1cs_constraints();
393363
orderB.generate_r1cs_constraints();
394364

395-
// Match orders
396-
orderMatching.generate_r1cs_constraints();
397-
398-
// Fill amounts
399-
uFillS_A.generate_r1cs_constraints();
400-
uFillS_B.generate_r1cs_constraints();
365+
// Order fills
401366
fillS_A.generate_r1cs_constraints();
402367
fillS_B.generate_r1cs_constraints();
403-
requireAccuracyFillS_A.generate_r1cs_constraints();
404-
requireAccuracyFillS_B.generate_r1cs_constraints();
405-
406-
// Filled amounts
407-
filledA.generate_r1cs_constraints();
408-
filledB.generate_r1cs_constraints();
409-
filledAfterA.generate_r1cs_constraints();
410-
filledAfterB.generate_r1cs_constraints();
368+
369+
// Match orders
370+
orderMatching.generate_r1cs_constraints();
411371

412372
// Calculate fees
413373
feeCalculatorA.generate_r1cs_constraints();

0 commit comments

Comments
 (0)