From 1c1336a560aa078649012892691ea4bfccc41669 Mon Sep 17 00:00:00 2001 From: WEBthe3rd Date: Fri, 13 Feb 2026 12:26:10 -0500 Subject: [PATCH 1/6] feat: add Wasabi Prop AMM adapter and related interfaces --- src/adapters/wasabi-prop-amm/IPropPool.sol | 13 ++ src/adapters/wasabi-prop-amm/IWETH.sol | 7 + .../wasabi-prop-amm/WasabiPropAmmAdapter.sol | 54 +++++++ .../WasabiPropAmmAdapter.t.sol | 141 ++++++++++++++++++ 4 files changed, 215 insertions(+) create mode 100644 src/adapters/wasabi-prop-amm/IPropPool.sol create mode 100644 src/adapters/wasabi-prop-amm/IWETH.sol create mode 100644 src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol create mode 100644 test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol diff --git a/src/adapters/wasabi-prop-amm/IPropPool.sol b/src/adapters/wasabi-prop-amm/IPropPool.sol new file mode 100644 index 0000000..3685e1a --- /dev/null +++ b/src/adapters/wasabi-prop-amm/IPropPool.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +interface IPropPool { + function swapExactInput( + address tokenIn, + uint256 amountIn, + uint256 minAmountOut + ) external returns (uint256 amountOut); + + function getBaseToken() external view returns (address); + function getQuoteToken() external view returns (address); +} diff --git a/src/adapters/wasabi-prop-amm/IWETH.sol b/src/adapters/wasabi-prop-amm/IWETH.sol new file mode 100644 index 0000000..9ce5566 --- /dev/null +++ b/src/adapters/wasabi-prop-amm/IWETH.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +interface IWETH { + function deposit() external payable; + function withdraw(uint256 amount) external; +} diff --git a/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol new file mode 100644 index 0000000..cec546c --- /dev/null +++ b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import './IPropPool.sol'; +import './IWETH.sol'; + +import '../../libraries/CalldataDecoder.sol'; +import '../../libraries/TokenHelper.sol'; + +contract WasabiPropAmmAdapter { + using TokenHelper for address; + using CalldataDecoder for bytes; + + address public immutable WETH; + + constructor(address _weth) { + WETH = _weth; + } + + receive() external payable {} + + function executeWasabiPropAmm( + bytes calldata data, + uint256 amountIn, + address tokenIn, + address tokenOut, + address recipient + ) external payable returns (uint256 amountUnused, uint256 amountOut) { + address pool = data.decodeAddress(0); + + // Resolve actual ERC20 token address for input (native ETH -> WETH) + address actualTokenIn = tokenIn.isNative() ? WETH : tokenIn; + + // Wrap native ETH to WETH if needed + if (tokenIn.isNative()) { + IWETH(WETH).deposit{value: amountIn}(); + } + + // Approve pool to pull tokenIn from this adapter + actualTokenIn.forceApprove(pool, amountIn); + + // Execute swap -- pool pulls tokenIn, sends tokenOut back to this contract + amountOut = IPropPool(pool).swapExactInput(actualTokenIn, amountIn, 1); + + // Only explicitly transfer if native ETH is requested as output; + // ERC20 outputs are left in the adapter for the framework to collect + if (tokenOut.isNative()) { + IWETH(WETH).withdraw(amountOut); + TokenHelper.safeTransferNative(recipient, amountOut); + } + + amountUnused = 0; // PropPool exact-input always consumes full amount + } +} diff --git a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol new file mode 100644 index 0000000..eb134b5 --- /dev/null +++ b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; + +import 'src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol'; + +interface ITestPropPoolFactory { + function getPropPool(address token) external view returns (address); + function checkRole(uint64 roleId, address account) external view; +} + +interface ITestPropPool { + function getBaseToken() external view returns (address); + function getQuoteToken() external view returns (address); + function getPriceOracle() external view returns (address); +} + +interface ITestPriceOracle { + struct PriceData { + uint256 price; + uint8 precision; + uint16 volatilityPips; + uint256 lastUpdated; + } + + function getUSDPrice(address token) external view returns (PriceData memory); +} + +contract WasabiPropAmmAdapterTest is Test { + using TokenHelper for address; + WasabiPropAmmAdapter adapter; + + address constant FACTORY = 0x851fC799C9F1443A2c1e6B966605A80f8A1b1BF2; + address constant BASE_WETH = 0x4200000000000000000000000000000000000006; + address constant BASE_USDC = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913; + uint64 constant AUTHORIZED_SWAPPER_ROLE = 100; + + address pool; + address recipient = makeAddr('recipient'); + + string RPC_URL = 'https://mainnet.base.org'; + + function setUp() public { + vm.createSelectFork(RPC_URL); + + adapter = new WasabiPropAmmAdapter(BASE_WETH); + pool = ITestPropPoolFactory(FACTORY).getPropPool(BASE_WETH); + + // Mock factory's checkRole to allow the adapter to swap + vm.mockCall( + FACTORY, + abi.encodeWithSelector( + ITestPropPoolFactory.checkRole.selector, AUTHORIZED_SWAPPER_ROLE, address(adapter) + ), + bytes('') + ); + } + + function _warpToFreshOracle() internal { + address oracle = ITestPropPool(pool).getPriceOracle(); + address baseToken = ITestPropPool(pool).getBaseToken(); + ITestPriceOracle.PriceData memory priceData = ITestPriceOracle(oracle).getUSDPrice(baseToken); + vm.warp(priceData.lastUpdated + 1); + } + + function test_executeWasabiPropAmm(uint256 amountIn, bool tokenToUSDC) public { + vm.assume(pool != address(0)); + _warpToFreshOracle(); + + address tokenIn; + address tokenOut; + if (tokenToUSDC) { + tokenIn = BASE_WETH; + tokenOut = BASE_USDC; + amountIn = bound(amountIn, 1e15, 1e18); + } else { + tokenIn = BASE_USDC; + tokenOut = BASE_WETH; + amountIn = bound(amountIn, 1e6, 3000e6); + } + + deal(tokenIn, address(adapter), amountIn); + + bytes memory data = abi.encode(pool); + (uint256 amountUnused, uint256 amountOut) = + adapter.executeWasabiPropAmm(data, amountIn, tokenIn, tokenOut, recipient); + + assertEq(amountUnused, 0); + assertGt(amountOut, 0); + // ERC20 output stays in adapter + assertEq(amountOut, tokenOut.balanceOf(address(adapter))); + // Input token fully consumed + assertEq(tokenIn.balanceOf(address(adapter)), 0); + } + + function test_executeWasabiPropAmm_nativeETHIn(uint256 amountIn) public { + vm.assume(pool != address(0)); + _warpToFreshOracle(); + + amountIn = bound(amountIn, 1e15, 1e18); + deal(address(adapter), amountIn); + + bytes memory data = abi.encode(pool); + (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm( + data, amountIn, TokenHelper.NATIVE_ADDRESS, BASE_USDC, recipient + ); + + assertEq(amountUnused, 0); + assertGt(amountOut, 0); + // USDC output stays in adapter + assertEq(amountOut, BASE_USDC.balanceOf(address(adapter))); + // No remaining ETH or WETH in adapter + assertEq(address(adapter).balance, 0); + assertEq(BASE_WETH.balanceOf(address(adapter)), 0); + } + + function test_executeWasabiPropAmm_nativeETHOut(uint256 amountIn) public { + vm.assume(pool != address(0)); + _warpToFreshOracle(); + + amountIn = bound(amountIn, 1e6, 3000e6); + deal(BASE_USDC, address(adapter), amountIn); + + uint256 recipientBalanceBefore = recipient.balance; + + bytes memory data = abi.encode(pool); + (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm( + data, amountIn, BASE_USDC, TokenHelper.NATIVE_ADDRESS, recipient + ); + + assertEq(amountUnused, 0); + assertGt(amountOut, 0); + // Native ETH sent to recipient + assertEq(amountOut, recipient.balance - recipientBalanceBefore); + // No remaining tokens in adapter + assertEq(BASE_USDC.balanceOf(address(adapter)), 0); + assertEq(BASE_WETH.balanceOf(address(adapter)), 0); + assertEq(address(adapter).balance, 0); + } +} From 7187a8a652729c137ad3d0c4bb63c5dba57cf808 Mon Sep 17 00:00:00 2001 From: WEBthe3rd Date: Fri, 13 Feb 2026 12:39:26 -0500 Subject: [PATCH 2/6] msg.value validation --- .../wasabi-prop-amm/WasabiPropAmmAdapter.sol | 5 +++ .../WasabiPropAmmAdapter.t.sol | 39 +++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol index cec546c..758d424 100644 --- a/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol +++ b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol @@ -11,6 +11,8 @@ contract WasabiPropAmmAdapter { using TokenHelper for address; using CalldataDecoder for bytes; + error InvalidMsgValue(); + address public immutable WETH; constructor(address _weth) { @@ -33,7 +35,10 @@ contract WasabiPropAmmAdapter { // Wrap native ETH to WETH if needed if (tokenIn.isNative()) { + if (msg.value != amountIn) revert InvalidMsgValue(); IWETH(WETH).deposit{value: amountIn}(); + } else if (msg.value != 0) { + revert InvalidMsgValue(); } // Approve pool to pull tokenIn from this adapter diff --git a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol index eb134b5..56e79c1 100644 --- a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol +++ b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol @@ -99,11 +99,15 @@ contract WasabiPropAmmAdapterTest is Test { _warpToFreshOracle(); amountIn = bound(amountIn, 1e15, 1e18); - deal(address(adapter), amountIn); + deal(address(this), amountIn); bytes memory data = abi.encode(pool); - (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm( - data, amountIn, TokenHelper.NATIVE_ADDRESS, BASE_USDC, recipient + (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm{value: amountIn}( + data, + amountIn, + TokenHelper.NATIVE_ADDRESS, + BASE_USDC, + recipient ); assertEq(amountUnused, 0); @@ -115,6 +119,35 @@ contract WasabiPropAmmAdapterTest is Test { assertEq(BASE_WETH.balanceOf(address(adapter)), 0); } + function test_executeWasabiPropAmm_revertsOnInvalidMsgValue() public { + vm.assume(pool != address(0)); + _warpToFreshOracle(); + + uint256 amountIn = 1e17; + deal(address(this), amountIn); + + bytes memory data = abi.encode(pool); + + vm.expectRevert(WasabiPropAmmAdapter.InvalidMsgValue.selector); + adapter.executeWasabiPropAmm{value: amountIn - 1}( + data, + amountIn, + TokenHelper.NATIVE_ADDRESS, + BASE_USDC, + recipient + ); + + deal(BASE_USDC, address(adapter), 1e6); + vm.expectRevert(WasabiPropAmmAdapter.InvalidMsgValue.selector); + adapter.executeWasabiPropAmm{value: 1}( + data, + 1e6, + BASE_USDC, + BASE_WETH, + recipient + ); + } + function test_executeWasabiPropAmm_nativeETHOut(uint256 amountIn) public { vm.assume(pool != address(0)); _warpToFreshOracle(); From 0b9f3b6cd45bb68eda2a70a2cbd56575aac3f071 Mon Sep 17 00:00:00 2001 From: WEBthe3rd Date: Fri, 13 Feb 2026 12:48:31 -0500 Subject: [PATCH 3/6] Pin fork tests to a specific block number --- test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol index 56e79c1..99fc873 100644 --- a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol +++ b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol @@ -40,9 +40,10 @@ contract WasabiPropAmmAdapterTest is Test { address recipient = makeAddr('recipient'); string RPC_URL = 'https://mainnet.base.org'; + uint256 BLOCK_NUMBER = 42_026_331; function setUp() public { - vm.createSelectFork(RPC_URL); + vm.createSelectFork(RPC_URL, BLOCK_NUMBER); adapter = new WasabiPropAmmAdapter(BASE_WETH); pool = ITestPropPoolFactory(FACTORY).getPropPool(BASE_WETH); From a2ef1a54cb7f6d17422654c0cd361cbc6778901b Mon Sep 17 00:00:00 2001 From: WEBthe3rd Date: Fri, 27 Feb 2026 15:33:50 -0500 Subject: [PATCH 4/6] Remove native ETH handling --- src/adapters/wasabi-prop-amm/IWETH.sol | 7 -- .../wasabi-prop-amm/WasabiPropAmmAdapter.sol | 37 +-------- .../WasabiPropAmmAdapter.t.sol | 80 +------------------ 3 files changed, 5 insertions(+), 119 deletions(-) delete mode 100644 src/adapters/wasabi-prop-amm/IWETH.sol diff --git a/src/adapters/wasabi-prop-amm/IWETH.sol b/src/adapters/wasabi-prop-amm/IWETH.sol deleted file mode 100644 index 9ce5566..0000000 --- a/src/adapters/wasabi-prop-amm/IWETH.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -interface IWETH { - function deposit() external payable; - function withdraw(uint256 amount) external; -} diff --git a/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol index 758d424..bfa00e4 100644 --- a/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol +++ b/src/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import './IPropPool.sol'; -import './IWETH.sol'; import '../../libraries/CalldataDecoder.sol'; import '../../libraries/TokenHelper.sol'; @@ -11,48 +10,20 @@ contract WasabiPropAmmAdapter { using TokenHelper for address; using CalldataDecoder for bytes; - error InvalidMsgValue(); - - address public immutable WETH; - - constructor(address _weth) { - WETH = _weth; - } - - receive() external payable {} - function executeWasabiPropAmm( bytes calldata data, uint256 amountIn, address tokenIn, - address tokenOut, - address recipient + address, + address ) external payable returns (uint256 amountUnused, uint256 amountOut) { address pool = data.decodeAddress(0); - // Resolve actual ERC20 token address for input (native ETH -> WETH) - address actualTokenIn = tokenIn.isNative() ? WETH : tokenIn; - - // Wrap native ETH to WETH if needed - if (tokenIn.isNative()) { - if (msg.value != amountIn) revert InvalidMsgValue(); - IWETH(WETH).deposit{value: amountIn}(); - } else if (msg.value != 0) { - revert InvalidMsgValue(); - } - // Approve pool to pull tokenIn from this adapter - actualTokenIn.forceApprove(pool, amountIn); + tokenIn.forceApprove(pool, amountIn); // Execute swap -- pool pulls tokenIn, sends tokenOut back to this contract - amountOut = IPropPool(pool).swapExactInput(actualTokenIn, amountIn, 1); - - // Only explicitly transfer if native ETH is requested as output; - // ERC20 outputs are left in the adapter for the framework to collect - if (tokenOut.isNative()) { - IWETH(WETH).withdraw(amountOut); - TokenHelper.safeTransferNative(recipient, amountOut); - } + amountOut = IPropPool(pool).swapExactInput(tokenIn, amountIn, 1); amountUnused = 0; // PropPool exact-input always consumes full amount } diff --git a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol index 99fc873..17a1ed9 100644 --- a/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol +++ b/test/adapters/wasabi-prop-amm/WasabiPropAmmAdapter.t.sol @@ -45,7 +45,7 @@ contract WasabiPropAmmAdapterTest is Test { function setUp() public { vm.createSelectFork(RPC_URL, BLOCK_NUMBER); - adapter = new WasabiPropAmmAdapter(BASE_WETH); + adapter = new WasabiPropAmmAdapter(); pool = ITestPropPoolFactory(FACTORY).getPropPool(BASE_WETH); // Mock factory's checkRole to allow the adapter to swap @@ -94,82 +94,4 @@ contract WasabiPropAmmAdapterTest is Test { // Input token fully consumed assertEq(tokenIn.balanceOf(address(adapter)), 0); } - - function test_executeWasabiPropAmm_nativeETHIn(uint256 amountIn) public { - vm.assume(pool != address(0)); - _warpToFreshOracle(); - - amountIn = bound(amountIn, 1e15, 1e18); - deal(address(this), amountIn); - - bytes memory data = abi.encode(pool); - (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm{value: amountIn}( - data, - amountIn, - TokenHelper.NATIVE_ADDRESS, - BASE_USDC, - recipient - ); - - assertEq(amountUnused, 0); - assertGt(amountOut, 0); - // USDC output stays in adapter - assertEq(amountOut, BASE_USDC.balanceOf(address(adapter))); - // No remaining ETH or WETH in adapter - assertEq(address(adapter).balance, 0); - assertEq(BASE_WETH.balanceOf(address(adapter)), 0); - } - - function test_executeWasabiPropAmm_revertsOnInvalidMsgValue() public { - vm.assume(pool != address(0)); - _warpToFreshOracle(); - - uint256 amountIn = 1e17; - deal(address(this), amountIn); - - bytes memory data = abi.encode(pool); - - vm.expectRevert(WasabiPropAmmAdapter.InvalidMsgValue.selector); - adapter.executeWasabiPropAmm{value: amountIn - 1}( - data, - amountIn, - TokenHelper.NATIVE_ADDRESS, - BASE_USDC, - recipient - ); - - deal(BASE_USDC, address(adapter), 1e6); - vm.expectRevert(WasabiPropAmmAdapter.InvalidMsgValue.selector); - adapter.executeWasabiPropAmm{value: 1}( - data, - 1e6, - BASE_USDC, - BASE_WETH, - recipient - ); - } - - function test_executeWasabiPropAmm_nativeETHOut(uint256 amountIn) public { - vm.assume(pool != address(0)); - _warpToFreshOracle(); - - amountIn = bound(amountIn, 1e6, 3000e6); - deal(BASE_USDC, address(adapter), amountIn); - - uint256 recipientBalanceBefore = recipient.balance; - - bytes memory data = abi.encode(pool); - (uint256 amountUnused, uint256 amountOut) = adapter.executeWasabiPropAmm( - data, amountIn, BASE_USDC, TokenHelper.NATIVE_ADDRESS, recipient - ); - - assertEq(amountUnused, 0); - assertGt(amountOut, 0); - // Native ETH sent to recipient - assertEq(amountOut, recipient.balance - recipientBalanceBefore); - // No remaining tokens in adapter - assertEq(BASE_USDC.balanceOf(address(adapter)), 0); - assertEq(BASE_WETH.balanceOf(address(adapter)), 0); - assertEq(address(adapter).balance, 0); - } } From 96ed1a1bc359740414403cdfcc26871f3f967d75 Mon Sep 17 00:00:00 2001 From: hasanatay Date: Wed, 4 Mar 2026 12:37:17 -0500 Subject: [PATCH 5/6] Add comments --- src/adapters/wasabi-prop-amm/IPropPool.sol | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/adapters/wasabi-prop-amm/IPropPool.sol b/src/adapters/wasabi-prop-amm/IPropPool.sol index 3685e1a..5f24ab8 100644 --- a/src/adapters/wasabi-prop-amm/IPropPool.sol +++ b/src/adapters/wasabi-prop-amm/IPropPool.sol @@ -2,12 +2,23 @@ pragma solidity ^0.8.0; interface IPropPool { + + /// @notice Swap exact input amount of tokenIn for tokenOut + /// @param tokenIn The token to swap from + /// @param amountIn The amount of tokenIn to swap + /// @param minAmountOut The minimum amount of tokenOut to receive + /// @return amountOut The amount of tokenOut received function swapExactInput( address tokenIn, uint256 amountIn, uint256 minAmountOut ) external returns (uint256 amountOut); + /// @notice Get the base token of the pool + /// @return The base token function getBaseToken() external view returns (address); + + /// @notice Get the quote token of the pool + /// @return The quote token function getQuoteToken() external view returns (address); } From ffc49efbbb562c31edb776b9e0e26f5d057da78c Mon Sep 17 00:00:00 2001 From: Gavin Date: Thu, 5 Mar 2026 10:12:28 +0700 Subject: [PATCH 6/6] style: lint --- README.md | 5 ++++- src/adapters/wasabi-prop-amm/IPropPool.sol | 9 +++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 63b945a..1feec93 100644 --- a/README.md +++ b/README.md @@ -14,4 +14,7 @@ Below are few assumptions you must follow before implementing your own adapter: - If your integration requires a callback function, implement it in the adapter contract. - Use our libraries [TokenHelper](src/libraries/TokenHelper.sol) to interact with tokens and [CalldataDecoder](src/libraries/CalldataDecoder.sol) to decode calldata whenever possible. - If your integration does not transfer the output tokens directly to the recipient, just leave them inside the adapter contract, don't need to explicitly transfer them. -- The adapter supports native tokens as input and output tokens, through symbolic address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (`TokenHelper.NATIVE_ADDRESS`). \ No newline at end of file +- The adapter supports native tokens as input and output tokens, through symbolic address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` (`TokenHelper.NATIVE_ADDRESS`). +- If your integration do not supports native tokens directly, you can simply ignore it. + +Also don't forget to [ALLOW EDITS FROM MAINTAINERS IN THE PR SETTINGS](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork). \ No newline at end of file diff --git a/src/adapters/wasabi-prop-amm/IPropPool.sol b/src/adapters/wasabi-prop-amm/IPropPool.sol index 5f24ab8..8c92ac2 100644 --- a/src/adapters/wasabi-prop-amm/IPropPool.sol +++ b/src/adapters/wasabi-prop-amm/IPropPool.sol @@ -2,17 +2,14 @@ pragma solidity ^0.8.0; interface IPropPool { - /// @notice Swap exact input amount of tokenIn for tokenOut /// @param tokenIn The token to swap from /// @param amountIn The amount of tokenIn to swap /// @param minAmountOut The minimum amount of tokenOut to receive /// @return amountOut The amount of tokenOut received - function swapExactInput( - address tokenIn, - uint256 amountIn, - uint256 minAmountOut - ) external returns (uint256 amountOut); + function swapExactInput(address tokenIn, uint256 amountIn, uint256 minAmountOut) + external + returns (uint256 amountOut); /// @notice Get the base token of the pool /// @return The base token