PartyB Position Actions Facet (0.8.4)

PartyB Position Actions Facet (0.8.4)

The PartyB Position Actions Facet enables Party B users to manage the positions they have open with partyA. After locking a quote (using the PartyB Quote Actions Facet or the grouped actions facet), Party B can open a position by specifying the filled amount and open price. In addition, they can fill close requests, accept cancellation of close requests, or trigger an emergency close if required. These actions help ensure that positions are managed according to the protocol rules and that the necessary solvency checks are performed before any state changes occur.


openPosition()

Opens a position for a specified quote. Party B can choose to fill the entire requested amount or only a portion of it. This function verifies that the quote meets the necessary conditions (e.g., minimum position size and sufficient solvency after the position is opened) and then updates nonce counters for both Party A and Party B. If a residual (new) quote is generated due to partial fill, additional events are emitted based on its status.

Function Signature:

function openPosition(
    uint256 quoteId,
    uint256 filledAmount,
    uint256 openedPrice,
    PairUpnlAndPriceSig memory upnlSig
) external whenNotPartyBActionsPaused onlyPartyBOfQuote(quoteId) notLiquidated(quoteId);

Parameters:

  • quoteId: The ID of the quote for which the position is being opened.

  • filledAmount: The amount with which Party B is opening the position. This may be a fraction or the full requested amount.

  • openedPrice: The price at which the position is opened.

  • upnlSig: A PairUpnlAndPriceSig structure containing the Muon signature data for UPnL and price verification.

struct PairUpnlAndPriceSig {
	bytes reqId;
	uint256 timestamp;
	int256 upnlPartyA;
	int256 upnlPartyB;
	uint256 price;
	bytes gatewaySignature;
	SchnorrSign sigs;
}

Example Usage:

// Party B opens a position on quote ID 101 for 100 units at an open price of 1050.
PairUpnlAndPriceSig memory sig = /* obtain signature data */;
diamond.openPosition(101, 100e18, 1050e18, sig);

Events Emitted:

  • OpenPosition:

    event OpenPosition(uint256 quoteId, address partyA, address partyB, uint256 filledAmount, uint256 openedPrice);

    Emitted immediately after the position is opened.

  • SendQuote (optional): If the openPosition call returns a new quote (i.e. a residual quote), and its status is PENDING, a SendQuote event is emitted with full quote details.

  • AcceptCancelRequest (optional): If the new quote is canceled, an AcceptCancelRequest event is emitted (for backward compatibility).


fillCloseRequest()

Fills a close request for an open position. Party B can partially fill a close request (especially for LIMIT orders, which may be filled in multiple steps) by specifying the amount to fill and the closed price. This function verifies the provided UPnL and price signature, checks that closing the position maintains solvency, and then updates nonce counters for both parties.

Function Signature:

function fillCloseRequest(
    uint256 quoteId,
    uint256 filledAmount,
    uint256 closedPrice,
    PairUpnlAndPriceSig memory upnlSig
) external whenNotPartyBActionsPaused onlyPartyBOfQuote(quoteId) notLiquidated(quoteId);

Parameters:

  • quoteId: The ID of the quote whose close request is being filled.

  • filledAmount: The amount by which the close request is being filled.

  • closedPrice: The price at which the position is being closed.

  • upnlSig: A PairUpnlAndPriceSig structure with UPnL and price signature data for verification.

struct PairUpnlAndPriceSig {
	bytes reqId;
	uint256 timestamp;
	int256 upnlPartyA;
	int256 upnlPartyB;
	uint256 price;
	bytes gatewaySignature;
	SchnorrSign sigs;
}

Example Usage:

// Party B fills a close request on quote ID 101 for 50 units at a closed price of 1020.
PairUpnlAndPriceSig memory sig = /* obtain signature data */;
diamond.fillCloseRequest(101, 50e18, 1020e18, sig);

Events Emitted:

event FillCloseRequest(uint256 quoteId, address partyA, address partyB, uint256 filledAmount, uint256 closedPrice, QuoteStatus quoteStatus, uint256 closeId);

Also, a backward compatibility version is emitted without the closeId.


acceptCancelCloseRequest()

Accepts a cancel close request for a specified quote. This function updates the quote’s status from CANCEL_CLOSE_PENDING to OPENED, effectively canceling the close request and reopening the position.

Function Signature:

function acceptCancelCloseRequest(uint256 quoteId) external whenNotPartyBActionsPaused onlyPartyBOfQuote(quoteId) notLiquidated(quoteId);

Parameters:

  • quoteId: The ID of the quote for which the close request cancellation is accepted.

Example Usage:

// Party B accepts the cancel close request for quote ID 101.
diamond.acceptCancelCloseRequest(101);

Events Emitted:

  • AcceptCancelCloseRequest:

    event AcceptCancelCloseRequest(uint256 quoteId, QuoteStatus quoteStatus, uint256 closeId);

    Also emits a backward compatibility event without the closeId.


emergencyClosePosition()

Allows Party B to emergency close a position for a specified quote. This function is typically used during emergency scenarios (e.g., when the system is in emergency mode, Party B is in emergency status, or if the symbol is delisted). It verifies that emergency conditions are met, checks the solvency of both parties based on the provided UPnL signature, and then closes the quote at the specified price.

Function Signature:

function emergencyClosePosition(
    uint256 quoteId,
    PairUpnlAndPriceSig memory upnlSig
) external whenNotPartyBActionsPaused onlyPartyBOfQuote(quoteId) notLiquidated(quoteId);

Parameters:

  • quoteId: The ID of the quote for which the emergency close is executed.

  • upnlSig: A PairUpnlAndPriceSig structure containing the Muon signature for UPnL and the closing price.

struct PairUpnlAndPriceSig {
	bytes reqId;
	uint256 timestamp;
	int256 upnlPartyA;
	int256 upnlPartyB;
	uint256 price;
	bytes gatewaySignature;
	SchnorrSign sigs;
}

Example Usage:

// Party B triggers an emergency close on quote ID 101 using a valid signature.
PairUpnlAndPriceSig memory sig = /* obtain signature data */;
diamond.emergencyClosePosition(101, sig);

Events Emitted:

  • EmergencyClosePosition:

    event EmergencyClosePosition(uint256 quoteId, address partyA, address partyB, uint256 filledAmount, uint256 closedPrice, QuoteStatus quoteStatus, uint256 closeId);

    Also, a backward compatibility event is emitted without the closeId.

Last updated