swap-mainnet,avalanche

This commit is contained in:
Richa-iitr 2022-06-05 00:34:58 +05:30
parent 550f88ed6c
commit 8e89d66521
8 changed files with 396 additions and 0 deletions
contracts
avalanche
mainnet

View File

@ -21,3 +21,7 @@ interface AccountInterface {
function disable(address) external;
function isAuth(address) external view returns (bool);
}
interface InstaConnectors {
function connectors(string memory) external returns (address);
}

View File

@ -0,0 +1,14 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
contract Events {
event LogSwap(
string _connector,
address indexed buyToken,
address indexed sellToken,
uint256 buyAmt,
uint256 sellAmt,
uint256 getId,
uint256 setId
);
}

View File

@ -0,0 +1,102 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma abicoder v2;
import { InstaConnectors } from "../../common/interfaces.sol";
abstract contract Helper {
/**
* @dev Instadapp Connectors Registry
*/
InstaConnectors internal constant instaConnectors =
InstaConnectors(0x127d8cD0E2b2E0366D522DeA53A787bfE9002C14);
struct InputData {
address buyAddr;
address sellAddr;
uint256 sellAmt;
uint256[] unitAmts;
bytes[] callDatas;
uint256 setId;
}
}
contract SwapHelpers is Helper {
/**
*@dev Swap using the dex aggregators.
*@param _connectors name of the connectors in preference order.
*@param _inputData data for the swap cast.
*/
function _swap(string[] memory _connectors, InputData memory _inputData)
internal
returns (
bool success,
bytes memory returnData,
string memory _connector
)
{
require(_connectors.length > 0, "zero-length-not-allowed");
require(
_inputData.unitAmts.length == _connectors.length,
"unitAmts-length-invalid"
);
require(
_inputData.callDatas.length == _connectors.length,
"callDatas-length-invalid"
);
// require _connectors[i] == "1INCH-A" || "ZEROX-A" || "PARASWAP-A" || similar connectors
for (uint256 i = 0; i < _connectors.length; i++) {
bytes4 swapData = bytes4(
keccak256("swap(address,address,uint256,uint256,bytes,uint256)")
);
string memory _1INCH = "1INCH-A";
if (keccak256(bytes(_connectors[i])) == keccak256(bytes(_1INCH))) {
swapData = bytes4(
keccak256(
"sell(address,address,uint256,uint256,bytes,uint256)"
)
);
}
bytes memory _data = abi.encodeWithSelector(
swapData,
_inputData.buyAddr,
_inputData.sellAddr,
_inputData.sellAmt,
_inputData.unitAmts[i],
_inputData.callDatas[i],
_inputData.setId
);
(success, returnData) = instaConnectors
.connectors(_connectors[i])
.delegatecall(_data);
if (success) {
_connector = _connectors[i];
break;
}
}
}
function decodeEvents(string memory _connector, bytes memory returnData)
internal
view
returns (uint256 _buyAmt, uint256 _sellAmt)
{
(, bytes memory _eventParam) = abi.decode(returnData, (string, bytes));
if (keccak256(bytes(_connector)) == keccak256(bytes("PARASWAP-A"))) {
(, , _buyAmt, _sellAmt, ) = abi.decode(
_eventParam,
(address, address, uint256, uint256, uint256)
);
} else {
(, , _buyAmt, _sellAmt, , ) = abi.decode(
_eventParam,
(address, address, uint256, uint256, uint256, uint256)
);
}
}
}

View File

@ -0,0 +1,78 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
/**
* @title Swap.
* @dev Swap integration for DEX Aggregators.
*/
// import files
import { SwapHelpers } from "./helpers.sol";
import { Events } from "./events.sol";
abstract contract Swap is SwapHelpers, Events {
/**
* @dev Swap ETH/ERC20_Token using dex aggregators.
* @notice Swap tokens from exchanges like 1INCH, 0x etc, with calculation done off-chain.
* @param _connectors The name of the connectors like 1INCH-A, 0x etc, in order of their priority.
* @param buyAddr The address of the token to buy.(For MATIC: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param sellAddr The address of the token to sell.(For MATIC: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param sellAmt The amount of the token to sell.
* @param unitAmts The amount of buyAmt/sellAmt with slippage for respective DEXs.
* @param callDatas Data from APIs for respective DEXs.
* @param setId ID stores the amount of token brought.
*/
function swap(
string[] memory _connectors,
address buyAddr,
address sellAddr,
uint256 sellAmt,
uint256[] memory unitAmts,
bytes[] calldata callDatas,
uint256 setId
)
external
payable
returns (string memory _eventName, bytes memory _eventParam)
{
InputData memory inputData = InputData({
buyAddr: buyAddr,
sellAddr: sellAddr,
sellAmt: sellAmt,
unitAmts: unitAmts,
callDatas: callDatas,
setId: setId
});
(
bool success,
bytes memory returnData,
string memory _connector
) = _swap(_connectors, inputData);
uint256 _buyAmt;
uint256 _sellAmt;
if (!success) {
revert("swap-failed");
} else {
(_buyAmt, _sellAmt) = decodeEvents(_connector, returnData);
}
_eventName = "LogSwap(string,address,address,uint256,uint256,uint256,uint256)";
_eventParam = abi.encode(
_connector,
buyAddr,
sellAddr,
_buyAmt,
_sellAmt,
0,
setId
);
}
}
contract ConnectV2SwapAvalanche is Swap {
string public name = "Swap-v1";
}

View File

@ -27,3 +27,7 @@ interface AccountInterface {
function disable(address) external;
function isAuth(address) external view returns (bool);
}
interface InstaConnectors {
function connectors(string memory) external returns (address);
}

View File

@ -0,0 +1,14 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
contract Events {
event LogSwap(
string _connector,
address indexed buyToken,
address indexed sellToken,
uint256 buyAmt,
uint256 sellAmt,
uint256 getId,
uint256 setId
);
}

View File

@ -0,0 +1,102 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma abicoder v2;
import { InstaConnectors } from "../../common/interfaces.sol";
abstract contract Helper {
/**
* @dev Instadapp Connectors Registry
*/
InstaConnectors internal constant instaConnectors =
InstaConnectors(0x97b0B3A8bDeFE8cB9563a3c610019Ad10DB8aD11);
struct InputData {
address buyAddr;
address sellAddr;
uint256 sellAmt;
uint256[] unitAmts;
bytes[] callDatas;
uint256 setId;
}
}
contract SwapHelpers is Helper {
/**
*@dev Swap using the dex aggregators.
*@param _connectors name of the connectors in preference order.
*@param _inputData data for the swap cast.
*/
function _swap(string[] memory _connectors, InputData memory _inputData)
internal
returns (
bool success,
bytes memory returnData,
string memory _connector
)
{
require(_connectors.length > 0, "zero-length-not-allowed");
require(
_inputData.unitAmts.length == _connectors.length,
"unitAmts-length-invalid"
);
require(
_inputData.callDatas.length == _connectors.length,
"callDatas-length-invalid"
);
// require _connectors[i] == "1INCH-A" || "ZEROX-A" || "PARASWAP-A" || similar connectors
for (uint256 i = 0; i < _connectors.length; i++) {
bytes4 swapData = bytes4(
keccak256("swap(address,address,uint256,uint256,bytes,uint256)")
);
string memory _1INCH = "1INCH-A";
if (keccak256(bytes(_connectors[i])) == keccak256(bytes(_1INCH))) {
swapData = bytes4(
keccak256(
"sell(address,address,uint256,uint256,bytes,uint256)"
)
);
}
bytes memory _data = abi.encodeWithSelector(
swapData,
_inputData.buyAddr,
_inputData.sellAddr,
_inputData.sellAmt,
_inputData.unitAmts[i],
_inputData.callDatas[i],
_inputData.setId
);
(success, returnData) = instaConnectors
.connectors(_connectors[i])
.delegatecall(_data);
if (success) {
_connector = _connectors[i];
break;
}
}
}
function decodeEvents(string memory _connector, bytes memory returnData)
internal
view
returns (uint256 _buyAmt, uint256 _sellAmt)
{
(, bytes memory _eventParam) = abi.decode(returnData, (string, bytes));
if (keccak256(bytes(_connector)) == keccak256(bytes("PARASWAP-A"))) {
(, , _buyAmt, _sellAmt, ) = abi.decode(
_eventParam,
(address, address, uint256, uint256, uint256)
);
} else {
(, , _buyAmt, _sellAmt, , ) = abi.decode(
_eventParam,
(address, address, uint256, uint256, uint256, uint256)
);
}
}
}

View File

@ -0,0 +1,78 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
/**
* @title Swap.
* @dev Swap integration for DEX Aggregators.
*/
// import files
import { SwapHelpers } from "./helpers.sol";
import { Events } from "./events.sol";
abstract contract Swap is SwapHelpers, Events {
/**
* @dev Swap ETH/ERC20_Token using dex aggregators.
* @notice Swap tokens from exchanges like 1INCH, 0x etc, with calculation done off-chain.
* @param _connectors The name of the connectors like 1INCH-A, 0x etc, in order of their priority.
* @param buyAddr The address of the token to buy.(For MATIC: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param sellAddr The address of the token to sell.(For MATIC: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
* @param sellAmt The amount of the token to sell.
* @param unitAmts The amount of buyAmt/sellAmt with slippage for respective DEXs.
* @param callDatas Data from APIs for respective DEXs.
* @param setId ID stores the amount of token brought.
*/
function swap(
string[] memory _connectors,
address buyAddr,
address sellAddr,
uint256 sellAmt,
uint256[] memory unitAmts,
bytes[] calldata callDatas,
uint256 setId
)
external
payable
returns (string memory _eventName, bytes memory _eventParam)
{
InputData memory inputData = InputData({
buyAddr: buyAddr,
sellAddr: sellAddr,
sellAmt: sellAmt,
unitAmts: unitAmts,
callDatas: callDatas,
setId: setId
});
(
bool success,
bytes memory returnData,
string memory _connector
) = _swap(_connectors, inputData);
uint256 _buyAmt;
uint256 _sellAmt;
if (!success) {
revert("swap-failed");
} else {
(_buyAmt, _sellAmt) = decodeEvents(_connector, returnData);
}
_eventName = "LogSwap(string,address,address,uint256,uint256,uint256,uint256)";
_eventParam = abi.encode(
_connector,
buyAddr,
sellAddr,
_buyAmt,
_sellAmt,
0,
setId
);
}
}
contract ConnectV2Swap is Swap {
string public name = "Swap-v1";
}