42 lines
1.2 KiB
Solidity
42 lines
1.2 KiB
Solidity
|
// SPDX-License-Identifier: UNLICENSED
|
||
|
pragma solidity =0.7.6;
|
||
|
|
||
|
import '../interfaces/IERC20Minimal.sol';
|
||
|
|
||
|
import '../interfaces/callback/IUniswapV3SwapCallback.sol';
|
||
|
import '../interfaces/IUniswapV3Pool.sol';
|
||
|
|
||
|
contract TestUniswapV3SwapPay is IUniswapV3SwapCallback {
|
||
|
function swap(
|
||
|
address pool,
|
||
|
address recipient,
|
||
|
bool zeroForOne,
|
||
|
uint160 sqrtPriceX96,
|
||
|
int256 amountSpecified,
|
||
|
uint256 pay0,
|
||
|
uint256 pay1
|
||
|
) external {
|
||
|
IUniswapV3Pool(pool).swap(
|
||
|
recipient,
|
||
|
zeroForOne,
|
||
|
amountSpecified,
|
||
|
sqrtPriceX96,
|
||
|
abi.encode(msg.sender, pay0, pay1)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
function uniswapV3SwapCallback(
|
||
|
int256,
|
||
|
int256,
|
||
|
bytes calldata data
|
||
|
) external override {
|
||
|
(address sender, uint256 pay0, uint256 pay1) = abi.decode(data, (address, uint256, uint256));
|
||
|
|
||
|
if (pay0 > 0) {
|
||
|
IERC20Minimal(IUniswapV3Pool(msg.sender).token0()).transferFrom(sender, msg.sender, uint256(pay0));
|
||
|
} else if (pay1 > 0) {
|
||
|
IERC20Minimal(IUniswapV3Pool(msg.sender).token1()).transferFrom(sender, msg.sender, uint256(pay1));
|
||
|
}
|
||
|
}
|
||
|
}
|