Skip to main content
async def liquidate(marketId: int, price_offset: int):
    liquidations = await retrieveLiquidations(marketId, price_offset)

    if not liquidations:
        print("No liquidations found for this market at the given price offset.")
        return

    ids = []
    for liquidation_data in liquidations:
        for position_id in liquidation_data.position_ids_to_liquidate:
            ids.append(position_id)

    if not ids:
        print("No position IDs to liquidate.")
        return

    print(f"Found {len(ids)} position(s) to liquidate: {ids}")

    MyStruct = namedtuple(
        "LiquidationPerMarketInput",
        ["marketId", "openOrderIds"],
    )
    my_struct_data = MyStruct(marketId=marketId, openOrderIds=ids)
    contract = retrieveContract()
    w3 = retrieveWeb3Instance()
    transaction = contract.functions.liquidatePositions(
        [my_struct_data]
    ).build_transaction(
        {
            "from": Web3.to_checksum_address(os.getenv("ACCOUNT")),
            "nonce": w3.eth.get_transaction_count(
                Web3.to_checksum_address(os.getenv("ACCOUNT"))
            ),
            "gas": GAS_VALUE,
            "gasPrice": math.ceil(w3.eth.gas_price + (w3.eth.gas_price * 0.25)),
        }
    )
    await submitTransactionWithOracle(w3, transaction, marketId)