// SPDX-License-Identifier: UNLICENSED pragma solidity =0.7.6; import "../libraries/TickMath.sol"; import "../interfaces/callback/IElixirSwapCallback.sol"; import "../interfaces/IElixirPool.sol"; contract TestElixirReentrantCallee is IElixirSwapCallback { string private constant expectedReason = "LOK"; function swapToReenter(address pool) external { IElixirPool(pool).swap( address(0), false, 1, TickMath.MAX_SQRT_RATIO - 1, new bytes(0) ); } function elixirSwapCallback( int256, int256, bytes calldata ) external override { // try to reenter swap try IElixirPool(msg.sender).swap(address(0), false, 1, 0, new bytes(0)) {} catch Error(string memory reason) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } // try to reenter mint try IElixirPool(msg.sender).mint(address(0), 0, 0, 0, new bytes(0)) {} catch Error(string memory reason) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } // try to reenter collect try IElixirPool(msg.sender).collect(address(0), 0, 0, 0, 0) {} catch Error(string memory reason) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } // try to reenter burn try IElixirPool(msg.sender).burn(0, 0, 0) {} catch Error( string memory reason ) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } // try to reenter flash try IElixirPool(msg.sender).flash(address(0), 0, 0, new bytes(0)) {} catch Error(string memory reason) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } // try to reenter collectProtocol try IElixirPool(msg.sender).collectProtocol(address(0), 0, 0) {} catch Error(string memory reason) { require( keccak256(abi.encode(reason)) == keccak256(abi.encode(expectedReason)) ); } require(false, "Unable to reenter"); } }