Dyson Finance Contract Docs
  • Overview
  • Guides
    • Set Up Your Local Environment
    • Interact with Dyson Finance contracts on Sepolia testnet
    • Integration of Swap
      • Trial Calculation of Swap
      • Perform a Swap
      • Deep Understanding of Swap
    • Integration of Dual Investment
      • Trial Calculation before deposit
      • Perfrom a Dual Investment Deposit
      • Perform a Dual Investment Withdrawal
    • Stake your $DYSN for $sDYSN
    • Boost the Pool by depositing your $sDYSN
    • Sponsorship Reward
  • Technical Reference
    • Overview
    • Core
      • AddressBook
      • DYSON
      • Pair
      • Router
      • PairFactory
      • Membership
        • Agency
        • AgentNFT
      • Fee & Reward distribution
        • FeeDistributor
        • Bribe
      • Staking & Yield Boosting
        • sDYSON
        • Farm
        • Gauge
      • Events
    • Libraries
      • TransferHelper
      • SqrtMath
      • ABDKMath64x64
    • Unit Definition
  • Contract Addresses & Info
    • Blast
    • Polygon zkEVM
    • Linea
    • X Layer
    • Testnet (Sepolia)
    • Testnet (Blast Sepolia)
Powered by GitBook
On this page
  • Swap Logic Breakdown
  • Conclusion
  1. Guides
  2. Integration of Swap

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 .

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

    • 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.

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.

PreviousPerform a SwapNextIntegration of Dual Investment

Last updated 1 year ago

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 section in our white paper.

Trading Fee Calculation