// SPDX-License-Identifier: UNLICENSED pragma solidity =0.7.6; import '../libraries/TickMath.sol'; import '../interfaces/callback/IAtlantiswapSwapCallback.sol'; import '../interfaces/IAtlantiswapPool.sol'; contract TestAtlantiswapReentrantCallee is IAtlantiswapSwapCallback { string private constant expectedReason = 'LOK'; function swapToReenter(address pool) external { IAtlantiswapPool(pool).swap(address(0), false, 1, TickMath.MAX_SQRT_RATIO - 1, new bytes(0)); } function atlantiswapSwapCallback( int256, int256, bytes calldata ) external override { // try to reenter swap try IAtlantiswapPool(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 IAtlantiswapPool(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 IAtlantiswapPool(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 IAtlantiswapPool(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 IAtlantiswapPool(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 IAtlantiswapPool(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'); } }