diff --git a/contracts/mainnet/connectors/dexSimulation/events.sol b/contracts/mainnet/connectors/dexSimulation/events.sol new file mode 100644 index 00000000..083afebe --- /dev/null +++ b/contracts/mainnet/connectors/dexSimulation/events.sol @@ -0,0 +1,11 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +contract Events { + event LogSimulateSwap( + address sellToken, + address buyToken, + uint256 sellAmount, + uint256 buyAmount + ); +} diff --git a/contracts/mainnet/connectors/dexSimulation/helpers.sol b/contracts/mainnet/connectors/dexSimulation/helpers.sol new file mode 100644 index 00000000..3501e000 --- /dev/null +++ b/contracts/mainnet/connectors/dexSimulation/helpers.sol @@ -0,0 +1,15 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import "./interfaces.sol"; +import { Basic } from "../../common/basic.sol"; +import { TokenInterface } from "../../common/interfaces.sol"; +import { Stores } from "../../common/stores.sol"; + +abstract contract Helpers is Stores, Basic { + /** + * @dev dexSimulation Address + */ + address internal constant dexSimulation = + 0x49B159E897b7701769B1E66061C8dcCd7240c461; +} diff --git a/contracts/mainnet/connectors/dexSimulation/interfaces.sol b/contracts/mainnet/connectors/dexSimulation/interfaces.sol new file mode 100644 index 00000000..bb390ddd --- /dev/null +++ b/contracts/mainnet/connectors/dexSimulation/interfaces.sol @@ -0,0 +1,11 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +interface InstaDexSimulation { + function swap( + address sellToken, + address buyToken, + uint256 sellAmount, + uint256 buyAmount + ) external payable; +} diff --git a/contracts/mainnet/connectors/dexSimulation/main.sol b/contracts/mainnet/connectors/dexSimulation/main.sol new file mode 100644 index 00000000..d16cdaa1 --- /dev/null +++ b/contracts/mainnet/connectors/dexSimulation/main.sol @@ -0,0 +1,69 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Insta dex simulation. + * @dev swap. + */ + +import { Events } from "./events.sol"; +import "./helpers.sol"; + +abstract contract InstaDexSimulationResolver is Events, Helpers { + /** + * @dev Simulation swap using Insta dex swap contract + * @param sellToken The token to sell/swap + * @param buyToken The token to buy + * @param sellAmount The sell token amount + * @param buyAmount The buy token amount + * @param setId Set token amount at this ID in `InstaMemory` Contract. + * @param getId Get token amount at this ID in `InstaMemory` Contract. + */ + function swap( + address sellToken, + address buyToken, + uint256 sellAmount, + uint256 buyAmount, + uint256 setId, + uint256 getId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + sellAmount = getUint(getId, sellAmount); + uint256 nativeAmount; + + if (sellToken == ethAddr) { + sellAmount = sellAmount == uint256(-1) + ? address(this).balance + : sellAmount; + nativeAmount = sellAmount; + } else { + TokenInterface tokenContract = TokenInterface(sellToken); + + sellAmount = sellAmount == uint256(-1) + ? tokenContract.balanceOf(address(this)) + : sellAmount; + + approve(tokenContract, address(dexSimulation), sellAmount); + } + + InstaDexSimulation(dexSimulation).swap{ value: nativeAmount }( + sellToken, + buyToken, + sellAmount, + buyAmount + ); + + setUint(setId, buyAmount); + + _eventName = "LogSimulateSwap(address,address,uint256,uint256)"; + _eventParam = abi.encode(sellToken, buyToken, sellAmount, buyAmount); + } +} + +contract ConnectV2InstaDexSimulation is InstaDexSimulationResolver { + string public name = "Instadapp-DEX-Simulation-v1"; +}