mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	Merge pull request #49 from Instadapp/feat/polygon-1inch
Add polygon 1inch connector
This commit is contained in:
		
						commit
						3c4d3ec858
					
				
							
								
								
									
										12
									
								
								contracts/polygon/connectors/1inch/events.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								contracts/polygon/connectors/1inch/events.sol
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| pragma solidity ^0.7.0; | ||||
| 
 | ||||
| contract Events { | ||||
|     event LogSell( | ||||
|         address indexed buyToken, | ||||
|         address indexed sellToken, | ||||
|         uint256 buyAmt, | ||||
|         uint256 sellAmt, | ||||
|         uint256 getId, | ||||
|         uint256 setId | ||||
|     ); | ||||
| } | ||||
							
								
								
									
										23
									
								
								contracts/polygon/connectors/1inch/helpers.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								contracts/polygon/connectors/1inch/helpers.sol
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | |||
| pragma solidity ^0.7.0; | ||||
| 
 | ||||
| import { TokenInterface } from "../../common/interfaces.sol"; | ||||
| import { DSMath } from "../../common/math.sol"; | ||||
| import { Basic } from "../../common/basic.sol"; | ||||
| 
 | ||||
| 
 | ||||
| abstract contract Helpers is DSMath, Basic { | ||||
|     /** | ||||
|      * @dev 1Inch Address | ||||
|      */ | ||||
|     address internal constant oneInchAddr = 0x11111112542D85B3EF69AE05771c2dCCff4fAa26; | ||||
| 
 | ||||
|     /** | ||||
|      * @dev 1inch swap function sig | ||||
|      */ | ||||
|     bytes4 internal constant oneInchSwapSig = 0x7c025200; | ||||
| 
 | ||||
|      /** | ||||
|      * @dev 1inch swap function sig | ||||
|      */ | ||||
|     bytes4 internal constant oneInchUnoswapSig = 0x2e95b6c8; | ||||
| } | ||||
							
								
								
									
										30
									
								
								contracts/polygon/connectors/1inch/interface.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								contracts/polygon/connectors/1inch/interface.sol
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| pragma solidity ^0.7.0; | ||||
| 
 | ||||
| import { TokenInterface } from "../../common/interfaces.sol"; | ||||
| 
 | ||||
| interface OneInchInterace { | ||||
|     function swap( | ||||
|         TokenInterface fromToken, | ||||
|         TokenInterface toToken, | ||||
|         uint256 fromTokenAmount, | ||||
|         uint256 minReturnAmount, | ||||
|         uint256 guaranteedAmount, | ||||
|         address payable referrer, | ||||
|         address[] calldata callAddresses, | ||||
|         bytes calldata callDataConcat, | ||||
|         uint256[] calldata starts, | ||||
|         uint256[] calldata gasLimitsAndValues | ||||
|     ) | ||||
|     external | ||||
|     payable | ||||
|     returns (uint256 returnAmount); | ||||
| } | ||||
| 
 | ||||
| struct OneInchData { | ||||
|     TokenInterface sellToken; | ||||
|     TokenInterface buyToken; | ||||
|     uint _sellAmt; | ||||
|     uint _buyAmt; | ||||
|     uint unitAmt; | ||||
|     bytes callData; | ||||
| } | ||||
							
								
								
									
										128
									
								
								contracts/polygon/connectors/1inch/main.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								contracts/polygon/connectors/1inch/main.sol
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | |||
| pragma solidity ^0.7.0; | ||||
| pragma experimental ABIEncoderV2; | ||||
| 
 | ||||
| /** | ||||
|  * @title 1Inch. | ||||
|  * @dev On-chain DEX Aggregator. | ||||
|  */ | ||||
| 
 | ||||
| // import files from common directory | ||||
| import { TokenInterface , MemoryInterface } from "../../common/interfaces.sol"; | ||||
| import { Stores } from "../../common/stores.sol"; | ||||
| import { OneInchInterace, OneInchData } from "./interface.sol"; | ||||
| import { Helpers } from "./helpers.sol"; | ||||
| import { Events } from "./events.sol"; | ||||
| 
 | ||||
| abstract contract OneInchResolver is Helpers, Events { | ||||
|     /** | ||||
|      * @dev 1inch swap uses `.call()`. This function restrict it to call only swap/trade functionality | ||||
|      * @param callData - calldata to extract the first 4 bytes for checking function signature | ||||
|      */ | ||||
|     function checkOneInchSig(bytes memory callData) internal pure returns(bool isOk) { | ||||
|         bytes memory _data = callData; | ||||
|         bytes4 sig; | ||||
|         // solium-disable-next-line security/no-inline-assembly | ||||
|         assembly { | ||||
|             sig := mload(add(_data, 32)) | ||||
|         } | ||||
|         isOk = sig == oneInchSwapSig || sig == oneInchUnoswapSig; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @dev 1inch API swap handler | ||||
|      * @param oneInchData - contains data returned from 1inch API. Struct defined in interfaces.sol | ||||
|      * @param ethAmt - Eth to swap for .value() | ||||
|      */ | ||||
|     function oneInchSwap( | ||||
|         OneInchData memory oneInchData, | ||||
|         uint ethAmt | ||||
|     ) internal returns (uint buyAmt) { | ||||
|         TokenInterface buyToken = oneInchData.buyToken; | ||||
|         (uint _buyDec, uint _sellDec) = getTokensDec(buyToken, oneInchData.sellToken); | ||||
|         uint _sellAmt18 = convertTo18(_sellDec, oneInchData._sellAmt); | ||||
|         uint _slippageAmt = convert18ToDec(_buyDec, wmul(oneInchData.unitAmt, _sellAmt18)); | ||||
| 
 | ||||
|         uint initalBal = getTokenBal(buyToken); | ||||
| 
 | ||||
|         // solium-disable-next-line security/no-call-value | ||||
|         (bool success, ) = oneInchAddr.call{value: ethAmt}(oneInchData.callData); | ||||
|         if (!success) revert("1Inch-swap-failed"); | ||||
| 
 | ||||
|         uint finalBal = getTokenBal(buyToken); | ||||
| 
 | ||||
|         buyAmt = sub(finalBal, initalBal); | ||||
| 
 | ||||
|         require(_slippageAmt <= buyAmt, "Too much slippage"); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| abstract contract OneInchResolverHelpers is OneInchResolver { | ||||
| 
 | ||||
|     /** | ||||
|      * @dev Gets the swapping data from 1inch's API. | ||||
|      * @param oneInchData Struct with multiple swap data defined in interfaces.sol  | ||||
|      * @param setId Set token amount at this ID in `InstaMemory` Contract. | ||||
|      */ | ||||
|     function _sell( | ||||
|         OneInchData memory oneInchData, | ||||
|         uint setId | ||||
|     ) internal returns (OneInchData memory) { | ||||
|         TokenInterface _sellAddr = oneInchData.sellToken; | ||||
| 
 | ||||
|         uint ethAmt; | ||||
|         if (address(_sellAddr) == maticAddr) { | ||||
|             ethAmt = oneInchData._sellAmt; | ||||
|         } else { | ||||
|             approve(TokenInterface(_sellAddr), oneInchAddr, oneInchData._sellAmt); | ||||
|         } | ||||
| 
 | ||||
|         require(checkOneInchSig(oneInchData.callData), "Not-swap-function"); | ||||
| 
 | ||||
|         oneInchData._buyAmt = oneInchSwap(oneInchData, ethAmt); | ||||
|         setUint(setId, oneInchData._buyAmt); | ||||
| 
 | ||||
|         return oneInchData; | ||||
| 
 | ||||
|         // emitLogSellThree(oneInchData, setId); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| abstract contract OneInch is OneInchResolverHelpers { | ||||
|     /** | ||||
|      * @dev Sell ETH/ERC20_Token using 1Inch. | ||||
|      * @notice Swap tokens from exchanges like kyber, 0x etc, with calculation done off-chain. | ||||
|      * @param buyAddr The address of the token to buy.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) | ||||
|      * @param sellAddr The address of the token to sell.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) | ||||
|      * @param sellAmt The amount of the token to sell. | ||||
|      * @param unitAmt The amount of buyAmt/sellAmt with slippage. | ||||
|      * @param callData Data from 1inch API. | ||||
|      * @param setId ID stores the amount of token brought. | ||||
|     */ | ||||
|     function sell( | ||||
|         address buyAddr, | ||||
|         address sellAddr, | ||||
|         uint sellAmt, | ||||
|         uint unitAmt, | ||||
|         bytes calldata callData, | ||||
|         uint setId | ||||
|     ) external payable returns (string memory _eventName, bytes memory _eventParam) { | ||||
|         OneInchData memory oneInchData = OneInchData({ | ||||
|             buyToken: TokenInterface(buyAddr), | ||||
|             sellToken: TokenInterface(sellAddr), | ||||
|             unitAmt: unitAmt, | ||||
|             callData: callData, | ||||
|             _sellAmt: sellAmt, | ||||
|             _buyAmt: 0 | ||||
|         }); | ||||
| 
 | ||||
|         oneInchData = _sell(oneInchData, setId); | ||||
| 
 | ||||
|         _eventName = "LogSell(address,address,uint256,uint256,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(buyAddr, sellAddr, oneInchData._buyAmt, oneInchData._sellAmt, 0, setId); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| contract ConnectV2OneInchPolygon is OneInch { | ||||
|     string public name = "1Inch-v1"; | ||||
| } | ||||
|  | @ -25,6 +25,7 @@ | |||
|     "INST-A": "0x52C2C4a0db049255fF345EB9D3Fb1f555b7a924A" | ||||
|   }, | ||||
|   "137" : { | ||||
|     "1INCH-A": "0xC0d9210496afE9763F5d8cEb8deFfBa817232A9e", | ||||
|     "AAVE-V2-A": "0xE84d8010Afc3663919F44685cB53ED88866da3eE", | ||||
|     "AUTHORITY-A": "0xf73C94402BC24148b744083eD02654EEc2C37D5B", | ||||
|     "BASIC-A": "0x1cAF5EC802ca602E98139AD96A8f2B7BC524264E", | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ | |||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@nomiclabs/hardhat-ethers": "^2.0.2", | ||||
|     "@nomiclabs/hardhat-etherscan": "^2.1.2", | ||||
|     "@nomiclabs/hardhat-etherscan": "^2.1.3", | ||||
|     "@nomiclabs/hardhat-waffle": "^2.0.1", | ||||
|     "@nomiclabs/hardhat-web3": "^2.0.0", | ||||
|     "@openzeppelin/test-helpers": "^0.5.6", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Thrilok kumar
						Thrilok kumar