# Spark on miden
To develop Spark on the Polygon Miden platform, it's essential to consider the unique features and architecture of Miden. Here's a basic plan for the architecture of Spark on Miden:
### What is Spark and its Purpose
Spark is a cross-margin oracle-based perpetual order book exchange. Its key features include a high-performance order book, cross-margin trading, partial liquidations, and an advanced risk engine. On Miden, these features would be adapted to leverage Miden's concurrent transaction execution and enhanced privacy properties.
### Core Accounts (Contracts) to be Developed on Miden
1. **Clearing House Account**: This account would handle user interactions for creating positions and manage the logic for funding.
2. **Account Balance Account**: Responsible for storing information about user positions and PnL.
3. **Insurance Fund Account**: Functions as the exchange's risk mitigation pool.
4. **Perpetual Market Account**: The order book account on which the perpetual exchange operates.
5. **Vault Account**: Holds all funds; trading on Spark begins with deposits into this account.
### Supporting Services for System Operation
- **Liquidator Service**: Liquidates positions eligible for liquidation and removes undercollateralized orders.
- **Matching Engine**: Matches orders in the order book.
- **Risk Engine**: Calculates and updates risk parameters.
### External Services Required for Spark’s Operation
- **Oracles (e.g., Pyth Network)**: Provides reliable and timely market data for asset pricing.
- **Indexing Services (e.g., The Graph)**: Facilitates efficient data retrieval and indexing for the platform.
### About oracles
Spark currently utilizes the Pyth oracle in the following functions:
**Vault**
- `withdraw_all` and `withdraw_collateral`: These are used for funding since they internally call `clearing_house_contract.settle_all_funding`.
**Clearing House**
- `liquidate`: Used for `settle_all_funding`, `settle_bad_debt`, and checking `require_enough_free_collateral` to determine if liquidation is possible.
- `open_order`: Used for `settle_funding` and checking `require_enough_free_collateral` to ensure the user has sufficient free collateral.
- `pause_market`: Used to record the price at which a market is paused.
**Perp Market (Orderbook)**
- `match_orders`: Utilized for `settle_funding` and checking `require_enough_free_collateral` - it verifies if the user has enough free collateral.
- `remove_uncollaterised_orders`: Used in `get_free_collateral` to understand if the orders are genuinely uncollateralized.
**Insurance Fund**
- `distribute_fee`: Uses `get_free_collateral` and `get_insurance_fund_capacity`.
- `repay`: Executes the repayment process for the insurance fund from the contract's balance, using `vault_contract.get_account_value_and_total_collateral_value(insurance_fund_address)`.
Currently, Spark uses the Pyth oracle, which is an on-demand oracle. Spark can also use Chainlink as an oracle, but the price update frequency should not be less than every 2 minutes, otherwise, Spark could be vulnerable to various attacks.
### Architecture Adaptations for Miden
- **Parallel Transaction Execution**: Leverage Miden’s ability for parallel processing to enhance the order book's performance and efficiency.
- **Privacy Enhancements**: Utilize Miden’s privacy features to secure transaction details and user positions.
- **Actor-based State Model**: Implement accounts as actors responsible for their state, communicating via messages (notes), enhancing the system’s modularity and scalability.
- **Stark Proofs for Transaction Validation**: Each account (actor) would independently prove the validity of their state transitions, ensuring integrity and compliance with the network rules.
### Conclusion
Adapting Spark for Miden involves leveraging Miden's unique capabilities, such as parallel processing and enhanced privacy, while maintaining the core functionalities of Spark. The development would require a careful redesign of Spark’s contracts (accounts) and services to fit into Miden's actor-based model and its hybrid state management approach. The integration of external services like oracles and indexing solutions would also be crucial to ensure a robust and efficient perpetual exchange platform on Polygon Miden.
## Spark docs

## ClearingHouseContract Documentation
#### Overview
The `ClearingHouseContract` is a comprehensive contract covering various functionalities like order placement, position management, market operations, funding processes, liquidation, and administrative tasks in a decentralized trading platform.
#### ABI Functions
#### debug_increment_timestamp()
Description: Increments the internal timestamp for debugging purposes.
Implementation: Adjusts the internal debug timestamp based on a predefined step.
Callable By: Contract owner or admin with debug access.
#### open_order(base_token: AssetId, base_size: I64, order_price: u64, price_update_data: Vec<Bytes>) [Payable]
Description: Opens an order with specified base token, size, and price.
Arguments: base_token, base_size, order_price, price_update_data.
Implementation: Checks market status, registers base token, and updates price.
Calls Other Functions: check_market_open, register_base_token, update_price.
Payable: Accepts payments.
Callable By: Any authorized trader or contract.
#### modify_position(trader: Address, base_token: AssetId, exchanged_position_size: I64, exchanged_position_notional: I64)
Description: Modifies a trader's position for a specific base token.
Arguments: trader, base_token, exchanged_position_size, exchanged_position_notional.
Implementation: Validates market status and settles funding before modifying the position.
Calls Other Functions: check_market_open, settle_funding, require_enough_free_collateral.
Callable By: Perpetual market contract.
#### get_taker_position_safe(trader: Address, base_token: AssetId) -> I64
Description: Retrieves a trader's taker position size for a given base token, ensuring it's non-zero.
Arguments: trader, base_token.
Returns: Size of the taker position.
Callable By: General access.
#### get_taker_position(trader: Address, base_token: AssetId) -> I64
Description: Retrieves a trader's taker position size for a given base token.
Arguments: trader, base_token.
Returns: Size of the taker position.
Callable By: General access.
#### get_liquidated_position_size_and_notional(trader: Address, base_token: AssetId, account_value: I64, position_size_to_be_liquidated: I64) -> (I64, I64)
Description: Calculates the size and notional of a liquidated position based on account value and position size to be liquidated.
Arguments: trader, base_token, account_value, position_size_to_be_liquidated.
Returns: Tuple containing size and notional of the liquidated position.
Callable By: General access.
#### get_max_abs_position_size(trader: Address, base_asset: AssetId) -> (u64, u64)
Description: Retrieves the maximum absolute position size for a trader and a base asset.
Arguments: trader, base_asset.
Returns: Tuple containing max absolute short and long sizes.
Callable By: General access.
#### close_market(base_token: AssetId, closed_price: u64)
Description: Closes the market for a specified base token at a given price.
Arguments: base_token, closed_price.
Implementation: Updates market status to closed.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### create_market(asset_id: AssetId, decimal: u32, price_feed: b256, im_ratio: u64, mm_ratio: u64, initial_price: u64)
Description: Creates a market with specified parameters including asset ID, decimals, and ratios.
Arguments: asset_id, decimal, price_feed, im_ratio, mm_ratio, initial_price.
Implementation: Registers a new market and initializes its parameters.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### check_market_open(base_token: AssetId)
Description: Checks if the market for a given base token is open.
Arguments: base_token.
Implementation: Verifies the market status.
Callable By: General access.
#### get_market(base_token: AssetId) -> Market
Description: Retrieves market details for a specified base token.
Arguments: base_token.
Returns: Market structure with market details.
Callable By: General access.
#### get_funding(base_token: AssetId) -> (I64, u64)
Description: Gets funding information for a specific base token.
Arguments: base_token.
Returns: Tuple containing funding growth and timestamp.
Callable By: General access.
#### settle_all_funding(trader: Address)
Description: Settles all pending funding payments for a trader.
Arguments: trader.
Implementation: Processes funding settlements across all trader's base tokens.
Calls Other Functions: settle_funding.
Callable By: Vault contract or trader.
#### get_all_pending_funding_payment(trader: Address) -> I64
Description: Retrieves the total pending funding payment for a trader.
Arguments: trader.
Returns: Total pending funding payment.
Callable By: General access.
#### get_pending_funding_payment(trader: Address, base_token: AssetId) -> (I64, I64)
Description: Gets the pending funding payment for a trader and a specific base token.
Arguments: trader, base_token.
Returns: Tuple containing funding
payment and funding growth.
Callable By: General access.
#### get_funding_rate(base_token: AssetId) -> I64
Description: Calculates the funding rate for a specific base token.
Arguments: base_token.
Returns: Funding rate.
Callable By: General access.
#### liquidate(trader: Address, base_token: AssetId, position_size: I64, price_update_data: Vec<Bytes>) [Payable]
Description: Liquidates a specified size of a trader's position.
Arguments: trader, base_token, position_size, price_update_data.
Implementation: Processes liquidation and updates positions.
Calls Other Functions: update_price, get_liquidated_position_size_and_notional.
Payable: Accepts payments.
Callable By: Any authorized entity.
#### get_margin_requirement_for_liquidation(trader: Address) -> u64
Description: Retrieves the margin requirement for initiating liquidation.
Arguments: trader.
Returns: Margin requirement.
Callable By: General access.
#### is_liquidatable(trader: Address) -> bool
Description: Determines if a trader's positions are eligible for liquidation.
Arguments: trader.
Returns: Boolean indicating liquidation eligibility.
Callable By: General access.
#### pause_market(base_token: AssetId, update_data: Vec<Bytes>) [Payable]
Description: Pauses trading for a base token and updates the price feed.
Arguments: base_token, update_data.
Implementation: Changes market status to paused and updates price.
Calls Other Functions: verify_owner_or_admin, update_price.
Payable: Accepts payments.
Callable By: Contract owner or admin.
#### unpause_market(base_token: AssetId)
Description: Resumes trading for a base token.
Arguments: base_token.
Implementation: Changes market status to open.
Calls Other Functions: verify_owner_or_admin.
Callable By: Contract owner or admin.
#### add_admin(address: Address)
Description: Adds an admin to the contract.
Arguments: address.
Implementation: Registers a new admin.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### remove_admin(address: Address)
Description: Removes an admin from the contract.
Arguments: address.
Implementation: Deregisters an admin.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### update_protocol_fee_rate(protocol_fee_rate: u64)
Description: Updates the protocol fee rate.
Arguments: protocol_fee_rate.
Implementation: Adjusts the protocol fee rate.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### update_insurance_fund_fee_share(insurance_fund_fee_share: u64)
Description: Updates the insurance fund fee share ratio.
Arguments: insurance_fund_fee_share.
Implementation: Adjusts the fee share ratio for the insurance fund.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### update_liquidation_penalty_ratio(liquidation_penalty_ratio: u64)
Description: Updates the liquidation penalty ratio.
Arguments: liquidation_penalty_ratio.
Implementation: Adjusts the ratio for liquidation penalties.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### update_max_funding_rate(max_funding_rate: u64)
Description: Updates the maximum funding rate.
Arguments: max_funding_rate.
Implementation: Adjusts the maximum rate for funding.
Calls Other Functions: only_owner (internal validation).
Callable By: Contract owner.
#### get_account_value(trader: Address) -> I64
Description: Retrieves the account value for a given trader.
Arguments: trader.
Returns: Account value.
Callable By: General access.
#### get_taker_open_notional(trader: Address, base_token: AssetId) -> I64
Description: Retrieves the open notional value of a taker's position.
Arguments: trader, base_token.
Returns: Open notional value.
Callable By: General access.
#### require_enough_free_collateral(trader: Address)
Description: Ensures that a trader has enough free collateral as per the initial margin ratio.
Arguments: trader.
Implementation: Checks for sufficient free collateral.
Calls Other Functions: get_free_collateral (from VaultContract).
Callable By: General access.
## AccountBalanceContract Documentation
### Overview
The `AccountBalanceContract` is designed to manage and query account balances, positions, and profit and loss (PNL) data in a financial trading system. It includes features like PNL calculation, balance settlement, position management, and token registration.
### ABI Functions
#### modify_owed_realized_pnl(trader: Address, amount: I64)
Description: Modifies the owed and realized PNL for a trader.
Implementation: Updates the trader's PNL in the system.
Callable By: Clearing House or Perpetual Market contracts.
#### settle_owed_realized_pnl(trader: Address) -> I64
Description: Settles the owed and realized PNL for a trader, returning the settled amount.
Implementation: Resets the trader's PNL to zero and returns the previous amount.
Callable By: Vault contract.
#### get_pnl(trader: Address) -> (I64, I64)
Description: Retrieves the PNL information for a trader, including owed and unrealized PNL.
Implementation: Sums up the PNL values across all trader's positions.
Callable By: Any contract or trader querying PNL data.
#### settle_balance_and_deregister(trader: Address, base_token: AssetId, taker_base: I64, taker_quote: I64, realized_pnl: I64)
Description: Settles the balance for a trader and deregisters them from a specified market.
Implementation: Adjusts the account balance and removes the trader from the base token registry.
Callable By: Clearing House contract.
#### get_account_balance(trader: Address, base_token: AssetId) -> AccountBalance
Description: Retrieves the account balance for a trader in a specific market.
Implementation: Returns balance details including position size and open notional values.
Callable By: Any contract or trader querying account balance.
#### register_base_token(trader: Address, base_token: AssetId)
Description: Registers a base token for a trader.
Implementation: Adds the base token to the trader's list of active tokens.
Callable By: Clearing House contract.
#### get_base_tokens(trader: Address) -> Vec<AssetId>
Description: Retrieves a list of base tokens registered by a trader.
Implementation: Returns all active base tokens associated with the trader.
Callable By: Any contract or trader querying registered base tokens.
#### settle_position_in_closed_market(trader: Address, base_token: AssetId) -> (I64, I64, I64, u64)
Description: Settles a trader's position in a closed market for a specific base token.
Implementation: Calculates and settles the position notional, open notional, and realized PNL.
Callable By: Clearing House contract.
#### get_liquidatable_position_size(trader: Address, base_token: AssetId, account_value: I64) -> I64
Description: Calculates the size of a liquidatable position for a trader based on their account value.
Implementation: Determines the position size eligible for liquidation.
Callable By: Any contract or trader assessing liquidation risks.
#### get_taker_position_size(trader: Address, base_token: AssetId) -> I64
Description: Retrieves the taker position size for a trader in a specific base token.
Implementation: Returns the current position size of the trader in the specified market.
Callable By: Any contract or trader querying position size.
#### get_total_position_value(trader: Address, base_token: AssetId) -> I64
Description: Retrieves the total position value for a trader in a specific base token.
Implementation: Calculates the total value of the trader's position in the market.
Callable By: Any contract or trader querying position value.
#### get_total_abs_position_value(trader: Address) -> u64
Description: Retrieves the total absolute position value for a trader.
Implementation: Sums up the absolute values of all positions across different markets.
Callable By: Any contract or trader querying overall position value.
#### settle_bad_debt(trader: Address)
Description: Settles bad debt for a trader, ensuring the trader is not the insurance fund.
Implementation: Adjusts PNL and balances to settle any outstanding bad debt.
Callable By: Any contract or trader addressing bad debt issues.
#### update_tw_premium_growth_global(trader: Address, base_token: AssetId, last_tw_premium_growth_global: I64)
Description: Updates the global TWAP premium growth for a trader's position.
Implementation: Records the latest TWAP premium growth for the trader's position.
Callable By: Clearing House contract.
#### get_taker_open_notional(trader: Address, base_token: AssetId) -> I64
Description: Retrieves the taker's open notional value for a specified base token.
Implementation: Returns the current open notional value of the trader's position.
Callable By: Any contract or trader querying open notional.
#### get_margin_requirement_for_liquidation(trader: Address) -> u64
Description: Retrieves the margin requirement
for liquidation for a specified trader.
Implementation: Calculates the margin needed to avoid liquidation.
Callable By: Any contract or trader assessing liquidation margins.
#### get_margin_requirement(trader: Address) -> u64
Description: Retrieves the margin requirement for a specified trader.
Implementation: Calculates the total margin requirement based on trader's positions.
Callable By: Any contract or trader querying margin requirements.
#### emit_account_balance_change_event(events: (Option<(Address, AssetId)>, Option<(Address, AssetId)>, Option<(Address, AssetId)>, Option<(Address, AssetId)>, Option<(Address, AssetId)>))
Description: Emits an event indicating a change in account balance.
Implementation: Logs account balance changes for auditing and tracking.
Callable By: Clearing House, Perpetual Market, or Vault contracts.
#### emit_owed_realized_pnl_change_event(events: (Option<Address>, Option<Address>))
Description: Emits an event indicating a change in owed realized PNL.
Implementation: Logs PNL changes for transparency and record-keeping.
Callable By: Clearing House, Perpetual Market, or Vault contracts.
## PerpMarketContract Documentation
### Overview
The `PerpMarketContract` is a vital component of a decentralized trading platform, handling various aspects of market operations including order management, price retrieval, and administrative functions.
### ABI Functions
#### debug_increment_timestamp()
Description: Increments the internal timestamp for debugging purposes.
Implementation: Adjusts the internal debug timestamp based on a predefined step.
Callable By: Contract owner or admin with debug access.
#### open_order(trader: Address, base_token: AssetId, base_size: I64, order_price: u64)
Description: Opens a new order for a trader with specified parameters.
Implementation: Registers a new order in the system with given details.
Callable By: Clearing House contract.
Payable: No.
#### remove_uncollaterised_orders(trader: Address)
Description: Removes uncollateralized orders for a specified trader.
Implementation: Identifies and deletes orders lacking sufficient collateral.
Callable By: Any contract or trader addressing collateral issues.
Payable: No.
#### remove_order(order_id: b256)
Description: Removes a specific order by its unique ID.
Implementation: Deletes the order from the system.
Callable By: The owner of the order.
Payable: No.
#### remove_all_orders()
Description: Removes all orders belonging to the sender across all base tokens.
Implementation: Identifies and deletes all orders associated with the sender.
Callable By: The trader who owns the orders.
Payable: No.
#### match_orders(order_sell_id: b256, order_buy_id: b256, price_update_data: Vec<Bytes>)
Description: Matches a sell order and a buy order to execute a trade.
Implementation: Facilitates the trade between two matching orders.
Callable By: Any authorized trader or contract.
Payable: Yes.
#### has_active_orders(trader: Address, base_token: AssetId) -> bool
Description: Checks if a trader has active orders for a specific base token.
Implementation: Returns a boolean indicating the presence of active orders.
Callable By: Any contract or trader querying active orders.
Payable: No.
#### get_market_price(token: AssetId) -> u64
Description: Retrieves the current market price of a token.
Implementation: Returns the latest market price for the specified token.
Callable By: Any contract or trader querying market prices.
Payable: No.
#### get_twaps(base_token: AssetId) -> (Option<Twap>, Option<Twap>)
Description: Retrieves the TWAPs (Time-Weighted Average Prices) for a specific base token.
Implementation: Returns current and historical TWAPs for the token.
Callable By: Any contract or trader querying TWAP data.
Payable: No.
#### get_mark_price(token: AssetId) -> u64
Description: Retrieves the current mark price of a token.
Implementation: Returns the current mark price for the specified token.
Callable By: Any contract or trader querying mark prices.
Payable: No.
#### get_total_trader_order_base(trader: Address, base_token: AssetId) -> I64
Description: Retrieves the total order value of a trader for a specific base token.
Implementation: Returns the total value of orders for the trader in the base token.
Callable By: Any contract or trader querying order values.
Payable: No.
#### update_mark_span(mark_span: u64)
Description: Updates the mark span setting in the contract.
Implementation: Adjusts the time span for mark price calculations.
Callable By: Contract owner or admin.
Payable: No.
#### update_market_span(market_span: u64)
Description: Updates the market span setting in the contract.
Implementation: Adjusts the time span for market price calculations.
Callable By: Contract owner or admin.
Payable: No.
#### update_fee_rate(fee_rate: u64)
Description: Updates the fee rate setting in the contract.
Implementation: Adjusts the fee rate for market operations.
Callable By: Contract owner or admin.
Payable: No.
#### get_trader_orders(trader: Address, base_token: AssetId) -> Vec<Order>
Description: Retrieves all orders placed by a trader for a specific base token.
Implementation: Returns a list of orders for the trader in the specified token.
Callable By: Any contract or trader querying order details.
Payable: No.
#### setup_twap(base_token: AssetId, current_twap: u64)
Description: Sets up the TWAP for a specific base token.
Implementation: Initializes or updates the TWAP for the given token.
Callable By: Clearing House contract.
Payable: No.
## InsuranceFundContract Documentation
### Overview
The `InsuranceFundContract` is designed to manage the financial aspects of an insurance fund within a decentralized trading platform. It includes functionalities for setting thresholds, managing surplus distribution, and executing repayment processes.
### ABI Functions
#### set_distribution_threshold(distribution_threshold: u64)
Description: Sets the distribution threshold value for the contract.
Implementation: Updates the threshold at which surplus distribution occurs.
Callable By: Contract owner or designated admin.
Payable: No.
#### set_surplus_beneficiary(surplus_beneficiary: Address)
Description: Sets the address to receive surplus funds.
Implementation: Designates a new address as the surplus beneficiary.
Callable By: Contract owner or designated admin.
Payable: No.
#### get_insurance_fund_capacity() -> I64
Description: Retrieves the current capacity of the insurance fund.
Implementation: Returns the total capacity of the fund as a signed 64-bit integer.
Callable By: Any contract or trader querying fund capacity.
Payable: No.
#### repay()
Description: Initiates the insurance fund repayment process.
Implementation: Executes the repayment from the contract's balance.
Callable By: Any authorized entity to initiate repayment.
Payable: No.
#### distribute_fee(price_update_data: Vec<Bytes>) -> u64
Description: Distributes collected fees according to the contract's logic.
Implementation: Distributes surplus fees if the fund exceeds the distribution threshold.
Callable By: Any authorized entity to trigger fee distribution.
Payable: No.
## VaultContract Documentation
### Overview
The `VaultContract` serves as a crucial component in a decentralized trading platform, handling collateral deposits and withdrawals, trading management, and administrative functions.
### ABI Functions
#### deposit_collateral()
Description: Allows a user to deposit settlement token as collateral.
Implementation: Adds collateral to the user's balance and logs the event.
Callable By: Any user desiring to deposit collateral.
Payable: Yes, requires payment in the settlement token.
#### withdraw_collateral(amount: u64, price_update_data: Vec<Bytes>)
Description: Enables a user to withdraw a specified amount of collateral.
Implementation: Settles and decreases the user's balance, transferring the specified collateral amount.
Arguments: `amount` (collateral amount to withdraw), `price_update_data` (price data for updates).
Callable By: User wishing to withdraw their collateral.
Payable: Yes, involves the transfer of collateral.
#### withdraw_all(price_update_data: Vec<Bytes>) -> u64
Description: Withdraws the entire collateral balance for the calling user.
Implementation: Computes and transfers the total available collateral for withdrawal.
Arguments: `price_update_data` (price data for updates).
Returns: The total amount of collateral withdrawn.
Callable By: Any user seeking to withdraw their full collateral balance.
Payable: Yes.
#### get_collateral_balance(address: Address) -> u64
Description: Retrieves the collateral balance of a given address.
Implementation: Returns the collateral balance associated with the specified address.
Arguments: `address` (address to query).
Returns: Collateral balance of the specified address.
Callable By: Any entity querying collateral balance.
Payable: No.
#### get_free_collateral(trader: Address) -> I64
Description: Fetches the free collateral available to a specific trader.
Implementation: Calculates and returns the trader's free collateral.
Arguments: `trader` (trader's address).
Returns: Amount of free collateral available.
Callable By: Anyone inquiring about a trader's free collateral.
Payable: No.
#### get_account_value_and_total_collateral_value(trader: Address) -> (I64, I64)
Description: Obtains the account value and total collateral value for a trader.
Implementation: Computes and returns both the account value and total collateral value.
Arguments: `trader` (trader's address).
Returns: A tuple of account value and total collateral value.
Callable By: Any party interested in a trader's financial status.
Payable: No.
#### pause_trading()
Description: Pauses trading activities on the platform.
Implementation: Activates the trading pause mechanism.
Callable By: Contract owner or admin.
Payable: No.
#### resume_trading()
Description: Resumes trading activities on the platform.
Implementation: Deactivates the trading pause mechanism.
Callable By: Contract owner or admin.
Payable: No.
#### add_admin(address: Address)
Description: Adds an admin to the platform.
Implementation: Grants administrative privileges to the specified address.
Arguments: `address` (new admin's address).
Callable By: Contract owner.
Payable: No.
#### remove_admin(address: Address)
Description: Removes an admin from the platform.
Implementation: Revokes administrative privileges from the specified address.
Arguments: `address` (admin's address to remove).
Callable By: Contract owner.
Payable: No.