diff --git a/src/Factory.sol b/src/Factory.sol index 629cff4..6fb7de1 100644 --- a/src/Factory.sol +++ b/src/Factory.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity =0.7.6; -import "v3-core/contracts/UniswapV3Factory.sol"; import "./VaultDeployer.sol"; pragma abicoder v2; diff --git a/src/UniswapSwapper.sol b/src/UniswapSwapper.sol index 934c407..edf3965 100644 --- a/src/UniswapSwapper.sol +++ b/src/UniswapSwapper.sol @@ -4,6 +4,8 @@ pragma abicoder v2; import "./Constants.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "v3-periphery/libraries/TransferHelper.sol"; +import "forge-std/console2.sol"; library UniswapSwapper { @@ -30,10 +32,20 @@ library UniswapSwapper { // uint256 amountOutMinimum; // uint160 sqrtPriceLimitX96; // } - return Constants.uniswapV3SwapRouter.exactInputSingle(ISwapRouter.ExactInputSingleParams({ + console2.log('swapExactInput approve...'); + TransferHelper.safeApprove(params.tokenIn, address(Constants.uniswapV3SwapRouter), params.amount); + console2.log(params.tokenIn); + console2.log(params.tokenOut); + console2.log(uint(params.fee)); + console2.log(address(Constants.uniswapV3SwapRouter)); + console2.log(params.amount); + amountOut = Constants.uniswapV3SwapRouter.exactInputSingle(ISwapRouter.ExactInputSingleParams({ tokenIn: params.tokenIn, tokenOut: params.tokenOut, fee: params.fee, recipient: params.recipient, deadline: block.timestamp, amountIn: params.amount, amountOutMinimum: 0, sqrtPriceLimitX96: params.sqrtPriceLimitX96 })); + console2.log('swapped'); + console2.log(amountOut); + IERC20(params.tokenIn).approve(address(Constants.uniswapV3SwapRouter), 0); } function swapExactOutput(SwapParams memory params) internal returns (uint256 amountIn) @@ -54,11 +66,20 @@ library UniswapSwapper { // todo dust? revert('IIA'); } - return Constants.uniswapV3SwapRouter.exactOutputSingle(ISwapRouter.ExactOutputSingleParams({ + uint256 maxAmountIn = balance; + console2.log('swapExactOutput approve...'); + TransferHelper.safeApprove(params.tokenIn, address(Constants.uniswapV3SwapRouter), maxAmountIn); + console2.log(params.tokenIn); + console2.log(address(Constants.uniswapV3SwapRouter)); + console2.log(maxAmountIn); + amountIn = Constants.uniswapV3SwapRouter.exactOutputSingle(ISwapRouter.ExactOutputSingleParams({ tokenIn: params.tokenIn, tokenOut: params.tokenOut, fee: params.fee, recipient: params.recipient, - deadline: block.timestamp, amountOut: params.amount, amountInMaximum: balance, // todo use only the committed allocation? + deadline: block.timestamp, amountOut: params.amount, amountInMaximum: maxAmountIn, sqrtPriceLimitX96: params.sqrtPriceLimitX96 })); + console2.log('swapped'); + console2.log(amountIn); + IERC20(params.tokenIn).approve(address(Constants.uniswapV3SwapRouter), 0); } } diff --git a/src/VaultAddress.sol b/src/VaultAddress.sol index 80ac766..424b38d 100644 --- a/src/VaultAddress.sol +++ b/src/VaultAddress.sol @@ -10,7 +10,7 @@ library VaultAddress { // keccak-256 hash of the Vault's bytecode (not the deployed bytecode but the initialization bytecode) // can paste into: // https://emn178.github.io/online-tools/keccak_256.html - bytes32 internal constant VAULT_INIT_CODE_HASH = 0xbf7fa358e7e01c60966db5f8298feffb8b7e2aa494a6ba4a0f94a17a817f93ff; + bytes32 internal constant VAULT_INIT_CODE_HASH = 0x72f8226a3666abba278cd472062b776a74be697e53a365b69f0e9bfbcfabc1b9; // the contract being constructed must not have any constructor arguments or the determinism will be broken. instead, use a callback to // get construction arguments