Skip to content

Commit e321b6c

Browse files
Brechtpddong77
andauthored
[Protocol 3.8] AMM v2 - Mirage (#2432)
* [protocol 3] Initial commit amm v2 * [protocol 3.8] Amm v2 improvements * Small improvements * Small simplification * Update AmmData.sol * Amm v2 - AssetManager fix (#2445) * [AMM] Fix pools with active asset manager * Feedback * Amm v2 - Exit mode and pool reuse (#2450) * AMM v2 - minor improvement over brecht's code (#2458) Co-authored-by: Daniel Wang <daniel@loopring.org> * Amm v2 improve2 (#2462) * Update AmplifiedAmmController.sol * Update AmplifiedAmmController.sol * AMM v2: minor improvements (#2466) Co-authored-by: Daniel Wang <daniel@loopring.org>
1 parent ffc7b56 commit e321b6c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1809
-1257
lines changed

packages/loopring_v3.js/src/exchange_v3.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ export class ExchangeV3 {
626626

627627
// Get the block data from the transaction data
628628
//const submitBlocksFunctionSignature = "0x8dadd3af"; // submitBlocks
629-
const submitBlocksFunctionSignature = "0xc39ce618"; // submitBlocksWithCallbacks
629+
const submitBlocksFunctionSignature = "0xfbb404ab"; // submitBlocksWithCallbacks
630630

631631
const transaction = await this.web3.eth.getTransaction(
632632
event.transactionHash

packages/loopring_v3.js/src/request_processors/spot_trade_processor.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ export class SpotTradeProcessor {
100100
.balance.iadd(s.fillBA)
101101
.isub(s.feeA);
102102

103+
// virtual balances
104+
if (
105+
accountA.getBalance(tokenA).weightAMM.gt(new BN(0)) &&
106+
accountA.getBalance(tokenB).weightAMM.gt(new BN(0))
107+
) {
108+
accountA.getBalance(tokenA).weightAMM.isub(s.fillSA);
109+
accountA.getBalance(tokenB).weightAMM.iadd(s.fillBA);
110+
}
111+
103112
const tradeHistoryA = accountA.getBalance(tokenA).getStorage(storageIdA);
104113
if (tradeHistoryA.storageID !== storageIdA) {
105114
tradeHistoryA.data = new BN(0);
@@ -116,6 +125,15 @@ export class SpotTradeProcessor {
116125
.balance.iadd(s.fillBB)
117126
.isub(s.feeB);
118127

128+
// virtual balances
129+
if (
130+
accountB.getBalance(tokenA).weightAMM.gt(new BN(0)) &&
131+
accountB.getBalance(tokenB).weightAMM.gt(new BN(0))
132+
) {
133+
accountB.getBalance(tokenB).weightAMM.isub(s.fillBA);
134+
accountB.getBalance(tokenA).weightAMM.iadd(s.fillSA);
135+
}
136+
119137
const tradeHistoryB = accountB.getBalance(tokenB).getStorage(storageIdB);
120138
if (tradeHistoryB.storageID !== storageIdB) {
121139
tradeHistoryB.data = new BN(0);

packages/loopring_v3/circuit/Circuits/BaseTransactionCircuit.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ enum TxVariable
180180
TXV_BALANCE_A_S_WEIGHTAMM,
181181

182182
TXV_BALANCE_A_B_BALANCE,
183+
TXV_BALANCE_A_B_WEIGHTAMM,
183184

184185
TXV_ACCOUNT_A_ADDRESS,
185186
TXV_ACCOUNT_A_OWNER,
@@ -194,8 +195,10 @@ enum TxVariable
194195

195196
TXV_BALANCE_B_S_ADDRESS,
196197
TXV_BALANCE_B_S_BALANCE,
198+
TXV_BALANCE_B_S_WEIGHTAMM,
197199

198200
TXV_BALANCE_B_B_BALANCE,
201+
TXV_BALANCE_B_B_WEIGHTAMM,
199202

200203
TXV_ACCOUNT_B_ADDRESS,
201204
TXV_ACCOUNT_B_OWNER,
@@ -245,6 +248,7 @@ class BaseTransactionCircuit : public GadgetT
245248
uOutputs[TXV_BALANCE_A_S_WEIGHTAMM] = state.accountA.balanceS.weightAMM;
246249

247250
uOutputs[TXV_BALANCE_A_B_BALANCE] = state.accountA.balanceB.balance;
251+
uOutputs[TXV_BALANCE_A_B_WEIGHTAMM] = state.accountA.balanceB.weightAMM;
248252

249253
aOutputs[TXV_ACCOUNT_A_ADDRESS] =
250254
flatten({VariableArrayT(1, state.constants._1), VariableArrayT(NUM_BITS_ACCOUNT - 1, state.constants._0)});
@@ -260,8 +264,10 @@ class BaseTransactionCircuit : public GadgetT
260264

261265
aOutputs[TXV_BALANCE_B_S_ADDRESS] = VariableArrayT(NUM_BITS_TOKEN, state.constants._0);
262266
uOutputs[TXV_BALANCE_B_S_BALANCE] = state.accountB.balanceS.balance;
267+
uOutputs[TXV_BALANCE_B_S_WEIGHTAMM] = state.accountB.balanceS.weightAMM;
263268

264269
uOutputs[TXV_BALANCE_B_B_BALANCE] = state.accountB.balanceB.balance;
270+
uOutputs[TXV_BALANCE_B_B_WEIGHTAMM] = state.accountB.balanceB.weightAMM;
265271

266272
aOutputs[TXV_ACCOUNT_B_ADDRESS] =
267273
flatten({VariableArrayT(1, state.constants._1), VariableArrayT(NUM_BITS_ACCOUNT - 1, state.constants._0)});

packages/loopring_v3/circuit/Circuits/SpotTradeCircuit.h

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ class SpotTradeCircuit : public BaseTransactionCircuit
3232
DynamicBalanceGadget balanceA_O;
3333
DynamicBalanceGadget balanceB_O;
3434

35+
DynamicBalanceGadget vbalanceS_A;
36+
DynamicBalanceGadget vbalanceB_A;
37+
DynamicBalanceGadget vbalanceS_B;
38+
DynamicBalanceGadget vbalanceB_B;
39+
3540
// Order fills
3641
FloatGadget fillS_A;
3742
FloatGadget fillS_B;
@@ -59,6 +64,16 @@ class SpotTradeCircuit : public BaseTransactionCircuit
5964
TransferGadget protocolFeeA_from_balanceAO_to_balanceAP;
6065
TransferGadget protocolFeeB_from_balanceBO_to_balanceBP;
6166

67+
/* Virtual Token Transfers */
68+
TernaryGadget vfills_S_A;
69+
TernaryGadget vfills_B_A;
70+
TernaryGadget vfills_S_B;
71+
TernaryGadget vfills_B_B;
72+
SubGadget update_vbalanceS_A;
73+
AddGadget update_vbalanceB_A;
74+
SubGadget update_vbalanceS_B;
75+
AddGadget update_vbalanceB_B;
76+
6277
// AMM validation
6378
ValidateAMMGadget validateAMM;
6479

@@ -82,6 +97,12 @@ class SpotTradeCircuit : public BaseTransactionCircuit
8297
balanceA_O(pb, state.oper.balanceA, FMT(prefix, ".balanceA_O")),
8398
balanceB_O(pb, state.oper.balanceB, FMT(prefix, ".balanceB_O")),
8499

100+
// Virtual balances
101+
vbalanceS_A(pb, state.accountA.balanceS.weightAMM, FMT(prefix, ".vbalanceS_A")),
102+
vbalanceB_A(pb, state.accountA.balanceB.weightAMM, FMT(prefix, ".vbalanceB_A")),
103+
vbalanceS_B(pb, state.accountB.balanceS.weightAMM, FMT(prefix, ".vbalanceS_B")),
104+
vbalanceB_B(pb, state.accountB.balanceB.weightAMM, FMT(prefix, ".vbalanceB_B")),
105+
85106
// Order fills
86107
fillS_A(pb, state.constants, Float24Encoding, FMT(prefix, ".fillS_A")),
87108
fillS_B(pb, state.constants, Float24Encoding, FMT(prefix, ".fillS_B")),
@@ -175,28 +196,55 @@ class SpotTradeCircuit : public BaseTransactionCircuit
175196
feeCalculatorB.getProtocolFee(),
176197
FMT(prefix, ".protocolFeeB_from_balanceBO_to_balanceBP")),
177198

199+
/* Virtual balance updates (for AMMs only) */
200+
vfills_S_A(pb, orderA.amm.packed, fillS_A.value(), state.constants._0, FMT(prefix, ".vfills_S_A")),
201+
vfills_B_A(pb, orderA.amm.packed, fillS_B.value(), state.constants._0, FMT(prefix, ".vfills_B_A")),
202+
vfills_S_B(pb, orderB.amm.packed, fillS_B.value(), state.constants._0, FMT(prefix, ".vfills_S_B")),
203+
vfills_B_B(pb, orderB.amm.packed, fillS_A.value(), state.constants._0, FMT(prefix, ".vfills_B_B")),
204+
update_vbalanceS_A(
205+
pb,
206+
state.accountA.balanceS.weightAMM,
207+
vfills_S_A.result(),
208+
NUM_BITS_AMOUNT,
209+
FMT(prefix, ".update_vbalanceS_A")),
210+
update_vbalanceB_A(
211+
pb,
212+
state.accountA.balanceB.weightAMM,
213+
vfills_B_A.result(),
214+
NUM_BITS_AMOUNT,
215+
FMT(prefix, ".update_vbalanceB_A")),
216+
update_vbalanceS_B(
217+
pb,
218+
state.accountB.balanceS.weightAMM,
219+
vfills_S_B.result(),
220+
NUM_BITS_AMOUNT,
221+
FMT(prefix, ".update_vbalanceS_B")),
222+
update_vbalanceB_B(
223+
pb,
224+
state.accountB.balanceB.weightAMM,
225+
vfills_B_B.result(),
226+
NUM_BITS_AMOUNT,
227+
FMT(prefix, ".update_vbalanceB_B")),
228+
178229
validateAMM(
179230
pb,
180231
state.constants,
232+
isSpotTradeTx.result(),
181233
{orderA.amm.packed,
182234
orderA.feeBips.packed,
183235
fillS_A.value(),
184-
state.accountA.balanceS.balance,
185-
state.accountA.balanceB.balance,
186-
balanceS_A.balance(),
187-
balanceB_A.balance(),
188236
state.accountA.balanceS.weightAMM,
189237
state.accountA.balanceB.weightAMM,
238+
update_vbalanceS_A.result(),
239+
update_vbalanceB_A.result(),
190240
state.accountA.account.feeBipsAMM},
191241
{orderB.amm.packed,
192242
orderB.feeBips.packed,
193243
fillS_B.value(),
194-
state.accountB.balanceS.balance,
195-
state.accountB.balanceB.balance,
196-
balanceS_B.balance(),
197-
balanceB_B.balance(),
198244
state.accountB.balanceS.weightAMM,
199245
state.accountB.balanceB.weightAMM,
246+
update_vbalanceS_B.result(),
247+
update_vbalanceB_B.result(),
200248
state.accountB.account.feeBipsAMM},
201249
FMT(prefix, ".validateAMM"))
202250
{
@@ -210,6 +258,8 @@ class SpotTradeCircuit : public BaseTransactionCircuit
210258
setOutput(TXV_STORAGE_A_STORAGEID, orderA.storageID.packed);
211259
setOutput(TXV_BALANCE_A_S_BALANCE, balanceS_A.balance());
212260
setOutput(TXV_BALANCE_A_B_BALANCE, balanceB_A.balance());
261+
setOutput(TXV_BALANCE_A_S_WEIGHTAMM, update_vbalanceS_A.result());
262+
setOutput(TXV_BALANCE_A_B_WEIGHTAMM, update_vbalanceB_A.result());
213263
setArrayOutput(TXV_ACCOUNT_A_ADDRESS, orderA.accountID.bits);
214264

215265
// Update account B
@@ -218,6 +268,8 @@ class SpotTradeCircuit : public BaseTransactionCircuit
218268
setOutput(TXV_STORAGE_B_STORAGEID, orderB.storageID.packed);
219269
setOutput(TXV_BALANCE_B_S_BALANCE, balanceS_B.balance());
220270
setOutput(TXV_BALANCE_B_B_BALANCE, balanceB_B.balance());
271+
setOutput(TXV_BALANCE_B_S_WEIGHTAMM, update_vbalanceS_B.result());
272+
setOutput(TXV_BALANCE_B_B_WEIGHTAMM, update_vbalanceB_B.result());
221273
setArrayOutput(TXV_ACCOUNT_B_ADDRESS, orderB.accountID.bits);
222274

223275
// Update balances of the protocol fee pool
@@ -252,6 +304,12 @@ class SpotTradeCircuit : public BaseTransactionCircuit
252304
balanceA_O.generate_r1cs_witness();
253305
balanceB_O.generate_r1cs_witness();
254306

307+
// Virtual balances
308+
vbalanceS_A.generate_r1cs_witness();
309+
vbalanceB_A.generate_r1cs_witness();
310+
vbalanceS_B.generate_r1cs_witness();
311+
vbalanceB_B.generate_r1cs_witness();
312+
255313
// Order fills
256314
fillS_A.generate_r1cs_witness(spotTrade.fillS_A);
257315
fillS_B.generate_r1cs_witness(spotTrade.fillS_B);
@@ -279,6 +337,16 @@ class SpotTradeCircuit : public BaseTransactionCircuit
279337
protocolFeeA_from_balanceAO_to_balanceAP.generate_r1cs_witness();
280338
protocolFeeB_from_balanceBO_to_balanceBP.generate_r1cs_witness();
281339

340+
/* Virtual Token Transfers */
341+
vfills_S_A.generate_r1cs_witness();
342+
vfills_B_A.generate_r1cs_witness();
343+
vfills_S_B.generate_r1cs_witness();
344+
vfills_B_B.generate_r1cs_witness();
345+
update_vbalanceS_A.generate_r1cs_witness();
346+
update_vbalanceB_A.generate_r1cs_witness();
347+
update_vbalanceS_B.generate_r1cs_witness();
348+
update_vbalanceB_B.generate_r1cs_witness();
349+
282350
// AMM validation
283351
validateAMM.generate_r1cs_witness();
284352
}
@@ -299,6 +367,12 @@ class SpotTradeCircuit : public BaseTransactionCircuit
299367
balanceA_O.generate_r1cs_constraints();
300368
balanceB_O.generate_r1cs_constraints();
301369

370+
// Virtual balances
371+
vbalanceS_A.generate_r1cs_constraints();
372+
vbalanceB_A.generate_r1cs_constraints();
373+
vbalanceS_B.generate_r1cs_constraints();
374+
vbalanceB_B.generate_r1cs_constraints();
375+
302376
// Order fills
303377
fillS_A.generate_r1cs_constraints();
304378
fillS_B.generate_r1cs_constraints();
@@ -326,6 +400,16 @@ class SpotTradeCircuit : public BaseTransactionCircuit
326400
protocolFeeA_from_balanceAO_to_balanceAP.generate_r1cs_constraints();
327401
protocolFeeB_from_balanceBO_to_balanceBP.generate_r1cs_constraints();
328402

403+
/* Virtual Token Transfers */
404+
vfills_S_A.generate_r1cs_constraints();
405+
vfills_B_A.generate_r1cs_constraints();
406+
vfills_S_B.generate_r1cs_constraints();
407+
vfills_B_B.generate_r1cs_constraints();
408+
update_vbalanceS_A.generate_r1cs_constraints();
409+
update_vbalanceB_A.generate_r1cs_constraints();
410+
update_vbalanceS_B.generate_r1cs_constraints();
411+
update_vbalanceB_B.generate_r1cs_constraints();
412+
329413
// AMM validation
330414
validateAMM.generate_r1cs_constraints();
331415
}

packages/loopring_v3/circuit/Circuits/UniversalCircuit.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ class TransactionGadget : public GadgetT
287287
tx.getArrayOutput(TXV_BALANCE_B_S_ADDRESS),
288288
{state.accountA.balanceB.balance, state.accountA.balanceB.weightAMM, state.accountA.balanceB.storageRoot},
289289
{tx.getOutput(TXV_BALANCE_A_B_BALANCE),
290-
state.accountA.balanceB.weightAMM,
290+
tx.getOutput(TXV_BALANCE_A_B_WEIGHTAMM),
291291
state.accountA.balanceB.storageRoot},
292292
FMT(prefix, ".updateBalanceB_A")),
293293
updateAccount_A(
@@ -321,15 +321,15 @@ class TransactionGadget : public GadgetT
321321
state.accountB.account.balancesRoot,
322322
tx.getArrayOutput(TXV_BALANCE_B_S_ADDRESS),
323323
{state.accountB.balanceS.balance, state.accountB.balanceS.weightAMM, state.accountB.balanceS.storageRoot},
324-
{tx.getOutput(TXV_BALANCE_B_S_BALANCE), state.accountB.balanceS.weightAMM, updateStorage_B.result()},
324+
{tx.getOutput(TXV_BALANCE_B_S_BALANCE), tx.getOutput(TXV_BALANCE_B_S_WEIGHTAMM), updateStorage_B.result()},
325325
FMT(prefix, ".updateBalanceS_B")),
326326
updateBalanceB_B(
327327
pb,
328328
updateBalanceS_B.result(),
329329
tx.getArrayOutput(TXV_BALANCE_A_S_ADDRESS),
330330
{state.accountB.balanceB.balance, state.accountB.balanceB.weightAMM, state.accountB.balanceB.storageRoot},
331331
{tx.getOutput(TXV_BALANCE_B_B_BALANCE),
332-
state.accountB.balanceB.weightAMM,
332+
tx.getOutput(TXV_BALANCE_B_B_WEIGHTAMM),
333333
state.accountB.balanceB.storageRoot},
334334
FMT(prefix, ".updateBalanceB_B")),
335335
updateAccount_B(

packages/loopring_v3/circuit/Gadgets/AccountGadgets.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ class UpdateBalanceGadget : public GadgetT
301301
}
302302
};
303303

304-
// Calculcates the state of a user's open position
304+
// Calculcates the state of a user's balance
305305
class DynamicBalanceGadget : public DynamicVariableGadget
306306
{
307307
public:

0 commit comments

Comments
 (0)