# Deep Understanding of Swap

## Swap Logic Breakdown

The token swap logic in the Dyson Pair Contract is divided into two main functions: `_swap0in` and `_swap1in`, corresponding to swapping token0 for token1 and token1 for token0, respectively. Let's focus on the `_swap1in` function to understand the core calculation logic.

#### `_swap1in` Function

`MAX_FEE_RATIO` is set to `2^64` .

```solidity
function _swap1in(uint input, uint minOutput) internal returns (uint fee, uint output) {
    // ... (omitting details for brevity)

    // Fee calculation based on fee ratio for token1
    fee = uint(_feeRatio1) * input / MAX_FEE_RATIO;

    // Adjust input by deducting the fee
    uint inputLessFee = input - fee;

    // Calculate the output using the invariant formula
    output = inputLessFee * reserve0 / (reserve1 + inputLessFee);

    // Ensure the minimum output requirement is met
    require(output >= minOutput, "slippage");

    // Update fee ratio for token0 based on the output proportion of the reserve0w
    uint64 feeRatioAdded = uint64(output * MAX_FEE_RATIO / reserve0);
    _updateFeeRatio1(_feeRatio1, feeRatioAdded);
}
```

1. **Calculate Output:**
   * Obtain the fee ratios, `feeRatio0` and `feeRatio1`, by using the `getFeeRatio()` function. This step updatesd the fee ratios based on the half-life mechanism. When a trade happens, the fee will increase immediately, and decrease as time goes on. The change will keep going until the trading fee reduces to zero.
   * Fee1 calculation based on fee ratio for token1: \
     `fee1 = uint(_feeRatio1) * input / MAX_FEE_RATIO`&#x20;
   * Adjust input by deducting the fee: \
     `inputLessFee = input - fee1`
   * Use the constant product formula `xy = k` to calculate the output: \
     `output = inputLessFee * reserve0 / (reserve1 + inputLessFee)`
2. **Increase `fee0`:**
   * After the swap, to account for changes in the pool ratios and mitigate arbitrage opportunities for liquidity providers, an additional fee (`fee0`) is introduced for the `swap0in` operation.
   * Calculate the added fee0 using: \
     `feeRatioAdded = uint64(MAX_FEE_RATIO * output / reserve0)` \
     This calculation is based on the proportion of the total `token0` in the pool represented by the tokens swapped out during the `_swap0in` operation.
   * Update the fee ratio for `token0` using: \
     `_updateFeeRatio0(_feeRatio0, feeRatioAdded);` \
     This step involves utilizing the formula `newFee = 1 - (1 - x%)(1 - y%)` to calculate the new fee ratio, and the result is stored for future use. About this formula please refer to [Trading Fee Calculation](https://docs.dyson.finance/mechanisms/dynamic-amm#trading-fee-calculation) section in our white paper.

### Conclusion

The Dyson Pair Contract's swap mechanism introduces a dynamic fee model and premium calculation to incentivize users based on their chosen lock times. The core swap logic, exemplified by the `_swap1in` function, showcases the intricacies of fee calculation, input adjustment, and output determination. This approach provides users with a transparent and adaptive swapping experience, aligning incentives with market conditions and user preferences.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dyson-finance.gitbook.io/developer_docs/guides/integration-of-swap/deep-understanding-of-swap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
