Skip to content

Commit d1f7ad0

Browse files
Fix Quipuswap empty pool edge case (#42)
1 parent 322c46d commit d1f7ad0

File tree

4 files changed

+22
-6
lines changed

4 files changed

+22
-6
lines changed

src/demo_quipuswap/handlers/on_fa12_divest_liquidity.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,14 @@ async def on_fa12_divest_liquidity(
2929
token_qty = Decimal(transfer.parameter.value) / (10 ** decimals)
3030
shares_qty = int(divest_liquidity.parameter.shares)
3131

32-
price = (Decimal(storage.storage.tez_pool) / (10 ** 6)) / (Decimal(storage.storage.token_pool) / (10 ** decimals))
32+
tez_pool = Decimal(storage.storage.tez_pool) / (10 ** 6)
33+
token_pool = Decimal(storage.storage.token_pool) / (10 ** decimals)
34+
if tez_pool and token_pool:
35+
price = tez_pool / token_pool
36+
else:
37+
last_trade = await models.Trade.filter(symbol=symbol).order_by('-id').first()
38+
assert last_trade
39+
price = last_trade.price
3340
share_px = (tez_qty + price * token_qty) / shares_qty
3441

3542
position.realized_pl += shares_qty * (share_px - position.avg_share_px)

src/demo_quipuswap/handlers/on_fa20_divest_liquidity.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,20 @@ async def on_fa20_divest_liquidity(
2727
transaction = next(op for op in ctx.operations if op.amount)
2828

2929
tez_qty = Decimal(transaction.amount) / (10 ** 6)
30-
token_qty = Decimal(transfer.parameter.__root__[0].txs[0].amount) / (10 ** decimals)
30+
token_qty = sum(Decimal(tx.amount) for tx in transfer.parameter.__root__[0].txs) / (10 ** decimals)
3131
shares_qty = int(divest_liquidity.parameter.shares)
3232

33-
price = (Decimal(storage.storage.tez_pool) / (10 ** 6)) / (Decimal(storage.storage.token_pool) / (10 ** decimals))
34-
share_px = (tez_qty + price * token_qty) / shares_qty
33+
tez_pool = Decimal(storage.storage.tez_pool) / (10 ** 6)
34+
token_pool = Decimal(storage.storage.token_pool) / (10 ** decimals)
35+
if tez_pool and token_pool:
36+
price = tez_pool / token_pool
37+
share_px = (tez_qty + price * token_qty) / shares_qty
38+
else:
39+
last_trade = await models.Trade.filter(symbol=symbol).order_by('-id').first()
40+
assert last_trade
41+
price = last_trade.price
42+
shares_qty = 0
43+
share_px = 0
3544

3645
position.realized_pl += shares_qty * (share_px - position.avg_share_px)
3746
position.shares_qty -= shares_qty # type: ignore

src/demo_quipuswap/handlers/on_fa20_invest_liquidity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ async def on_fa20_invest_liquidity(
2626
position, _ = await models.Position.get_or_create(trader=trader, symbol=symbol)
2727

2828
tez_qty = Decimal(invest_liquidity.data.amount) / (10 ** 6)
29-
token_qty = Decimal(transfer.parameter.__root__[0].txs[0].amount) / (10 ** decimals)
29+
token_qty = sum(Decimal(tx.amount) for tx in transfer.parameter.__root__[0].txs) / (10 ** decimals)
3030
new_shares_qty = int(storage.storage.ledger[trader].balance) + int(storage.storage.ledger[trader].frozen_balance) # type: ignore
3131

3232
price = (Decimal(storage.storage.tez_pool) / (10 ** 6)) / (Decimal(storage.storage.token_pool) / (10 ** decimals))

src/demo_quipuswap/handlers/on_fa2_tez_to_token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ async def on_fa2_tez_to_token(
2121
trader = tez_to_token_payment.data.sender_address
2222

2323
min_token_quantity = Decimal(tez_to_token_payment.parameter.min_out) / (10 ** decimals)
24-
token_quantity = Decimal(transfer.parameter.__root__[0].txs[0].amount) / (10 ** decimals)
24+
token_quantity = sum(Decimal(tx.amount) for tx in transfer.parameter.__root__[0].txs) / (10 ** decimals)
2525
tez_quantity = Decimal(tez_to_token_payment.data.amount) / (10 ** 6)
2626
assert min_token_quantity <= token_quantity, tez_to_token_payment.data.hash
2727

0 commit comments

Comments
 (0)