Skip to content

Conversation

HanzCEO
Copy link

@HanzCEO HanzCEO commented Aug 31, 2025

Protocol Information

  • Protocol Name: Brownfi
  • Protocol Website: https://mirror.xyz/0x64f4Fbd29b0AE2C8e18E7940CF823df5CB639bBa
  • Indexing Smart Contract Addresses (e.g. factories):
    • Berachain
      • 0x43ab776770cc5c739addf318af712dd40918c42d, BrownFiV2Factory
      • 0xb077ea75bf218bf028aceebe61aea4c4ad85f62c, BrownFiV1Factory
    • Arbitrum
      • 0x9106eeF158990574f13fF631b730D5Bf16d99139, BrownFiV2Factory
      • 0xb077ea75bf218bf028aceebe61aea4c4ad85f62c, BrownFiV1Factory
    • Base
      • 0x43ab776770cc5c739addf318af712dd40918c42d, BrownFiV2Factory
    • HyperEVM
      • 0x3240853b71c89209ea8764cddfa3b81766553e55, BrownFiV2Factory
  • Execution Smart Contract Addresses (e.g. Router)
    • Berachain
      • 0x3f0bbeedea5e5f63a14cbda82718d4f25501fbea, BrownFiV2Router
      • 0x79d95c5e6225f8b13aaee43550232df7f357b208, BrownFiV1Router05

Pairs created can be gathered by indexing this topic from a factory contract:

PairCreated (index_topic_1 address token0, index_topic_2 address token1, address pair, uint256 totalPair)
topic0: 0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9

Summary of Integration

Provide a brief overview of your integration:

  • What does your protocol do?
    • High Capital Efficiency (like UniswapV3) with simple LP management (like UniswapV2) and optimal returns for average LPers
  • What type of liquidity does it provide (DEX, lending, yield farming, etc.)?
    • DEX
  • Any unique features that GlueX should consider?
    • n/a

Implementation Details

Execution Functions Required

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

interface BrownFiV1Pair {
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
}

interface BrownFiV2Pair {
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;  
  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
}

interface IBrownFiV2Router {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bytes calldata data
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bytes calldata data
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    // SWAP FUNCTIONALITIES

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline,
        bytes calldata updateData
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline,
        bytes calldata updateData
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline, bytes calldata updateData)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline, bytes calldata updateData)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bytes calldata updateData)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline, bytes calldata updateData)
        external
        payable
        returns (uint[] memory amounts);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline,
        bytes calldata updateData
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline,
        bytes calldata updateData
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline,
        bytes calldata updateData
    ) external;
}

Functions Implemented

  • get_amount_out()
  • get_amount_in()
  • get_apy()
  • get_tvl()

Dynamic States Required for AMM Calculations

  • token0_balance - Obtained from BrownFiVNPair.token0().balanceOf(address(BrownFiVNPair))
  • token1_balance - Obtained from BrownFiVNPair.token1().balanceOf(address(BrownFiVNPair))
  • price0 - Obtained from BrownFiV2Factory.priceOf(token0, min_price_age) where min_price_age is mostly 60 and/or obtainable from BrownFiV2Factory.minPriceAge()
  • price1 - Obtained from BrownFiV2Factory.priceOf(token1, min_price_age) where min_price_age is mostly 60 and/or obtainable from BrownFiV2Factory.minPriceAge()
  • k - Obtained from BrownFiVNPair.k()
  • lambda - Obtained from BrownFiVNPair.lambda()
  • fee - Obtained from BrownFiVNPair.fee()
  • reserve0 - Obtained from BrownFiVNPair.getReserves()[0]
  • reserve1 - Obtained from BrownFiVNPair.getReserves()[1]
  • total_supply - Obtained from BrownFiVNPair.totalSupply()
  • liquidity - Obtained from BrownFiVNPair.balanceOf(address(BrownFiVNPair))
  • fees_over_period
    • amount0 - token0 accrued as fees in the span of N days
    • amount1 - token1 accrued as fees in the span of N days
    • days - N days span

Static States Required for AMM Calculations

  • token0_address - Obtained from BrownFiVNPair.token0()
  • token1_address - Obtained from BrownFiVNPair.token1()
  • lp_token_address - Obtained from address(BrownFiVNPair)

Dependencies

N/A

Other Requirements

  • API Keys: n/a
  • Special Access Requirements: n/a

Test Results

Click to view test results
(venv) hanz@debian:~/Work/Bounty/liquidity-module-self-integration$ py -m pytest tests/testbrownfiv2_liquidity_module.py  -v --cov
========================================================= test session starts =========================================================
platform linux -- Python 3.13.2, pytest-8.3.5, pluggy-1.6.0 -- /home/hanz/Work/Bounty/liquidity-module-self-integration/venv/bin/python3
cachedir: .pytest_cache
rootdir: /home/hanz/Work/Bounty/liquidity-module-self-integration
plugins: cov-6.1.1
collected 10 items                                                                                                                    

tests/testbrownfiv2_liquidity_module.py::test_get_tvl PASSED                                                                    [ 10%]
tests/testbrownfiv2_liquidity_module.py::test_get_tvl_different_decimal PASSED                                                  [ 20%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_out PASSED                                                             [ 30%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_out_mint PASSED                                                        [ 40%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_out_burn PASSED                                                        [ 50%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_in PASSED                                                              [ 60%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_in_mint PASSED                                                         [ 70%]
tests/testbrownfiv2_liquidity_module.py::test_get_amount_in_burn PASSED                                                         [ 80%]
tests/testbrownfiv2_liquidity_module.py::test_get_apy PASSED                                                                    [ 90%]
tests/testbrownfiv2_liquidity_module.py::test_get_apy_with_dillution PASSED                                                     [100%]

=========================================================== tests coverage ============================================================
___________________________________________ coverage: platform linux, python 3.13.2-final-0 ___________________________________________

Name                                      Stmts   Miss  Cover
-------------------------------------------------------------
modules/brownfiv2_liquidity_module.py       285     33    88%
templates/liquidity_module.py                22      4    82%
tests/testbrownfiv2_liquidity_module.py     143      0   100%
-------------------------------------------------------------
TOTAL                                       450     37    92%
========================================================= 10 passed in 0.15s ==========================================================

@HanzCEO HanzCEO marked this pull request as draft August 31, 2025 06:39
@HanzCEO HanzCEO marked this pull request as ready for review September 2, 2025 09:39
@HanzCEO HanzCEO mentioned this pull request Sep 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant