contract SoloMargin {
    // ============ Public Functions ============

    /**
     * The main entry-point to Solo that allows users and contracts to manage accounts.
     * Take one or more actions on one or more accounts. The msg.sender must be the owner or
     * operator of all accounts except for those being liquidated, vaporized, or traded with.
     * One call to operate() is considered a singular "operation". Account collateralization is
     * ensured only after the completion of the entire operation.
     *
     * @param  accounts  A list of all accounts that will be used in this operation. Cannot contain
     *                   duplicates. In each action, the relevant account will be referred-to by its
     *                   index in the list.
     * @param  actions   An ordered list of all actions that will be taken in this operation. The
     *                   actions will be processed in order.
     */
    function operate(
        Account.Info[] memory accounts,
        Actions.ActionArgs[] memory actions
    )
        public;

    // ============ Getters for Permissions ============

    /**
     * Return true if a particular address is approved as an operator for an owner's accounts.
     * Approved operators can act on the accounts of the owner as if it were the operator's own.
     *
     * @param  owner     The owner of the accounts
     * @param  operator  The possible operator
     * @return           True if operator is approved for owner's accounts
     */
    function getIsLocalOperator(
        address owner,
        address operator
    )
        public
        view
        returns (bool);

    /* ... */
}
/**
 * @title SoloMargin
 * @author dYdX
 *
 * Main contract that inherits from other contracts
 */
function operate(
        Account.Info[] memory accounts,
        Actions.ActionArgs[] memory actions
    )
        public;
/**
 * The main entry-point to Solo that allows users and contracts to manage accounts.
 * Take one or more actions on one or more accounts. The msg.sender must be the owner or
 * operator of all accounts except for those being liquidated, vaporized, or traded with.
 * One call to operate() is considered a singular "operation". Account collateralization is
 * ensured only after the completion of the entire operation.
 *
 * @param  accounts  A list of all accounts that will be used in this operation. Cannot contain
 *                   duplicates. In each action, the relevant account will be referred-to by its
 *                   index in the list.
 * @param  actions   An ordered list of all actions that will be taken in this operation. The
 *                   actions will be processed in order.
 */